我在java中对antlr4语法有问题。
我想拥有一个能够解析以下所有输入的lexer值:
- 只有字母
- 字母和数字
- 只有数字
我的代码看起来像这样:
解析器规则:
new_string: NEW_STRING+;
Lexer规则:
NEW_DIGIT: [0-9]+;
STRING_CHAR : ~[;rn"'];
NEW_STRING: (NEW_DIGIT+ | STRING_CHAR+ | STRING_CHAR+ NEW_DIGIT+);
我知道必须有一个明显的解决方案,但是我一直在尝试找到一个解决方案,而且我似乎无法找到一种方法。
预先感谢您!
,由于前两个lexer规则不是 fragment
s,因此,如果输入仅包含数字或 ~[;rn"']
,则可以(并且将)匹配(如果输入的长序列可以匹配,则,第一个Lexer规则获胜)。
实际上,STRING_CHAR
可以匹配NEW_STRING
可以使用的任何东西,因此永远不会使用后者。
您需要:
- 确保
STRING_CHAR
与数字不匹配 - 使
NEW_DIGIT
和STRING_CHAR
片段 - 检查星号 - 几乎所有内容都可以在您的Lexer中重复,一开始就没有意义(但是您需要根据我们不知道的要求进行调整)
这样:
fragment NEW_DIGIT: [0-9];
fragment STRING_CHAR : ~[;rn"'0-9];
NEW_STRING: (NEW_DIGIT+ | STRING_CHAR+ (NEW_DIGIT+)?);