首页 > 解决方案 > AST 中的 continue/break 语句是如何解析/表示的?

问题描述

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

考虑到我的词法分析器,

词法分析器

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

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

解析器 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)表示。

标签: parsingcompiler-constructionabstract-syntax-treeinterpreter

解决方案


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

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

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

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


推荐阅读