文本:分号验证

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

我有这个指令的语法(类似于JSON):

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

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

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

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

validation syntax xtext
3个回答
0
投票

我会将分号的处理移到List规则,因为它更容易处理:

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

GenericField:
  fieldName=STRING ':' value=GenericTypes    
;

使用此语法,已在语法级别检查分号。因此,无需为此编写自定义验证器。


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)
        }
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.