简单的 Xtext 示例生成了 Antlr4 不喜欢的语法——这该怪谁?

Simple Xtext example generates grammar that Antlr4 doesn't like - who's to blame?

在使用 XText 时,我遇到了一个问题,我不确定是 Antlr4 还是 XText 出了问题,或者我只是遗漏了什么。我知道 Xtext 不支持 Antlr4,但看起来这种特殊情况应该不会造成问题。

这是一个简单的 Xtext 文件:

grammar com.github.jsculley.antlr4.Test with org.eclipse.xtext.common.Terminals
generate test "http://www.github.com/jsculley/antlr4/test"
aRule:
    name=STRING
;

STRING 在来自 org.eclipse.xtext.common.Terminals:

的 XText 规则中定义
terminal STRING : 
            '"' ( '\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\' */ | !('\'|'"') )* '"' |
            "'" ( '\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\' */ | !('\'|"'") )* "'"
        ; 

生成的Antlr语法规则如下:

RULE_STRING : ('"' ('\' .|~(('\'|'"')))* '"'|'\'' ('\' .|~(('\'|'\'')))* '\'');

Antlr 3.5.2工具没有这个规则的问题,但是Antlr4工具吐出如下错误:

error(50): InternalTest.g:102:29: syntax error: '(' came as a complete surprise to me while looking for lexer rule element
error(50): InternalTest.g:102:62: syntax error: '(' came as a complete surprise to me while looking for lexer rule element
error(50): InternalTest.g:102:74: syntax error: mismatched input ')' expecting SEMI while matching a lexer rule
error(50): InternalTest.g:106:25: syntax error: '(' came as a complete surprise to me while looking for lexer rule element
error(50): InternalTest.g:106:36: syntax error: mismatched input ')' expecting SEMI while matching a lexer rule

Antlr4 不喜欢在每个“~”运算符之后围绕组的额外(并且看似不必要的)括号组。所以问题是,是 Xtext 生成了错误的语法,还是 Antlr4 没有处理有效的结构?

Xtext 生成 Antlr 3.x 语法,Antlr 4 语法不兼容。

看来 ANTLR 4 没有正确处理括号:Parser issues mutual left recursion error when the left-recursive part of a rule is in parenthesis.

因此,只需删除无用的括号,ANTLR 4 就会生成一个完全兼容 ANLTR 3 的解析器。我从 ANTLR 3 -> ANTLR 4 移植了 PL/SQL 语法。此外,与以前的版本相比,ANLTR 4 具有更强大的解析算法。