ANTLR 4 et AST visiteurs
Je suis en train d'utiliser ASTs avec ANTLR4, avec ce fichiers:
Builder.java
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;
public class Builder
{
public static void main(String[] args)
{
CharStream input = new ANTLRInputStream("ON M1==2 && M3 == 5 && (M2 > 1 || M5 <= 5.0) "
+ "DO P5:42 P4:10");
ExprLexer lexer = new ExprLexer(input);
TokenStream tokens = new CommonTokenStream(lexer);
ExprParser parser = new ExprParser(tokens);
parser.addParseListener(new ExprTestListener());
ExprParser.ExpressionContext uu = parser.expression();
}
}
ExprTestListener:
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.antlr.v4.runtime.tree.ErrorNode;
public class ExprTestListener extends ExprBaseListener {
@Override public void enterExpression(ExprParser.ExpressionContext ctx)
{
System.out.println(ctx);
}
@Override public void exitExpression(ExprParser.ExpressionContext ctx)
{
System.out.println(ctx);
}
@Override public void enterActionexpr(ExprParser.ActionexprContext ctx)
{
System.out.println(ctx);
}
@Override public void exitActionexpr(ExprParser.ActionexprContext ctx)
{
System.out.println(ctx);
}
@Override public void enterCondexpr(ExprParser.CondexprContext ctx)
{
System.out.println(ctx);
}
@Override public void exitCondexpr(ExprParser.CondexprContext ctx)
{
System.out.println(ctx);
}
@Override public void enterCond(ExprParser.CondContext ctx)
{
System.out.println(ctx);
}
@Override public void exitCond(ExprParser.CondContext ctx)
{
System.out.println(ctx);
}
@Override public void enterEveryRule(ParserRuleContext ctx)
{
System.out.println(ctx);
}
@Override public void exitEveryRule(ParserRuleContext ctx)
{
System.out.println(ctx);
}
@Override public void visitTerminal(TerminalNode node)
{
}
@Override public void visitErrorNode(ErrorNode node)
{
}
}
Expr.g:
grammar Expr;
options
{
//antlr will generate java lexer and parser
language = Java;
}
WS : [ \t\r\n]+ -> skip ;
OP : '&&' | '||';
COMP : '==' | '<' | '>' | '<=' | '>=' | '!=';
fragment INT : [0-9]+;
REAL : INT '.' INT | INT;
ACTION : 'P' INT ':' INT;
MEASURE : 'M' INT;
//***************** parser rules:
cond : MEASURE COMP REAL;
condexpr : '(' condexpr ')' | cond OP condexpr | cond;
actionexpr : ACTION actionexpr | ACTION;
expression : 'ON' condexpr 'DO' actionexpr;
J'ai cette sortie:
[]
[]
[29]
[29]
[16 29]
[16 29]
[16 29]
[16 29]
[18 29]
[18 29]
[16 18 29]
[16 18 29]
[16 18 29]
[16 18 29]
[18 18 29]
[18 18 29]
[13 18 18 29]
[13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[18 13 18 18 29]
[18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[18 13 18 18 29]
[18 13 18 18 29]
[13 18 18 29]
[13 18 18 29]
[18 18 29]
[18 18 29]
[18 29]
[18 29]
[29]
[29]
[31]
[31]
[24 31]
[24 31]
[24 31]
[24 31]
[31]
[31]
[]
[]
J'ai du mal à comprendre les visiteurs avec ANTLR4.
J'ai de l'arbre des objectifs:
- Obtenir recueillir INTs de Mesures et d'ACTIONs (dans deux séries différentes)
- Remplacer certains OPs (par exemple != par <>)
- Obtenir le condexpr (le premier élément) de la chaîne de la Fpo en matière d'remplacé (se mon point précédent)
pour l'obtenir? '" arbre des objectifs? 🙂
OriginalL'auteur GlinesMome | 2013-02-02
Vous devez vous connecter pour publier un commentaire.
Un arbre étiquette que vous pourriez utiliser, pour définir le contexte de l'analyse et de la marche alors que les feuilles de l'observé graphique avec un visiteur de classe et de déclencher les méthodes dans le but de créer des actions à partir des expressions dans la langue de code source. Ainsi, lors de la première visite, l'auditeur ne doit pas traiter le visiteur réel motif. Le visiteur réel motif et le traitement par le biais de visite est faite par les méthodes de la expressionbase auditeur extension de classe.
L'auditeur identifie l'expression:
L'expression de la règle obtient un nom de label:
L'expression walker est mis en œuvre:
Le fichier principal, puis les promenades avec les walker:
intermezzo: avant d'appliquer le marcheur de visite modèle on peut imaginer arbre segment de l'optimisation ou de la transformation de modèles. L'analyse de l'arbre pourrait être traitée ici comme une salle de l'induction de l'arborescence du code source. Cette approche permet plus compliqué de code et de l'arbre de transformation de modèles.
new ParseTreeWalker()
. Utilisez simplementParseTreeWalker.DEFAULT.walk(...)
.OriginalL'auteur Tux the Ravin Penguin
D'abord je vais vous expliquer ce que vous avez observé ci-dessus:
D'abord et avant tout, veuillez lire la documentation pour les méthodes que vous appelez. Le
Analyseur.addParseListener
documentation comprend la remarque suivante:La mise en œuvre de
toString()
pour laParserRuleContext
classe imprime simplement la règle de l'invocation de la pile au moment où le contexte a été créé. Vous êtes l'impression que cette fois si la personne entre dans une règle, et une fois quand il la quitte. Pouractionexpr
,cond
, etcondexpr
vous l'imprimer à nouveau, résultant en un total de 4 identiques lignes de sortie pour chacun de ces contextes.Maintenant quelques notes sur vos objectifs:
enterCond
etexitCond
, leMEASURE
texte est disponible en appelantctx.MEASURE().getText()
.enterActionexpr
etexitActionexpr
, leACTION
texte est disponible en appelantctx.ACTION().getText()
.COND
jeton par la création d'une nouvelleTerminalNodeImpl
etCommonToken
pour la mise à jour du jeton, et en l'assignant à l'index correct dans le champCondContext.children
l'aide d'un visiteur ou d'un auditeur.OriginalL'auteur Sam Harwell