我正在研究具有operation : REGISTER '=' OPERATION TYPE OPERATOR ',' OPERATOR
之类规则的反语法。以这种方式定义类型TYPE : 'int' NUMBER '*'?
。现在,我已经创建了一个覆盖visitOperation
的基本访问者,并且一切正常。
此时,我希望能够根据*的存在来确定类型是否是指针。我尝试使用locals
,@parser
和@lexer
,但没有一个允许我执行ctx->TYPE()->isPointer()
。我注意到TYPE
是TerminalNode
,因此可能无法实现。
那么您有什么建议?只需创建一个本地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;