我正在启动我的符号表,它仍然是新的,但是面对antlr在引用我的init_declarator规则时给出的一些错误。有任何提示,请
declaration
: declaration_specifiers init_declarator_list? SEMICOLON! {currentScope.defineVariable($init_declarator_list.name,$declaration_specifier.type);}
;
declaration_specifiers returns [Symbol type]
: ( type_specifier{$type = $type_specifier.type;} |type_qualifier)+
;
init_declarator_list returns [Symbol name]
: init_declarator (COMMA init_declarator)*{$name = $init_declarator.name;} -> ^(INIT_DECLARATOR_LIST init_declarator+)
;
init_declarator returns [Symbol name]
: declarator (ASSIGN^ initializer)? {$name = $declarator.name;}
;
declarator returns [Symbol name]
: pointer? direct_declarator{$name = $direct_declarator.text;}
| pointer
;
direct_declarator returns [Symbol name]
: ( IDENTIFIER| LPAREN! declarator RPAREN! )
declarator_suffix* {$name = $IDENTIFIER.text;}
;
type_specifier returns [Symbol type] : (CONST^)? (VOID{return VoidType;} | CHAR {return CharType;}| INT{return IntType;} | FLOAT{return FloatType;} );
答案 0 :(得分:2)
错误与以下规则有关:
init_declarator_list returns [Symbol name]
: init_declarator (COMMA init_declarator)*{$name = $init_declarator.name;} -> ^(INIT_DECLARATOR_LIST init_declarator+)
;
在您的操作中,$init_declarator.name
可能是指规则中init_declarator
的第一个或第二个引用。尝试标记要使用的标记。例如,在以下规则中,我使用x=
标记了两个引用,因此操作$x.name
将引用上一个init_declarator
的内容。
init_declarator_list returns [Symbol name]
: x=init_declarator (COMMA x=init_declarator)*{$name = $x.name;} -> ^(INIT_DECLARATOR_LIST init_declarator+)
;