分析时出现antlr4语法错误

分析时出现antlr4语法错误,antlr,grammar,antlr4,Antlr,Grammar,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 : ~[

我的语法如下:

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 ...
输入程序,LT(1)=[
输入expr,LT(1)=[
消费[@0,0:0='[',1:0]规则表达式
输入type,LT(1)=TXT:看着我!
输入typeid,LT(1)=TXT:看着我!
第1行:1不匹配的输入“TXT:看着我!”应为{TXT',ENC',USR'}
……更多。。。


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

您必须了解,标记不是根据解析器试图匹配的内容创建的。lexer尝试匹配尽可能多的字符(独立于该解析器!):您的
文本
标记的定义应该不同

您可以将
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];

文本匹配太多。例如,它匹配“TXT”。请尝试使其更具体。@TheantlGuy,但我需要匹配“TXT”和“]”之间的任何文本“,我怎样才能使
Text
更具体一些呢?让
TXT
只捕获一个字符,并将其作为最后一条规则。这样它将不匹配标识符。在您以前使用
TXT
的地方,现在使用
TXT+
。请注意,它将不再匹配空格!编辑:@BartKiers已经提出了确切的建议。”那个