You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TypePal编写规则限制PropertyType不可重复?

用TypePal实现PropertyType唯一约束的语义检查规则

需求说明

需要编写TypePal规则,强制每个Property下的PropertyType(包括ColumnName、ColumnOrder、ColumnType)最多使用一次,重复配置时标记为语义错误(例如示例中重复的.ColumnType(...)需要被检测出来)。

模型代码

Property(b => b.name)
      .ColumnOrder(3)
      .ColumnName("Name")
      .ColumnType(varchar(45))
      .ColumnType(date)
;

syntax Property
  = property: "Property" "(" Expr e ")" PropertyType*
;

syntax PropertyType
  = columnName: "." "ColumnName" "(" Expr e ")"
  | columnOrder: "." "ColumnOrder" "(" Expr e ")"
  | columnType: "." "ColumnType" "(" ColumnType c ")"
;

syntax ColumnType
  = intColumn: "int" 
  | varcharColumn: "varchar" "(" Expr e ")"
  | dateColumn: "date" 
;

TypePal规则实现

rule checkUniquePropertyTypes {
    forall Property p {
        list[str] usedTypes = [];
        for (PropertyType pt in p.PropertyType*) {
            str typeLabel = switch pt {
                case columnName: "ColumnName"
                case columnOrder: "ColumnOrder"
                case columnType: "ColumnType"
            };
            if (typeLabel in usedTypes) {
                report error "重复的Property配置:'" + typeLabel + "' 只能使用一次" at pt;
            } else {
                usedTypes.add(typeLabel);
            }
        }
    }
}

规则说明

  1. 遍历目标节点:规则会扫描所有Property语法节点
  2. 类型标识收集:对每个Property下的PropertyType子节点,通过switch判断其具体类型,生成对应的类型标签(如"ColumnType")
  3. 重复检测:维护一个列表记录已出现的类型标签,若当前标签已存在,就在该PropertyType节点位置报告错误
  4. 错误提示:错误信息会明确指出重复的配置类型,帮助定位问题

配置该规则后,示例中第二次调用.ColumnType(date)的位置会被标记为语义错误,符合需求。

内容的提问来源于stack exchange,提问作者Benni Katchy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:17:08