使用 TypePal 编写语义检查

问题描述 投票:0回答:1

我正在尝试使用 TypePal 为我的模型编写语义检查。这是我的模型

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 编写规则来强制要求给定的 PropertyType 不能重复。我希望每个 PropertyType 最多使用一次。在上面的示例中,ColumnType 使用了两次,我希望将其标记为语义错误。

rascal
1个回答
0
投票

这就是我的想法。

 map[str, int] m = ();

    for (PropertyType pt <- p){
        switch(pt){
            case (PropertyType) `. ColumnType ( <ColumnType _>)` : {
              if ("ColumnType" notin m){
                 m = m + ("ColumnType" : 1);
              }
              else{
               c.report(error(p, "Duplicate occurrence of %v", "ColumnType"));
              }
            }
            case (PropertyType) `. ColumnName ( <Expr _>)` : {
               if ("ColumnName" notin m){
                 m = m + ("ColumnName" : 1);
               }
               else{
                 c.report(error(p, "Duplicate occurrence of %v", "ColumnName"));
              }
            }
            default : {
              if ("ColumnOrder" notin m){
                m = m + ("ColumnOrder" : 1);
              }
              else{
                c.report(error(p, "Duplicate occurrence of %v", "ColumnOrder"));
              }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.