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原因。
当我尝试通过 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原因。