[英]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.