【问题标题】:How to parse indentation-driven code into AST [duplicate]如何将缩进驱动的代码解析为 AST [重复]
【发布时间】:2016-12-02 15:45:27
【问题描述】:

这是我需要解析成 AST 的代码:

one
 two
  three
   four
 five
 six
  seven

如您所见,它是缩进驱动的。我真的找不到方法来解释我的解析器(我正在使用 Antlr4),前导空格是子级别的指示符。

【问题讨论】:

  • 我发誓这是复制品。
  • @yegor256 我用 ANTLR4 示例更新了链接到的答案。

标签: java antlr antlr4 abstract-syntax-tree


【解决方案1】:

如果没有词法分析器的帮助,基本上你无法向解析器解释它。

相反,您所做的是破解词法分析器以跟踪在扫描空格时开始一行的空格数。如果空间计数与前一行相比发生了变化,则词法分析器会发出一个标记。如果计数上升,则发出一个 INDENT 令牌。如果计数下降,则发出一个 DEDENT 令牌。

现在您可以将 INDENT 和 DEDENT 标记添加到解析器规则中。它们在逻辑上类似于 C 语言中的 { 和 }。

【讨论】:

  • 我就是这么想的。您能否展示一下“破解词法分析器”的外观。也许将我指向正确的博客文章或文档页面?
  • 这里我帮不了你;我不是 ANTLR 专家。 (这是我们使用特殊词法分析器为 Python 解析器所做的 hack,但它是非常标准的特技)。您必须深入研究编写 ANTLR 词法分析器的细节。
  • 嗨@yegor256 你的问题解决了吗?您可以查看 Python3 语法生成的词法分析器,或者只查看 Python3 语法词法分析器成员部分。它甚至可以是一个简单的 Python 程序来处理 INDENT/DEDENT 并在遇到时发出令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2017-07-13
  • 1970-01-01
  • 2011-01-21
  • 2012-07-27
  • 2011-04-07
相关资源
最近更新 更多