具有ANTLR4语法,匹配输入和生成的解析树。有没有办法找出解析树中的节点,如果有什么样的量词应用于它的定义?
一个例子:有这样的语法:
开始:' a' (' b' |' c')*' d' ;
输入:' abcd'
解析输入后,解析树开始'规则将有4个终端孩子。问题是,是否有任何方法可以找出第二个和第三个孩子(' b'和')他们是可选的?
答案 0 :(得分:0)
确定是否存在可选子项的一种简单方法是使用标签
start : 'a' op+=('b' | 'c')* 'd' ;
这将导致解析树上下文StartContext
具有字段
List<TerminalNode> op;
如果为null,则不匹配b
或c
。否则,op
将包含匹配顺序中的b
和c
个实例的列表。
更新
标签将使解析树结构能够提供关于哪些子项是可选的提示,尽管这些信息也不完整。
如果没有标记,解析树将仅识别匹配的内容和顺序,但不识别可能涉及的任何可选限定符。
你可以(1)使用ANTLR's own grammar解析语法本身,直接确定应用于特定子项的实际可选限定符;或者(2)适当地模糊输入并最终从任何完整的解析树中推导和限定可选子项。