我是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());
将目标特定代码添加到语法中是不好的做法。尝试使用监听器来代替。鉴于你的语法:
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