Antlr4 为什么规则不是';与最大输入不匹配?

Antlr4 为什么规则不是';与最大输入不匹配?,antlr4,Antlr4,我的语法如下: myg : line+ EOF ; line : ( command params | for_loop ) NEWLINE; for_loop : 'for' WORD INT 'do' NEWLINE stmt_body; stmt_body: line+ 'end'; params : ( param | WHITESPACE)*; param :

我的语法如下:

myg                : line+ EOF ;

line                : ( command params | for_loop ) NEWLINE;

for_loop : 'for' WORD INT 'do'  NEWLINE stmt_body;

stmt_body: line+ 'end';

params              : ( param | WHITESPACE)*;

param                : WORD | INT;

command             : WORD;

fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment DIGIT : [0-9] ;

WORD                : (LOWERCASE | UPPERCASE | DIGIT | [_."'/\\-])+ (DIGIT)* ;
INT : DIGIT+ ;
WHITESPACE          : (' ' | '\t')+ ;
NEWLINE             : ('\r'? '\n' | '\r')+ ;
尝试以下操作时:

>java org.antlr.v4.gui.TestRig Myg myg -tokens
command with parameter for 90 seconds
^Z
[@0,0:6='command',<WORD>,1:0]
[@1,7:7=' ',<WHITESPACE>,1:7]
[@2,8:11='with',<WORD>,1:8]
[@3,12:12=' ',<WHITESPACE>,1:12]
[@4,13:21='parameter',<WORD>,1:13]
[@5,22:22=' ',<WHITESPACE>,1:22]
[@6,23:25='for',<'for'>,1:23]
[@7,26:26=' ',<WHITESPACE>,1:26]
[@8,27:28='90',<WORD>,1:27]
[@9,29:29=' ',<WHITESPACE>,1:29]
[@10,30:36='seconds',<WORD>,1:30]
[@11,37:38='\r\n',<NEWLINE>,1:37]
[@12,39:38='<EOF>',<EOF>,2:0]
line 1:23 missing NEWLINE at 'for'
line 1:26 extraneous input ' ' expecting WORD
line 1:29 mismatched input ' ' expecting {WORD, INT, WHITESPACE, NEWLINE}
>java org.antlr.v4.gui.TestRig Myg Myg-tokens
带参数的命令持续90秒
^Z
[@0,0:6='command',1:0]
[@1,7:7=' ',,1:7]
[@2,8:11='with',1:8]
[@3,12:12=' ',,1:12]
[@4,13:21='parameter',1:13]
[@5,22:22=' ',,1:22]
[@6,23:25='for',1:23]
[@7,26:26=' ',,1:26]
[@8,27:28='90',,1:27]
[@9,29:29=' ',,1:29]
[@10,30:36='seconds',1:30]
[@11,37:38='\r\n',1:37]
[@12,39:38='',,2:0]
第1行:23“for”处缺少换行符
第1行:26外部输入“”应为单词
第1行:29不匹配的输入“”,应为{WORD,INT,WHITESPACE,NEWLINE}
出于我不理解的原因,“For”与“For”匹配,我的期望是“command”规则应该匹配整个输入行,因为规则应该匹配最大的输入

或者换句话说,命令规则应该是贪婪的,并且匹配整行


同样,for_循环是一个解析器规则(以小写字母开头),那么为什么在生成令牌的过程中没有忽略它呢?

您的
命令
规则匹配一个
单词
令牌,所以问题变成了为什么
单词
与整行不匹配。答案是,
WORD
不匹配空格,所以它只能匹配第一个空格,而不能匹配整个规则。但是“for”也匹配到第一个空格,当两个规则产生相同长度的匹配时,文字优先

同样,for_循环是一个解析器规则(以小写字母开头),那么为什么在生成令牌的过程中没有忽略它呢


for\u loop
是一个解析器规则(在词法分析中确实会忽略它-在输出中不会看到任何
for\u loop
标记),但“for”不是。所有文字都是lexer规则(否则它们永远无法匹配)。

请显示lexer规则的定义。我想,
WORD
与整行不匹配的原因是它不能匹配(即整行不符合
WORD
的模式)。