如何向 TerminalNode 添加属性

How to add an attribute to a TerminalNode

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

在这一点上,我希望能够根据 * 的存在来识别类型是否为指针。我尝试使用 locals@parser@lexer,但其中 none 允许我做一些事情 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()

谢谢

为什么不这样做:

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

type
 : TYPE STAR?
 ;

TYPE
 : 'int' NUMBER
 ;

STAR
 : '*'
 ;

在您的 visitOperation() 中,您可以执行以下操作:

boolean isAPointer = ctx.type().STAR() != null;