java - ANTLR语法中的无限递归

标签 java parsing recursion antlr

我写了一个简单的语法来识别一些表达式。 在这里,我发布了一个更简单的版本,我写它只是为了简化我的解释。这个更简单的版本可以识别如下表达式:

  1. 这是一段文字
  2. [n]这是另一篇文章[/n]
  3. [n][n]这是一个化合物 表达式[/n][/n]

我的问题是当我提交如下表达式时: [i]这应该只生成一个识别异常[/n]

抛出识别异常,但解析器进入无限递归,因为它匹配'[',但当它不匹配'i'时它会丢失自己。我认为这是因为我的语法文本组件不能包含方括号。所以,我要发布语法。

grammar ErrorTest;

expression
    :    rawText EOF
    |    command EOF
    ;

rawText
    :    word+
    ;

word
    :    ESPACE* TEXT ESPACE*
    ;

command 
    :    simpleCommand
    |    compoundCommand
    ;

simpleCommand
    :    HELP
    ;

compoundCommand
    :    rawText
    |    BEGIN compoundCommand END
    ;

HELP   : '[help]';

BEGIN  : '[n]';
END    : '[/n]';

ESPACE : ' ';
TEXT   : ~(' '|'['|']')*;

我该如何解决?

最佳答案

单词匹配空串因为在

word
    :    ESPACE* TEXT ESPACE*
    ;

TEXT 匹配导致的空字符串

rawText
    :    word+
    ;

无限循环

改变

TEXT   : ~(' '|'['|']')*;

TEXT   : ~(' '|'['|']')+;

这只会让你的语法变得模棱两可。

对此的思考方式是,rawText可以通过多种方式匹配空字符串

  1. 零个 TEXT token
  2. 一个长度为 0 的 TEXT token 。
  3. 两个长度为 0 的 TEXT 标记。
  4. 三个长度为 0 的 TEXT 标记。
  5. ...

当您遇到语法错误 ([i]) 时,就会出现这种情况,因为它会尝试每一种替代方案,看看是否有任何替代方案可以解决错误。


要摆脱任何二次行为,你真的应该让它完全明确。

rawText : ign (word (ign word)*)? ign;
ign     : ESPACE*;
word    : TEXT;

原始修复的问题是 rawText 可以通过多种方式匹配 "foo":

  1. TEXT("foo")
  2. TEXT("fo"), ESPACE(""), TEXT("o")
  3. TEXT("f"), ESPACE(""), TEXT("oo")
  4. TEXT("f"), ESPACE(""), TEXT("o"), ESPACE(""), TEXT("o")

关于java - ANTLR语法中的无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10325205/

相关文章:

java - 如何在 Hibernate 中内连接两个独立实体

java - Java中单个字符的反转

java - 将 string[] 转换为逗号分隔的字符串。

java - Intellij解析java代码

linux - 如何在 unix 中使用 less 命令在日志文件中搜索多个字符串?

python - 取决于一个参数的不确定循环次数

algorithm - 如何编写用于生成集合的所有子集的迭代算法?

javascript - JavaScript 中的尾递归优化

Java 哈希表,带有 while 循环

java - 使用 Hystrix 包装 SOAP 调用 (WebServiceGatewaySupport)