ANTLR4 - 解析器的测试用例不工作
ANTLR4 - Parser's testcases are not working
我尝试为我的作业编写一些解析器规则。在作业中,我们需要用一些类型来完成 "variable declaration" 部分。我已经成功地尝试了所有类型。例如:
int i;
或:
boolean bc;
但它不适用于数组类型。例如:
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 类型工作我做错了什么吗?提前致谢!!
您的解决方案非常接近,但是将 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];
你得到这个词法分析器标记化:
[@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]
而这个解析树:
所以我认为你现在可以走了。
我尝试为我的作业编写一些解析器规则。在作业中,我们需要用一些类型来完成 "variable declaration" 部分。我已经成功地尝试了所有类型。例如:
int i;
或:
boolean bc;
但它不适用于数组类型。例如:
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 类型工作我做错了什么吗?提前致谢!!
您的解决方案非常接近,但是将 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];
你得到这个词法分析器标记化:
[@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]
而这个解析树:
所以我认为你现在可以走了。