Come posso generare un AST dal codice java src usando ANTLR?
qualche aiuto?Generazione di un abstract syntax tree per il codice sorgente java usando ANTLR
risposta
I setps per generare java src AST utilizzando antlr4 sono:
- Installare antlr4 puoi usare il link this per farlo.
- Dopo l'installazione, scaricare JAVA grammar from here.
Ora generare Java8Lexer e Java8Parser utilizzando il comando:
antlr4 -visitor Java8.g4
Questo genererà diversi file, come
Java8BaseListener.java
Java8BaseVisitor.java
Java8Lexer.java
Java8Lexer.tokens
Java8Listener.java
Java8Parser.java
Java8.tokens
Java8Visitor.java
Utilizzare questo codice per generare 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));
}
}
}
}
Dopo aver finito di codifica è possibile utilizzare Gradle per costruire il vostro progetto o è possibile scaricare antlr-4.7.1-complete.jar nella directory del progetto e avviare la compilazione.
Se si desidera un l'output in un file DOT in modo che u può visualizzare l'AST allora si può fare riferimento a this QnA posta o fare riferimento direttamente a questo repository in cui ho usato Gradle per generare il progetto.
Spero che questo aiuti. :)
OK, qui sono i passi:
- vai alla ANTLR Site e scaricare l'ultima versione ora è 4.7
- Scarica i ei file
Java.g
JavaTreeParser.g
da here. Eseguire i seguenti comandi:
java -jar antlrTool Java.g java -jar antlrTool JavaTreeParser.g
5 file verranno generati:
- Java.tokens
- JavaLexer.java
- JavaParser.java
- JavaTreeParser.g
- JavaTreeParser.tokens
uso di questo codice java per generare la Syntax Tree astratta e stamparlo:
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);
}
}
}
Grazie @Aboelnour. Ma la pagina su cui stai reindirizzando non esiste più. qualsiasi aiuto? –
Un'altra domanda, se JavaTreeParser.java non è tra i file generati, da dove proviene? –
@MakanTayebi Penso che questo possa aiutare: https://github.com/antlr/grammars-v4 – ConductedClever
- 1. Come progettare parti di un Abstract Syntax Tree?
- 2. Rappresenta un pass multiplo Abstract Syntax Tree (AST) in C++?
- 3. Utilizzo dell'API Abstract Syntax Tree di CDT per generare/scrivere codice C?
- 4. Clang: Che aspetto ha AST (abstract syntax tree)?
- 5. Come scrivere il pattern Visitor per un Abstract Syntax Tree in C#?
- 6. Generazione codice sorgente Java Maven per Hibernate
- 7. TypeScript: get syntax tree
- 8. Come generare AST dal codice sorgente Java?
- 9. Come accedere all'AST (abstract syntax tree) per una stored procedure PL/SQL?
- 10. La generazione del codice C++ in ANTLR 3.2 è pronta?
- 11. Come posso usare java Eclipse Abstract Syntax Tree in un progetto all'esterno di Eclipse? (cioè non un plug-in di eclissi)
- 12. Sorgente Java Parse con Scala
- 13. Java abstract/extends issue
- 14. Utilizzo di ANTLR per analizzare e modificare il codice sorgente; sto sbagliando?
- 15. Come generare un file XMI per il codice sorgente java?
- 16. Generazione documentazione codice sorgente XMLDoc Delphi
- 17. Generazione codice Java
- 18. Genera il codice Scala da Antlr
- 19. Java - Process.destroy() codice sorgente per Linux
- 20. Ottenere il codice sorgente di un iframe
- 21. Codice Java: ricerca del codice sorgente
- 22. Dove posso trovare il codice sorgente per gli array Java?
- 23. Traduzione di codice PL/SQL in Java usando Antlr 4 e stringtemplate 4
- 24. Eclipse: è possibile modificare il codice sorgente Java conosciuto tramite il codice sorgente "allegato"
- 25. Codice byte al codice sorgente Java
- 26. appengine server di sviluppo Java che visualizza il codice sorgente
- 27. java applet usando il plug-in di prossima generazione
- 28. generici Java emissione Abstract Factory
- 29. Generazione jar sorgente e Javadoc
- 30. Generazione di alberi di analisi del codice java e valutazione per test
Troppo largo. Inizia con il tutorial ANTLR o cercando le grammatiche esistenti. – millimoose
Ottieni una grammatica Java.Esegui il codice sorgente Java attraverso le classi generate da ANTLR. Potrebbe essere più facile usare la roba di Eclipse, comunque. –
puoi postare qualsiasi link o tutorial utile? Grazie – Aboelnour