查询ANTLR4解析树是否在语法规则中对子项进行了量化

时间:2016-04-29 15:59:20

标签: parsing antlr4

具有ANTLR4语法,匹配输入和生成的解析树。有没有办法找出解析树中的节点,如果有什么样的量词应用于它的定义?

一个例子:有这样的语法:

开始:' a' (' b' |' c')*' d' ;

输入:' abcd'

解析输入后,解析树开始'规则将有4个终端孩子。问题是,是否有任何方法可以找出第二个和第三个孩子(' b'和')他们是可选的?

1 个答案:

答案 0 :(得分:0)

确定是否存在可选子项的一种简单方法是使用标签

start : 'a' op+=('b' | 'c')* 'd' ;

这将导致解析树上下文StartContext具有字段

List<TerminalNode> op;

如果为null,则不匹配bc。否则,op将包含匹配顺序中的bc个实例的列表。

更新

标签将使解析树结构能够提供关于哪些子项是可选的提示,尽管这些信息也不完整。

如果没有标记,解析树将仅识别匹配的内容和顺序,但不识别可能涉及的任何可选限定符。

你可以(1)使用ANTLR's own grammar解析语法本身,直接确定应用于特定子项的实际可选限定符;或者(2)适当地模糊输入并最终从任何完整的解析树中推导和限定可选子项。