parsing - AST 中的 continue/break 语句是如何解析/表示的?
问题描述
我正在尝试在我的解释器中实现 for 循环,现在正尝试在解析器continue
中实现一个令牌语句。break
考虑到我的词法分析器,
词法分析器
"break" -> TOKEN::TBREAK
"continue" -> TOKEN::TCONTINUE
我正在考虑通过解析实现它们的两种方法。一种是有两个不同的节点,它们将被插入到名为BreakNode
and的 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)表示。
解决方案
这是一个判断电话,我确信这两种解决方案都可以在不同的项目中找到。
break
和的语义continue
当然足够相似,可以由单个函数处理;它们都翻译成goto
语句,尽管显然是不同的地方。(此外,它们可能退出不同的范围。)
请注意,它们不是所有语言中的单标记语句——有些语言允许你指定哪个循环而不是总是使用最里面的循环——并且在一些 C 系列语言中也有一个重要的区别,它break
适用于switch
块但continue
不吨。
就个人而言,我可能会选择“不同节点类型”的解决方案,但我认为这不会有太大的不同。
推荐阅读
- laravel - Laravel中的动态轮播不显示正确的数据
- python-3.x - 读取文本文件的每一行,删除特定字符串之前的所有字符,然后在 Python 中另存为新文件
- angular - 如何为类属性赋值?
- c++ - 如何制作使用不完整类型对象的函数
- ffmpeg - 如何使用 youtube-dl 分段录制直播
- php - 替换 PHP 字符串
- java - 为什么这个并发的 Java 代码经常失败?
- google-cloud-firestore - Firestore db:查询数组以查找具有特定值的文档
- python - 在 python SyntaxError 中出现错误:f-string:表达式嵌套太深
- c - 在 C 的注释中,符号 (@) 是什么意思?