【问题标题】:Query ANTLR4 parse tree whether children were quantified in the grammar rule查询ANTLR4解析树是否在语法规则中量化了孩子
【发布时间】:2016-04-29 15:59:20
【问题描述】:

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

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

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

输入:'abcd'

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

【问题讨论】:

  • “可选”量词是语法的一部分。因此,每当您看到匹配“b”或“c”时,它们都来自可选子规则。我不明白你的问题
  • 好吧,这里有些误会。因此,目标是在匹配输入中找到那些不一定需要保持语法正确的部分,即找到量词为 ?、* 或可能 + 的部分。

标签: parsing antlr4


【解决方案1】:

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

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

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

List<TerminalNode> op;

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

更新

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

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

您可以 (1) 解析语法本身,使用ANTLR's own grammar,直接确定应用于特定子项的实际可选限定符;或 (2) 对输入进行适当的模糊处理,并最终从任何干净生成的解析树中推断和限定可选子项。

【讨论】:

  • 感谢您的回复。不幸的是,我无法更改语法(也无法更改要解析的测试用例)。期望找出一个解决方案,接收任意语法和匹配输入,并找到输入的所有分析树,这些分析树可以被省略而不会导致语法错误。
  • 最后我选择了基于ANTLR的解决方案:在识别出目标语法中的可选规则后,我在访问者的帮助下将这些信息映射回解析树。如果有人感兴趣,可以在 Grammar_analyzer 和 hdd_tree_builder 模块中的 github.com/renatahodovan/picireny/tree/master/picireny/antlr4 处获得该实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
相关资源
最近更新 更多