Antler匹配类似的规则(但在不同的部分上失败)

时间:2015-03-09 19:39:48

标签: eclipse antlr rcp xtext

我正在创建一个Xtext插件,由于某种原因,以下行与StringStatement规则错误匹配,它应该与UnstringStatement规则匹配:

UNSTRING test2 DELIMITED BY " " INTO test2 END-UNSTRING

这是我的语法:

Program:
    (elements+=Elemental)*
    (s+=Statement)*
;

Variable_Name:  
    varName=ID ("-" ID)*
;

Variable_Reference: 
    varRef=ID ("-" ID)*
;

Elemental: 
    'VAR' var=Variable_Name
;

Statement:
    (us=UnstringStatement|s=StringStatement)
;

StringParam:
    Variable_Reference | STRING
;

StringStatement:
    'STRING' in=StringParam 'DELIMITED BY SIZE INTO' out=Variable_Reference 'END-STRING'   
;


UnstringStatement:
    'UNSTRING' in=StringParam 'DELIMITED BY' string2=STRING 'INTO' (outs+=Variable_Reference)* 'END-UNSTRING'
;

当我将项目作为Eclipse应用程序运行时,' UNSTRING'令牌突出显示(正确),但该行的其余部分有错误"不匹配的字符'''期待' S'。" ' S'该错误也指的是来自' SIZE'。

知道为什么两条规则会像这样重叠吗?

编辑,忘记了STRING规则:

terminal STRING : 
    '"' ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|'"') )* '"' |
    "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'"
; 

编辑2: 在单步执行一些Lexer代码之后,我发现了令牌" DELIMITED BY"未正确匹配" DELIMITED BY SIZE INTO",然后失败。

编辑3修复: 我解决了这个问题,但不知道为什么会这样。我刚刚添加了一个终端DELIMITED_BY:

terminal DELIMITED_BY: 'DELIMITED BY'

StringStatement:
    'STRING' in=StringParam DELIMITED_BY 'SIZE INTO' out=Variable_Reference 'END-STRING'   
;

UnstringStatement:
    'UNSTRING' in=StringParam DELIMITED_BY string2=STRING 'INTO' (outs+=Variable_Reference)* 'END-UNSTRING'
;

1 个答案:

答案 0 :(得分:0)

STRING Token看起来太贪心了。在ANTLR中,表达式应为

terminal STRING : 
'"' ( '\\' . | !('\\'|'"') )*? '"' |
"'" ( '\\' . | !('\\'|"'") )*? "'"
;