我有一个语法(类似于JSON)和这条指令:
List:
'{'
(fields+=GenericField)*
'}';
GenericField:
fieldName=STRING ':' value = GenericTypes (semicolon?=';')?
;
现在我正在编写一个自定义验证器来检查它是否在每行中都有分号,最后一行是例外,它不是强制性的。
我尝试了几种方法来实现这一目标,但我失败了。我需要建议如何解决这个问题。
答案 0 :(得分:0)
我会将分号的处理移到List
规则,因为它更容易处理:
List:
'{'
( fields+=GenericField (';' fields+=GenericField)* ';'? )?
'}';
GenericField:
fieldName=STRING ':' value=GenericTypes
;
使用此语法,已在语法级别检查分号。 所以没有必要为此编写自定义验证器。
答案 1 :(得分:0)
更改语法以让解析器进行检查或提供如下检查:
@Check
def void checkList(List list) {
for (field : list.fields.take(list.fields.length - 1)) {
if (!field.semicolon) {
error("A semicolon is missing", field, null)
}
}
}
答案 2 :(得分:0)
感谢你的帮助,经过一些深夜的头脑风暴后,我结束了这个:
if (!field.semicolon) {
if ((field.eContainer as Table).fields.indexOf(field) != (field.eContainer as Table).fields.size)
error('Missing semicolon at end of line.',field,null)
}
它在Field的check方法中执行。 通过这种方式,我实现了我的目标,快速修复只是一个班轮。