2014-10-06 111 views
1

我有以下的语法:antlr4语法错误

grammar Token; 

prog: (expr NL?)+ EOF; 

expr: '[' type ']'; 

type : typeid ':' value; 

typeid : 'TXT' | 'ENC' | 'USR'; 

value: Text | INT; 

INT : '0' | [1-9] [0-9]*; 

//WS : [ \t]+; 
WS : [ \t\n\r]+ -> skip ; 
NL: '\r'? '\n'; 
Text : ~[\]\[\n\r"]+ ; 

,我需要解析的文字是这样的下面

[TXT:look at me!] 
[USR:19700] 
[TXT:, can I go there?] 
[ENC:124124] 
[TXT:this is needed for you to go...] 

我需要拆分这个文本,但我得到了一些当我运行错误grun.bat Token prog -gui -trace -diagnostics

enter prog, LT(1)=[ 
enter expr, LT(1)=[ 
consume [@0,0:0='[',<3>,1:0] rule expr 
enter type, LT(1)=TXT:look at me! 
enter typeid, LT(1)=TXT:look at me! 
line 1:1 mismatched input 'TXT:look at me!' expecting {'TXT', 'ENC', 'USR'} 
... much more ... 

enter image description here

我的语法有什么问题?请帮帮我!

+0

文本相匹配的方式太多了。例如,它匹配“TXT”。尝试使其更具体。 – 2014-10-06 16:51:40

+0

@TheANTLRGuy,但我需要匹配'TXT'和']'之间的任何文本,我怎样才能让'Text'更具体呢? – thiagoh 2014-10-06 16:54:39

+0

尝试〜']'也许? – 2014-10-06 18:02:55

回答

1

您必须明白,标记不是基于解析器试图匹配的内容创建的。词法分析器尝试匹配尽可能多的字符(独立于该分析器!):您的Text标记应该有不同的定义。

你可以让Text规则成为一个解析器规则代替,并搭配类似这样的单个字符标记:

grammar Token; 

prog : expr+ EOF; 
expr : '[' type ']'; 
type : typeid ':' value; 
typeid : 'TXT' | 'ENC' | 'USR'; 
value : text | INT; 
text : CHAR+; 

INT : '0' | [1-9] [0-9]*; 
WS : [ \t\n\r]+ -> skip ; 
CHAR : ~[\[\]\r\n];