在使用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是否处理不正确的构造?
答案 0 :(得分:1)
Xtext生成Antlr 3.x语法,Antlr 4语法不兼容。
答案 1 :(得分:0)
似乎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移植PL/SQL语法 - > ANTLR 4.此外,与之前的版本相比,ANLTR 4具有更强大的解析算法。