Antlr4 如何避免引号规则之间的语法错误?
Antlr4 how to avoid syntax errors with anything between quotes rule?
我正在尝试构建自己的 dsl,以便创建自定义规则来匹配给定的 json 对象。
为此,到目前为止我已经创建了两种具有以下语法的规则:
grammar RuleGrammar;
def: 'Def(' jsonrule ')';
jsonrule: regex|composite;
regex: '"' code '"';
composite: '[' jsonrule ('&&'jsonrule)* ']';
code: ANY+;
ANY: ( '\"' | .);
WS: [ \t\r\n]+ -> skip();
当正则表达式的 "code" 包含字符“[”或“]”时,此语法失败并出现语法错误,例如:
Def("[a-zA-Z0-9]+")
line 1:5 extraneous input '[' expecting ANY
我看到这与复合规则的定义有关,其中包含“]”。
有没有办法在不转义代码中的括号的情况下避免语法错误?
regex
和 code
应该是词法分析器规则。此外,code
是贪心的,因此它可能会消耗太多输入。
改写 REGEX
规则:
REGEX: '"' ('\' ["\] | ~["\\r\n])* '"';
如果您想要得到错误的解释,那是因为 [
字符是一个隐式定义的标记,正如您在 composite
规则中使用的那样。由于词法分析器优先级规则,它不会被识别为 ANY
。
我正在尝试构建自己的 dsl,以便创建自定义规则来匹配给定的 json 对象。
为此,到目前为止我已经创建了两种具有以下语法的规则:
grammar RuleGrammar;
def: 'Def(' jsonrule ')';
jsonrule: regex|composite;
regex: '"' code '"';
composite: '[' jsonrule ('&&'jsonrule)* ']';
code: ANY+;
ANY: ( '\"' | .);
WS: [ \t\r\n]+ -> skip();
当正则表达式的 "code" 包含字符“[”或“]”时,此语法失败并出现语法错误,例如:
Def("[a-zA-Z0-9]+")
line 1:5 extraneous input '[' expecting ANY
我看到这与复合规则的定义有关,其中包含“]”。
有没有办法在不转义代码中的括号的情况下避免语法错误?
regex
和 code
应该是词法分析器规则。此外,code
是贪心的,因此它可能会消耗太多输入。
改写 REGEX
规则:
REGEX: '"' ('\' ["\] | ~["\\r\n])* '"';
如果您想要得到错误的解释,那是因为 [
字符是一个隐式定义的标记,正如您在 composite
规则中使用的那样。由于词法分析器优先级规则,它不会被识别为 ANY
。