【问题标题】:How are the continue/break statements parsed/represented in ASTs?AST 中的 continue/break 语句是如何解析/表示的?
【发布时间】:2021-04-27 02:20:29
【问题描述】:

我正在尝试在我的解释器中实现 for 循环,现在我正尝试在解析器中实现一个令牌语句 continuebreak

考虑到我的词法分析器,

词法分析器

"break" -> TOKEN::TBREAK
"continue" -> TOKEN::TCONTINUE

我正在考虑通过解析实现它们的两种方法。 一种是有两个不同的节点被插入到 AST 中,称为BreakNodeContinueNode

解析器 1

BreakGram    -> TOKEN::TBREAK ';' = {new BreakNode();}
ContinueGram -> TOKEN::TCONTINUE ';' = {new ContinueNode();}

另一种方法是为一个令牌语句节点提供一个共享节点,插入令牌类型作为说明符,说明它将是什么类型的语句:

解析器 2

OneTokenStatement ->  TOKEN::TBREAK ';' = {new OneTokenStatement(TOKEN::TBREAK);}
                    | TOKEN::TCONTINUE ';' = {new OneTokenStatement(TOKEN::TCONTINUE);}

其他语言(如 Java/Python)的其他语法如何处理这两个标记?它们是用 AST 中的不同节点(如示例 1)还是相同节点(示例 2)表示。

【问题讨论】:

    标签: parsing compiler-construction abstract-syntax-tree interpreter


    【解决方案1】:

    这是一个判断电话,我确信这两种解决方案都可以在不同的项目中找到。

    breakcontinue 的语义当然非常相似,可以由单个函数处理;它们都翻译成goto 语句,尽管显然是不同的地方。 (此外,它们可能退出不同的范围。)

    请注意,它们不是所有语言中的单一标记语句——有些语言允许你指定哪个循环而不是总是使用最里面的循环——并且在一些 C 家族语言中也有一个重要的区别,那就是break适用于 switch 块,但 continue 不适用。

    就个人而言,我可能会选择“不同节点类型”的解决方案,但我认为这不会有太大的不同。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多