#antlr najlepsze najnowsze

DaxterPoker 2017-08-22 21:51:00 +3
Mam problem z ANTLRv4 otóż, potrzebuje posortować alfabetycznie nody w drzewie które zwraca mi ANTLR.

Klasa z implementacją ANTLR: https://pastebin.com/WqyPWg8c

Przykładowe drzewo które chciał bym posortować : http://imgur.com/a/tufRL

ANTLR'a mam już dość dlatego chciałem otrzymane drzewo przenieść na własną strukturę drzewa, gdzie będe mógł sobie implementować własne metody a w trakcie przenoszenia układać nody alfabetycznie. Mój zamysł : zczytywać pokolei dzieci drzewa ANTLR i zapisywać je w ArrayList, posortować listę i kolejno od góry dodawać dzieci do nowego drzewa.
Niestety nie wiem jak pobrać token dziecka, metody getChild(), getChild.toString() zwracają mi po kilka tokenów które nic mi nie mówią albo całe drzewo w formie Stringa ( które niestety za dużo mi nie daje i jest za duże żeby pobierać je przy każdym dziecku... ). Bardzo proszę o pomoc jak wyciągnąć poszczególne elementy z drzewa, bądź jak posortować takie drzewo, bo niestety nie wiem gdzie już się zwrócić z tym problemem ....

#java #antlr #algorytmy #parser #programowanie
DaxterPoker 2017-05-15 15:51:34 +1
Hej,

Mógłby mi ktoś przełożyć kod z kotlinowej javy na taką bardziej podstawową ? bo nie rozumiem tego tutaj i nie wiem jak to zaimplementować w swoim projekcie...
http://blog.lantkowiak.pl/index.php/2017/04/12/tokenizacja-kodu-zrodlowego/
Mam te klasy Java8Lexer itd ale

override fun tokenize(lexerType: LexerType, input: String): List {
val lexer = LexerFactory().getLexer(lexerType, CharStreams.fromString(input))

return lexer.allTokens.map { t -> t.type }

tego nie rozumiem ... fun ? map ? t - > t.type ?

Aktualnie mam coś takiego
Java8Lexer lexer = new Java8Lexer(new ANTLRInputStream(code));
List extends Token tokenList = new ArrayList<>();
tokenList= lexer.getAllTokens();
for(Token token : tokenList){
System.out.println("Nastepny token :" + token + "\n");
}

Ale nie zwraca mi tego co on ma na przykładzie tylko

Nastepny token :[@-1,8:12='class',<9>,1:8]

Nastepny token :[@-1,14:23='HelloWorld',<102>,1:14]

Nastepny token :[@-1,25:25='{',<59>,1:25]

Nastepny token :[@-1,33:38='public',<35>,2:4]

Nastepny token :[@-1,40:45='static',<38>,2:11]

Nastepny token :[@-1,47:50='void',<48>,2:18]

Nastepny token :[@-1,52:55='main',<102>,2:23]

Nastepny token :[@-1,56:56='(',<57>,2:27]

Nastepny token :[@-1,57:62='String',<102>,2:28]

Nastepny token :[@-1,63:63='[',<61>,2:34]

Nastepny token :[@-1,64:64=']',<62>,2:35]

Nastepny token :[@-1,66:69='args',<102>,2:37]

Nastepny token :[@-1,70:70=')',<58>,2:41]

Nastepny token :[@-1,72:72='{',<59>,2:43]

Nastepny token :[@-1,83:88='System',<102>,3:7]

Nastepny token :[@-1,89:89='.',<65>,3:13]

Nastepny token :[@-1,90:92='out',<102>,3:14]

Nastepny token :[@-1,93:93='.',<65>,3:17]

Nastepny token :[@-1,94:100='println',<102>,3:18]

Nastepny token :[@-1,101:101='(',<57>,3:25]

Nastepny token :[@-1,102:115='"Hello, World"',<55>,3:26]

Nastepny token :[@-1,116:116=')',<58>,3:40]

Nastepny token :[@-1,117:117=';',<63>,3:41]

Nastepny token :[@-1,124:124='}',<60>,4:4]

Nastepny token :[@-1,128:128='}',<60>,5:1]

a chciał bym dostać tak jak on :
tring var; VARIABLE_DECLARATION
int i; VARIABLE_DECLARATION
i = 3; IDENTIFIER
ASSIGN
IDENTIFIER
if (i > 2) { IF_SWITCH_STATEMENT_BEGIN
OPEN_PARENTHESIS
IDENTIFIER
CONDITION
IDENTIFIER
CLOSE_PARENTHESIS
var = "more than 2"; IDENTIFIER
ASSIGN
STRING
} IF_SWITCH_STATEMENT_END
else { IF_SWITCH_STATEMENT_BEGIN
var = "less than 2"; IDENTIFIER
ASSIGN
STRING
} IF_SWITCH_STATEMENT_END

#programowanie #java #kotlin #antlr
GotoFinal 2017-05-15 16:44:18 +1
lexer.allTokens.map { t -> t.type }

no to dla każdego elementu wykonuje tę funkcje zapisując jej wynik, czyli nagle zamiast nap Collection, masz Collection

Tak samo jak w javie 8 masz Streamy i tam .map.