ANTLR4:如何解析非根节点?
问题描述:
给定一个语法ANTLR4:如何解析非根节点?
script: statement*;
statement: do | check;
do: 'do';
check: 'check';
如何可以解析非根节点?换句话说,
ScriptParser sp = new ScriptParser();
StatementContext sc = sp.parse<StatementContext>("do");
我简化了上面的例子。
一个解决方案是让所有节点的根节点像
rootNode: script | statement | do | check;
,但我不希望如此,因为它污染我的语法,是一个维护的噩梦(每当语法添加/删除一个节点,则根节点必须更新,这是容易出错的)。 另一种解决方案是编写具有根节点规范的另一个派生语法。这不会污染主要语法,但仍然存在维护问题。
有没有更好的方法来做到这一点?我想使用许多节点(*** Context类)并将它们传递到我的域模型类的构造函数中。
答
谢谢@Jiri Tousek!答案确实是
ScriptParser sp = new ScriptParser();
StatementContext sc = sp.statement();
哪个ANLTR版本?在ANTLR 3中,你通过调用具有规则名称的方法明确指出什么是入口点,例如'parser.script()'或'parser.do()'。 –
ANTLR4(4.7)。我更新了标题。 – Ruudjah
在你的语法中,不是“做”一个有效的“脚本”值吗?你想要什么?限制解析只检查一个字符串是否是一个有效的“检查”? –