如何解决在 AST 中如何解析/表示 continue/break 语句?
我正在尝试在我的解释器中实现 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)。
解决方法
这是一个判断,我确信这两种解决方案都存在于不同的项目中。
function(record) {
function afterSubmit(scriptContext) {
if (scriptContext.type !== scriptContext.UserEventType.CREATE)
return;
var rec = scriptContext.newRecord;
rec.load({
type: record.type.ITEMFULFILLMENT,id: rec
});
var itemFul = rec.getValue({
fieldId : 'tranid'
});
rec.setValue({
fieldId: 'custbody_mod_billoflading_ref',value: itemFul
});
rec.save();
};
return{
afterSubmit: afterSubmit
};
});
和 break
的语义当然非常相似,可以由单个函数处理;它们都翻译成 continue
语句,尽管显然是在不同的地方。 (此外,它们可能退出不同的作用域。)
请注意,它们并不是所有语言中的单一标记语句——有些语言让你指定哪个循环而不是总是使用最里面的循环——而且在一些 C 系列语言中也有一个重要的区别,即 {{1 }} 适用于 goto
块,但 break
不适用。
就我个人而言,我可能会采用“不同的节点类型”解决方案,但我认为它不会有太大的不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。