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类)并将它们传递到我的域模型类的构造函数中。

+0

哪个ANLTR版本?在ANTLR 3中,你通过调用具有规则名称的方法明确指出什么是入口点,例如'parser.script()'或'parser.do()'。 –

+0

ANTLR4(4.7)。我更新了标题。 – Ruudjah

+0

在你的语法中,不是“做”一个有效的“脚本”值吗?你想要什么?限制解析只检查一个字符串是否是一个有效的“检查”? –

谢谢@Jiri Tousek!答案确实是

ScriptParser sp = new ScriptParser(); 
StatementContext sc = sp.statement();