查询ANTLR4解析树children是否在文法规则中被量化
Query ANTLR4 parse tree whether children were quantified in the grammar rule
具有 ANTLR4 语法、匹配输入和生成的解析树。有没有什么办法可以找出解析树中的一个节点,如果有的话,什么样的量词应用于它的定义?
一个例子:有这样的语法:
开始:'a' ('b' | 'c')* 'd' ;
输入:'abcd'
解析输入后,'start'规则的解析树将有4个终端children。问题是有没有办法查到第二个和第三个children('b'和'c')是可选的?
确定可选子项是否存在的一种简单方法是使用标签
start : 'a' op+=('b' | 'c')* 'd' ;
这将导致解析树上下文 StartContext
有一个字段
List<TerminalNode> op;
如果为空,则没有 b
或 c
匹配。否则,op
将包含按匹配顺序排列的 b
和 c
实例列表。
更新
标记将使解析树结构能够提供关于哪些子项是可选的提示,尽管即使这样信息也会不完整。
没有标签,解析树将只识别匹配的内容和顺序,而不是可能涉及的任何可选限定符。
您可以 (1) 解析语法本身,使用 ANTLR's own grammar,直接确定应用于特定子项的实际可选限定词;或 (2) 适当地模糊输入并最终从干净生成的任何解析树中推断和限定可选子项。
具有 ANTLR4 语法、匹配输入和生成的解析树。有没有什么办法可以找出解析树中的一个节点,如果有的话,什么样的量词应用于它的定义?
一个例子:有这样的语法:
开始:'a' ('b' | 'c')* 'd' ;
输入:'abcd'
解析输入后,'start'规则的解析树将有4个终端children。问题是有没有办法查到第二个和第三个children('b'和'c')是可选的?
确定可选子项是否存在的一种简单方法是使用标签
start : 'a' op+=('b' | 'c')* 'd' ;
这将导致解析树上下文 StartContext
有一个字段
List<TerminalNode> op;
如果为空,则没有 b
或 c
匹配。否则,op
将包含按匹配顺序排列的 b
和 c
实例列表。
更新
标记将使解析树结构能够提供关于哪些子项是可选的提示,尽管即使这样信息也会不完整。
没有标签,解析树将只识别匹配的内容和顺序,而不是可能涉及的任何可选限定符。
您可以 (1) 解析语法本身,使用 ANTLR's own grammar,直接确定应用于特定子项的实际可选限定词;或 (2) 适当地模糊输入并最终从干净生成的任何解析树中推断和限定可选子项。