AST 中的 continue/break 语句 parsed/represented 怎么样?
How are the continue/break statements parsed/represented in ASTs?
我正试图在我的解释器中实现 for 循环,现在正试图在解析器中实现单标记语句 continue
和 break
。
考虑到我的词法分析器,
词法分析器
"break" -> TOKEN::TBREAK
"continue" -> TOKEN::TCONTINUE
我正在考虑通过解析实现它们的两种方法。
一种是有两个不同的节点将被插入到名为 BreakNode
和 ContinueNode
的 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)。
这是一个判断电话,我确信这两种解决方案都在不同的项目中找到。
break
和 continue
的语义非常相似,可以由一个函数处理;他们都翻译成 goto
语句,尽管显然是在不同的地方。 (此外,它们可能退出不同的范围。)
请注意,它们不是所有语言中的单一标记语句——某些语言允许您指定哪个循环而不是总是使用最里面的循环——并且在某些 C 系列语言中也存在重要差异,因为 break
适用于 switch
个块,但 continue
不适用。
就我个人而言,我可能会选择“不同节点类型”的解决方案,但我认为这不会有太大区别。
我正试图在我的解释器中实现 for 循环,现在正试图在解析器中实现单标记语句 continue
和 break
。
考虑到我的词法分析器,
词法分析器
"break" -> TOKEN::TBREAK
"continue" -> TOKEN::TCONTINUE
我正在考虑通过解析实现它们的两种方法。
一种是有两个不同的节点将被插入到名为 BreakNode
和 ContinueNode
的 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)。
这是一个判断电话,我确信这两种解决方案都在不同的项目中找到。
break
和 continue
的语义非常相似,可以由一个函数处理;他们都翻译成 goto
语句,尽管显然是在不同的地方。 (此外,它们可能退出不同的范围。)
请注意,它们不是所有语言中的单一标记语句——某些语言允许您指定哪个循环而不是总是使用最里面的循环——并且在某些 C 系列语言中也存在重要差异,因为 break
适用于 switch
个块,但 continue
不适用。
就我个人而言,我可能会选择“不同节点类型”的解决方案,但我认为这不会有太大区别。