Antlr4解析问题

Antlr4 parsing issue

当我尝试通过 antlr-4.7.1-complete 使用 Zmes.g4 语法文件处理我的 message.expr 文件时,只有第一行有效,第二行没有反应。语法是

grammar Zmes;
prog    :   stat+;
stat    :  (message|define);
message :  'MSG'     MSGNUM    TEXT; 
define  :  'DEF:'  ('String '|'int ')  ID ( ','  ('String '|'Int ')  ID)* ';';
fragment QUOTE      :   '\'';
MSGNUM              :   [0-9]+; 
TEXT                :   QUOTE ~[']* QUOTE;
MODULE              :   [A-Z][A-Z][A-Z] ;
ID                  :   [A-Z]([A-Za-z0-9_])*;
SKIPS               :   (' '|'\t'|'\r'?'\n'|'\r')+ -> skip;

并且 message.expr 是

MSG 100  'MESSAGE YU';
DEF: String Svar1,Int Intv1;`

当我 运行 这样

在 cmd 上
grun Zmes prog -tree message.expr

(prog (stat (message MSG 100 'MESSAGE YU'))) and there is no second reaction. Why can it be.

你的 message 应该在末尾包含 ';':

message :  'MSG'     MSGNUM    TEXT ';';

此外,在您的 define 规则中您有 'int ',它可能应该是 'Int'(没有 space 和大写 i)。

我会选择这样的东西:

grammar Zmes;

prog    : stat+ EOF;
stat    : (message | define) SCOL;
message : MSG MSGNUM TEXT;
define  : DEF COL type ID (COMMA type ID)*;
type    : STRING | INT;

MSG    : 'MSG';
DEF    : 'DEF';
STRING : 'String';
INT    : 'Int';
COL    : ':';
SCOL   : ';';
COMMA  : ',';
MSGNUM : [0-9]+;
TEXT   : '\'' ~[']* '\'';
MODULE : [A-Z] [A-Z] [A-Z] ;
ID     : [A-Z] [A-Za-z0-9_]*;
SKIPS  : (' '|'\t'|'\r'?'\n'|'\r')+ -> skip;

产生:

如果要解析整个输入,还应该添加 EOF,例如

prog    :   stat+ EOF;

查看here原因。