如何向终端节点添加属性

问题描述 投票:0回答:1

我正在研究具有operation : REGISTER '=' OPERATION TYPE OPERATOR ',' OPERATOR之类规则的反语法。以这种方式定义类型TYPE : 'int' NUMBER '*'?。现在,我已经创建了一个覆盖visitOperation的基本访问者,并且一切正常。

此时,我希望能够根据*的存在来确定类型是否是指针。我尝试使用locals@parser@lexer,但没有一个允许我执行ctx->TYPE()->isPointer()。我注意到TYPETerminalNode,因此可能无法实现。

那么您有什么建议?只需创建一个本地HashMap并在其中存储某种标识符?

编辑:

我简化了语法,以更好地描述我的用例。我希望能够解析以下指令:

r4 = add int32* a,b
r5 = add int8 c,d

我正在使用的语法是:

grammar G;      

prog:   (expr NEWLINE)+;

expr    : operation
    ;

operation   : REGISTER '=' 'add' TYPE WORD ',' WORD
        ;

REGISTER    :   'r' NUMBER
        ;

TYPE        : 'int' NUMBER '*'?
        ;

WORD        :   (LETTER)+
        ;

NEWLINE  : [\r\n]+ ;
WS: [ \t\n\r]+ -> skip ;
INT      : [0-9] ;

LETTER   : [a-z] ;

NUMBER  : (INT)+
    ;

似乎一切正常:

grun G expr -tokens main.txt
[@0,0:1='r4',<REGISTER>,1:0]
[@1,3:3='=',<'='>,1:3]
[@2,5:7='add',<'add'>,1:5]
[@3,9:14='int32*',<TYPE>,1:9]
[@4,16:16='a',<WORD>,1:16]
[@5,17:17=',',<','>,1:17]
[@6,18:18='b',<WORD>,1:18]
[@7,19:19='\n',<NEWLINE>,1:19]
[@8,20:21='r5',<REGISTER>,2:0]
[@9,23:23='=',<'='>,2:3]
[@10,25:27='add',<'add'>,2:5]
[@11,29:33='int8*',<TYPE>,2:9]
[@12,35:35='c',<WORD>,2:15]
[@13,36:36=',',<','>,2:16]
[@14,37:37='d',<WORD>,2:17]
[@15,38:38='\n',<NEWLINE>,2:18]
[@16,39:38='<EOF>',<EOF>,3:0]

不幸的是,现在我不知道该如何拥有ctx->TYPE()->isAPointer()

谢谢

antlr antlr4
1个回答
0
投票

为什么不做这样的事情:

operation
 : REGISTER '=' 'add' type WORD ',' WORD
 ;

type
 : TYPE STAR?
 ;

TYPE
 : 'int' NUMBER
 ;

STAR
 : '*'
 ;

然后在visitOperation()内部,您可以执行以下操作:

boolean isAPointer = ctx.type().STAR() != null;
© www.soinside.com 2019 - 2024. All rights reserved.