我尝试为我的作业编写一些解析器规则。在赋值中,我们需要对某些类型执行“变量声明”部分。我曾尝试过所有类型的成功。例如:
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类型工作。在此先感谢!!
答案 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]
这个解析树:
所以我认为你现在好了。