我在java中遇到antlr4语法问题。
我想有一个词法分析器值,它能够解析以下所有输入:
我的代码如下所示:
解析器规则:
new_string: NEW_STRING+;
lexer规则:
NEW_DIGIT: [0-9]+;
STRING_CHAR : ~[;\r\n"'];
NEW_STRING: (NEW_DIGIT+ | STRING_CHAR+ | STRING_CHAR+ NEW_DIGIT+);
我知道必须有一个明显的解决方案,但我一直试图找到一个,而我似乎无法找到方法。
提前谢谢!
答案 0 :(得分:0)
由于前两个词法分析器规则不是fragment
s,如果输入只包含数字,它们可以(并且将会)匹配,或者~[;\r\n"']
(因为如果可以匹配相同长度的输入序列) ,第一个词法分析者获胜)。
事实上,STRING_CHAR
可以匹配NEW_STRING
可以匹配的任何内容,因此后者永远不会被使用。
你需要:
STRING_CHAR
与数字NEW_DIGIT
和STRING_CHAR
片段像这样:
fragment NEW_DIGIT: [0-9];
fragment STRING_CHAR : ~[;\r\n"'0-9];
NEW_STRING: (NEW_DIGIT+ | STRING_CHAR+ (NEW_DIGIT+)?);