简体   繁体   English

ANTLR4 Lexer侦听器

[英]ANTLR4 Lexer listener

In Antlr4, how can I intercept all INT/NEWLINE token parsing? 在Antlr4中,如何截获所有INT / NEWLINE令牌解析? I want somenting like a listener. 我想像一个听众一样ment。

Given the language: 给定语言:

 grammar Expr;      
    prog:   (expr NEWLINE)* ;
    expr:   expr ('*'|'/') expr
        |   expr ('+'|'-') expr
        |   INT
        |   '(' expr ')'
        ;
    NEWLINE : [\r\n]+ ;
    INT     : [0-9]+ ;


Css3Lexer lexer = new Css3Lexer(this.file.getStreamAntlr()); 
Css3Parser parser = new Css3Parser(new CommonTokenStream(lexer)); 
parser.addParseListener(..)// doesnt resolve.

First, I would annotate your grammar to make the listener events more specific: 首先,我将注释您的语法以使侦听器事件更具体:

grammar Expr;
prog: stmt+ EOF;
stmt: expr NEWLINE+;
expr:
    expr ('*'|'/') expr     # Mult
|   expr ('+'|'-') expr     # Add
|   INT                     # Int
|   '(' expr ')'            # Paren
;

NEWLINE : '\r\n';
INT     : [0-9]+ ;

This will allow you to make specific listeners such as: 这将允许您创建特定的侦听器,例如:

public class ExprListener : ExprBaseListener
{
    private Stack <int> stack = new Stack <int>();

    public override void ExitInt(ExprParser.IntContext context)
    {
        int i = Convert.ToInt32(context.INT().GetText());
        stack.Push(i);
    }

    public override void ExitStmt(ExprParser.StmtContext context)
    {
        int result = stack.Pop();
        Console.WriteLine("result " + result);
    }

    public override void ExitMult(ExprParser.MultContext context)
    {
        int r = stack.Pop();
        int l = stack.Pop();
        string op = context.GetChild(1).GetText();
        int result;
        if (op == "*")
            result = l * r;
        else
            result = l / r;
        stack.Push(result);
    }

    public override void ExitAdd(ExprParser.AddContext context)
    {
        int r = stack.Pop();
        int l = stack.Pop();
        string op = context.GetChild(1).GetText();
        int result;
        if (op == "+")
            result = l + r;
        else
            result = l - r;
        stack.Push(result);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM