java - 带数字的antlr4语法字符串

标签 java parsing antlr antlr4

我在 java 中遇到 antlr4 语法问题。

我想要一个词法分析器值,它能够解析以下所有输入:

  • 仅限字母
  • 字母和数字
  • 仅限数字

我的代码如下所示:

解析器规则:

new_string: NEW_STRING+;

词法分析器规则:

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

我知道一定有一个明显的解决方案,但我一直在努力寻找一个解决方案,但我似乎找不到办法。

提前谢谢您!

最佳答案

由于前两个词法分析器规则不是片段,因此如果输入仅包含数字或~[;\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+)?);

关于java - 带数字的antlr4语法字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46403690/

相关文章:

java - 用Java绘制图表,定期更新

java - jSoup 获取 HTML 标签的值

java - HTTP 请求的正则表达式在某些情况下不起作用

c# - 我的 ANTLR 解析器(不是词法分析器)如何触发词法 "include"(不是 AST 拼接)?

java - 将 logcat 输出保存到字符串值

dd-MMM-yyyy 格式的 java.time.format.DateTimeParseException

c# - 防止引发异常

parsing - 如何根据输出消耗的数据量使该解析代码变得懒惰?

java - ANTLR - boolean 可满足性

java - ANTLR - NoViableAltException