Antlr4解析问题

时间:2018-01-31 07:30:21

标签: parsing compiler-construction antlr4 lexer

当我尝试通过antlr-4.7.1完成带有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(消息MSG 100'MESSAGE YU')))   而且没有第二反应。为什么会这样。

2 个答案:

答案 0 :(得分:1)

您的message最后应包含';'

message :  'MSG'     MSGNUM    TEXT ';';

此外,在您的define规则中,您有'int ',其中'Int'可能是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; )。

我会选择这样的事情:

Node1

产生:

enter image description here

答案 1 :(得分:1)

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

prog    :   stat+ EOF;

请参阅here原因。