如何打印满足我定义的解析规则的表达式?

问题描述 投票:0回答:1

我是antlr4的新手。在“The Definitive ANTLR4 Reference”中,我知道如何在解析期间打印令牌。但我有一个打印满足解析规则的表达式的请求。我对此一无所知。

这是我要解析的表达式的示例:

a=5 & b=6 & c=7
我想打印 3 个命题,例如:

p1:`a=5`,
p2:`b=6`,
p3:`c=7`

单独,但antlr4似乎只支持像

a
5
(解析树中的标记)这样的打印,这会丢失表达式的结构。

请帮助我如何做到这一点。

我的语法规则有一部分:

propos: expr op=('&' | '|' | '->') expr;
expr: VAR | VALUE;
VAR: [a-zA-Z]+;
VALUE: [0-9]+;

我按照手册的方法修改我的语法文件:

propos: (expr op=('&' | '|' | '->') expr     //# PRINT_NO_QUAN_PROPOS //no-quantifier proposition
   {
    System.out.println($propos.getText());
   }
)

但是当我编译这个文件时,它给了我错误消息

cannot find propos  System.out.println($propos.getText());

java parsing antlr4
1个回答
0
投票

将目标特定代码添加到语法中是不好的做法。尝试使用监听器来代替。鉴于你的语法:

propos: expr op=('&' | '|' | '->') expr;
expr: VAR | VALUE;
VAR: [a-zA-Z]+;
VALUE: [0-9]+;

然后运行代码:

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

public class ListenerDemo {
    public static void main(String[] args) {
        TLexer lexer = new TLexer(CharStreams.fromString("a&b"));
        TParser parser = new TParser(new CommonTokenStream(lexer));
        ParseTreeWalker.DEFAULT.walk(new DemoListener(), parser.propos());
    }
}

class DemoListener extends TBaseListener {
    @Override
    public void enterPropos(TParser.ProposContext ctx) {
        System.out.printf("propos: %s%n", ctx.getText());
    }
}

将打印:

propos: a&b
© www.soinside.com 2019 - 2024. All rights reserved.