AST 中的 continue/break 语句 parsed/represented 怎么样?

How are the continue/break statements parsed/represented in ASTs?

我正试图在我的解释器中实现 for 循环,现在正试图在解析器中实现单标记语句 continuebreak

考虑到我的词法分析器,

词法分析器

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

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

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

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

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

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

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