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



具有ANTLR4语法、匹配的输入和生成的解析树。有没有任何方法可以找出解析树中的节点,如果有的话,它的定义应用了什么类型的量词?

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

起始:"a"("b"|"c")*"d";

输入:"abcd"

解析输入后,"start"规则的解析树将有4个终端子级。问题是,是否有任何方法可以发现第二个和第三个孩子("b"one_answers"c")是可选的?

确定是否存在可选子窗体的一个简单方法是使用标签

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

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

List<TerminalNode> op;

如果为null,则没有匹配的bc。否则,op将按匹配的顺序包含bc实例的列表。

更新

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

在没有标记的情况下,解析树将只识别匹配的内容和顺序,而不识别可能涉及的任何可选限定符。

您可以(1)使用ANTLR自己的语法解析语法本身,以直接确定应用于特定子术语的实际可选限定符;或者(2)适当地模糊输入,并最终从干净地生成的任何解析树推导和限定可选的子项。

相关内容

  • 没有找到相关文章

最新更新