我正在尝试使用 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 使用了两次,我希望将其标记为语义错误。
这就是我的想法。
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"));
}
}
}
}