Jak wygenerować AST z kodu svc java Użycie ANTLR?
jakiej pomocy?Generowanie abstrakcyjnego drzewa składni dla kodu źródłowego java za pomocą ANTLR
Odpowiedz
The setps wygenerować java src AST korzystając antlr4 są:
- Install antlr4 możesz użyć linku this, aby to zrobić.
- Po instalacji pobierz JAVA grammar from here.
teraz generować Java8Lexer i Java8Parser za pomocą polecenia:
antlr4 -visitor Java8.g4
To będzie generować kilka plików, takich jak
Java8BaseListener.java
Java8BaseVisitor.java
Java8Lexer.java
Java8Lexer.tokens
Java8Listener.java
Java8Parser.java
Java8.tokens
Java8Visitor.java
użyć tego kodu do wygenerowania AST:
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.RuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
public class ASTGenerator {
public static String readFile() throws IOException {
File file = new File("path/to/the/test/file.java");
byte[] encoded = Files.readAllBytes(file.toPath());
return new String(encoded, Charset.forName("UTF-8"));
}
public static void main(String args[]) throws IOException {
String inputString = readFile();
ANTLRInputStream input = new ANTLRInputStream(inputString);
Java8Lexer lexer = new Java8Lexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
Java8Parser parser = new Java8Parser(tokens);
ParserRuleContext ctx = parser.classDeclaration();
printAST(ctx, false, 0);
}
private static void printAST(RuleContext ctx, boolean verbose, int indentation) {
boolean toBeIgnored = !verbose && ctx.getChildCount() == 1 && ctx.getChild(0) instanceof ParserRuleContext;
if (!toBeIgnored) {
String ruleName = Java8Parser.ruleNames[ctx.getRuleIndex()];
for (int i = 0; i < indentation; i++) {
System.out.print(" ");
}
System.out.println(ruleName + " -> " + ctx.getText());
}
for (int i = 0; i < ctx.getChildCount(); i++) {
ParseTree element = ctx.getChild(i);
if (element instanceof RuleContext) {
printAST((RuleContext) element, verbose, indentation + (toBeIgnored ? 0 : 1));
}
}
}
}
Po zakończeniu kodowania można użyć Gradle budować swój projekt lub można pobrać antlr-4.7.1-complete.jar w katalogu projektu i rozpoczęcie kompilacji.
Jeśli chcesz wyjście w pliku DOT tak, że u można wizualizować AST to można odnieść do this QnA pocztą lub bezpośrednio odnoszą się do tego repository w którym użyłem Gradle do budowania projektu.
Mam nadzieję, że to pomoże. :)
OK, tutaj są kroki:
- przejść do ANTLR Site i pobrać najnowszą wersję teraz to 4,7
- Pobierz
Java.g
iJavaTreeParser.g
plików z here. Uruchom następujące polecenia:
java -jar antlrTool Java.g java -jar antlrTool JavaTreeParser.g
- zostanie wygenerowany
5 plików:
- Java.tokens
- JavaLexer.java
- JavaParser.java
- JavaTreeParser.g
- JavaTreeParser.tokens
użyć tego kodu Java, aby wygenerować Abstract Syntax drzewo i go wydrukować:
String input = "public class HelloWord {"+
"public void print(String r){" +
"for(int i = 0;true;i+=2)" +
"System.out.println(r);" +
"}" +
"}";
CharStream cs = new ANTLRStringStream(input);
JavaLexer jl = new JavaLexer(cs);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(jl);
JavaParser jp = new JavaParser(tokens);
RuleReturnScope result = jp.compilationUnit();
CommonTree t = (CommonTree) result.getTree();
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
nodes.setTokenStream(tokens);
JavaTreeParser walker = new JavaTreeParser(nodes);
System.out.println("\nWalk tree:\n");
printTree(t,0);
System.out.println(tokens.toString());
}
public static void printTree(CommonTree t, int indent) {
if (t != null) {
StringBuffer sb = new StringBuffer(indent);
for (int i = 0; i < indent; i++)
sb = sb.append(" ");
for (int i = 0; i < t.getChildCount(); i++) {
System.out.println(sb.toString() + t.getChild(i).toString());
printTree((CommonTree)t.getChild(i), indent+1);
}
}
}
Dzięki @Aboelnour. Ale strona, na którą się powołuje, już nie istnieje. jakaś pomoc? –
Kolejne pytanie, czy JavaTreeParser.java nie znajduje się wśród wygenerowanych plików, skąd się bierze? –
@MakanTayebi Myślę, że to pomogłoby: https://github.com/antlr/grammars-v4 – ConductedClever
- 1. Generowanie kodu Scala z Antlr
- 2. Zagnieżdżony analizator składni logicznej za pomocą ANTLR
- 3. Uzyskiwanie drzewa składni z kodu źródłowego w języku Poly/ML
- 4. Jak zmniejszyć drzewo składni do abstrakcyjnego drzewa składni?
- 5. podświetlanie składni kodu źródłowego dla trac?
- 6. Konwertowanie drzewa składni abstrakcyjnej na kod bajtu
- 7. Generowanie kodu za pomocą Scala
- 8. Generowanie kodu Pythona za pomocą pyside-uic
- 9. Generowanie wizualizację drzewa w java
- 10. Konwersja drzewa wyrażenie do kodu źródłowego ciąg
- 11. Generowanie dokumentacji kodu źródłowego XMLDoc Delphi
- 12. Formatowanie kodu źródłowego programowo za pomocą JDT
- 13. Generowanie kodu statycznego za pomocą LLVM API
- 14. Analizator składni SPARQL dla kodu Java
- 15. jak analizować łańcuchy do drzewa składni za pomocą GADTs
- 16. Jak skompilować Helloworld za pomocą kodu źródłowego Android
- 17. Jak wygenerować plik XMI dla kodu źródłowego java?
- 18. AppEngine serwera rozwoju java wyświetlania kodu źródłowego
- 19. parsowanie kodu źródłowego C++ w środowisku java
- 20. Uzyskiwanie kodu źródłowego strony za pomocą interfejsu UIWebView
- 21. Zaawansowane ponowne kodowanie kodu źródłowego (C++) za pomocą Visual Studio?
- 22. Sprawdzanie składni dla JavaScript za pomocą polecenia
- 23. Generowanie drzewa katalogów pseudolosowych?
- 24. Refaktoryzacja kodu java za pomocą skryptów
- 25. Wyszukiwanie kodu źródłowego dla wbudowanych funkcji Pythona?
- 26. Pobieranie kodu źródłowego Eclipse
- 27. Generowanie diagramów dla kodu Haskella
- 28. Narzędzie do przypisywania kodu źródłowego
- 29. Pobieranie kodu źródłowego Android
- 30. Generowanie kodu 128 kodów kreskowych za pomocą Excela VBA
Zbyt szeroki. Rozpocznij od samouczka ANTLR lub poszukaj istniejących gramatyk. – millimoose
Pobierz gramatykę Java.Uruchom źródło Java przez klasy generowane przez ANTLR. Jednak może być łatwiej używać rzeczy Eclipse. –
Czy możesz zamieścić dowolne przydatne linki lub samouczki? Dzięki – Aboelnour