i starting symbol table, still new facing errors given antlr in reference init_declarator rule. tips please
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;} );
the error has following rule:
init_declarator_list returns [symbol name] : init_declarator (comma init_declarator)*{$name = $init_declarator.name;} -> ^(init_declarator_list init_declarator+) ;
in action, $init_declarator.name
referring either first or second reference init_declarator
in rule. try labeling 1 want use. example, in following rule i've labeled both references x=
, action $x.name
refer whatever last init_declarator
was.
init_declarator_list returns [symbol name] : x=init_declarator (comma x=init_declarator)*{$name = $x.name;} -> ^(init_declarator_list init_declarator+) ;
Comments
Post a Comment