文本:分号验证

时间:2017-02-28 14:21:22

标签: validation syntax xtext

我有一个语法(类似于JSON)和这条指令:

List: 
'{' 
  (fields+=GenericField)* 
 '}';

GenericField:
fieldName=STRING ':' value = GenericTypes (semicolon?=';')? 
;

现在我正在编写一个自定义验证器来检查它是否在每行中都有分号,最后一行是例外,它不是强制性的。

我尝试了几种方法来实现这一目标,但我失败了。我需要建议如何解决这个问题。

3 个答案:

答案 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方法中执行。 通过这种方式,我实现了我的目标,快速修复只是一个班轮。