数字

时间:2017-09-25 11:04:44

标签: java parsing antlr antlr4

我在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+);

我知道必须有一个明显的解决方案,但我一直试图找到一个,而我似乎无法找到方法。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

由于前两个词法分析器规则不是fragment s,如果输入只包含数字,它们可以(并且将会)匹配,或者~[;\r\n"'](因为如果可以匹配相同长度的输入序列) ,第一个词法分析者获胜)。

事实上,STRING_CHAR可以匹配NEW_STRING可以匹配的任何内容,因此后者永远不会被使用。

你需要:

  • 确保STRING_CHAR与数字
  • 不匹配
  • 制作NEW_DIGITSTRING_CHAR片段
  • 检查星号 - 几乎所有东西都可以在你的词法分子中重复,一开始看起来没有意义(但你需要根据你不知道的要求进行调整)

像这样:

fragment NEW_DIGIT: [0-9];
fragment STRING_CHAR : ~[;\r\n"'0-9];
NEW_STRING: (NEW_DIGIT+ | STRING_CHAR+ (NEW_DIGIT+)?);