Оператор +=
создает List
из Token
с, а не только текст, соответствующий этим Token
с.Вам нужно будет инициализировать List
в блоке @init{...}
правила и самостоятельно добавить внутренний текст токенов.
Кроме того, вам не нужно делать это:
type_specifiers returns [String type_name]
: 'int' { $type_name = "int";}
| ...
;
просто получите доступ к атрибуту type_specifiers
text
из правила, в котором вы его используете, и удалите оператор returns
, например:
var_dec
: t=type_specifiers ... {System.out.println($t.text);}
;
type_specifiers
: 'int'
| ...
;
Попробуйте что-то вроде этого:
grammar T;
var_dec
: type dec_list? ';'
{
System.out.println("type = " + $type.text);
System.out.println("ids = " + $dec_list.ids);
}
;
type
: Int
| Float
;
dec_list returns [List ids]
@init{$ids = new ArrayList();}
: a=ID {$ids.add($a.text);} (',' b=ID {$ids.add($b.text);})*
;
Int : 'int';
Float : 'float';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
Space : ' ' {skip();};
, который выведет на консоль следующее:
type = int
ids = [a, b, foo]
Если вы запустите следующий класс:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("int a, b, foo;"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.var_dec();
}
}