Antlr4如何避免语法错误与引号规则之间的任何内容?

时间:2015-06-29 14:31:19

标签: regex antlr grammar antlr4

我正在尝试构建自己的dsl,以便创建自定义规则以匹配给定的json对象。

为此目的我到目前为止已经创建了两种具有以下语法的规则:

grammar RuleGrammar;

def: 'Def(' jsonrule ')';
jsonrule: regex|composite;
regex: '"' code '"';
composite: '[' jsonrule ('&&'jsonrule)* ']';
code: ANY+;

ANY: ( '\\"' | .);

WS: [ \t\r\n]+ -> skip();

当正则表达式的“代码”包含字符'['或']'时,此语法失败并出现语法错误,例如:

Def("[a-zA-Z0-9]+")
line 1:5 extraneous input '[' expecting ANY

我认为这与复合规则的定义有关,复合规则中包含']'。

有没有办法避免语法错误而不转义代码中的括号?

1 个答案:

答案 0 :(得分:1)

regexcode应该是词法规则。此外,code是贪婪的,所以它可能会消耗过多的输入。

改为编写REGEX规则:

REGEX: '"' ('\\' ["\\] | ~["\\\r\n])* '"';

如果您想要获得错误的解释,那是因为[字符是隐式定义的标记,就像您在composite规则中使用它一样。由于词法优先级规则,它不会被识别为ANY