我正在创建一个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'
;
答案 0 :(得分:0)
STRING Token看起来太贪心了。在ANTLR中,表达式应为
terminal STRING :
'"' ( '\\' . | !('\\'|'"') )*? '"' |
"'" ( '\\' . | !('\\'|"'") )*? "'"
;