Возвращаемый список в ANTLR для проверки типа, язык java
Я работаю над ANLTR для поддержки проверки типов. В какой-то момент я попал в беду. Я попытаюсь объяснить это на примере грамматики, предположим, что у меня есть следующее:
@members {
private java.util.HashMap<String, String> mapping = new java.util.HashMap<String, String>();
}
var_dec
: type_specifiers d=dec_list? SEMICOLON
{
mapping.put($d.ids.get(0).toString(), $type_specifiers.type_name);
System.out.println("identext = " + $d.ids.get(0).toString() + " - " + $type_specifiers.type_name);
};
type_specifiers returns [String type_name]
: 'int' { $type_name = "int";}
| 'float' {$type_name = "float"; }
;
dec_list returns [List ids]
: ( a += ID brackets*) (COMMA ( a += ID brackets* ) )*
{$ids = $a;}
;
brackets : LBRACKET (ICONST | ID) RBRACKET;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
LBRACKET : '[';
RBRACKET : ']';
В правиле dec_list
вы увидите, что я возвращаю список с идентификаторами. Однако в var_dec
, Когда я пытаюсь поместить первый элемент списка (я использую только get(0)
, чтобы увидеть возвращаемое значение из правила dec_list
, я могу повторить его позже, это не моя точка зрения) в отображение, я получаю целую строку, такую как
[@4,6:6='a',<17>,1:6]
Для вход
int a, b;
Я пытаюсь получить текст каждого идентификатора, в данном случае a
и b
в списке индексов 0 и 1 соответственно.
1 ответ:
Оператор
+=
создаетList
изToken
s, а не только текст, которому этиToken
s соответствуют. Вам нужно будет инициализироватьList
в блоке@init{...}
правила и добавить внутренний текст маркеров самостоятельно.Кроме того, вам не нужно этого делать:
type_specifiers returns [String type_name] : 'int' { $type_name = "int";} | ... ;
Просто откройте атрибут
type_specifiers
из правила, в котором вы его используете, и удалите оператор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(); } }