ANTLR4 - Parser的测试用例不起作用

时间:2017-09-07 12:59:07

标签: parsing computer-science antlr4 lexer

我尝试为我的作业编写一些解析器规则。在赋值中,我们需要对某些类型执行“变量声明”部分。我曾尝试过所有类型的成功。例如:

  

int i;

或:

  

boolean bc;

但它不适用于Array类型。例如:

  

int a [5];

这是我写的代码:

vardecl: pritype id (COMMA id)* SEMI ;
pritype: INTTYPE | BOOLEANTYPE | FLOATTYPE | STRINGTYPE ;
id: ID | ID LSB INTLIT RSB ;

INTTYPE: 'int' ;
BOOLEANTYPE: 'boolean' ;
FLOATTYPE: 'float' ;
STRINGTYPE: 'string' ;
ID: [_a-zA-Z] [_a-zA-Z0-9]* ;
INTLIT: [0-9]+ -> type(INTTYPE) ;
LSB: '[' ;
RSB: ']' ;
COMMA: ',' ;
SEMI: ';' ;

你能告诉我我做错了什么,以便Array类型工作。在此先感谢!!

1 个答案:

答案 0 :(得分:0)

您的解决方案非常接近,但将INTLIT引导到另一个频道会导致问题。我简化了一点,并为空白添加了处理。但是我添加了array规则,允许您在访问者或听众中更轻松地处理此构造:

grammar Vardecl;
vardecl: pritype id (COMMA id)* SEMI ;
pritype: INTTYPE | BOOLEANTYPE | FLOATTYPE | STRINGTYPE ;
id: ID | ID array ;
array : LSB INTLIT RSB;
INTTYPE: 'int' ;
BOOLEANTYPE: 'boolean' ;
FLOATTYPE: 'float' ;
STRINGTYPE: 'string' ;
ID: [_a-zA-Z] [_a-zA-Z0-9]* ;
INTLIT: [0-9]+ ;
LSB: '[' ;
RSB: ']' ;
COMMA: ',' ;
SEMI: ';' ;
WS: [ \t\r\n] -> skip;

使用此输入:

int i[5], a[10];

你得到这个lexer标记化:

[@0,0:2='int',<'int'>,1:0]
[@1,4:4='i',<ID>,1:4]
[@2,5:5='[',<'['>,1:5]
[@3,6:6='5',<INTLIT>,1:6]
[@4,7:7=']',<']'>,1:7]
[@5,8:8=',',<','>,1:8]
[@6,10:10='a',<ID>,1:10]
[@7,11:11='[',<'['>,1:11]
[@8,12:13='10',<INTLIT>,1:12]
[@9,14:14=']',<']'>,1:14]
[@10,15:15=';',<';'>,1:15]
[@11,16:15='<EOF>',<EOF>,1:16]

这个解析树:

enter image description here

所以我认为你现在好了。