【问题标题】:AST design - is a increment operator a statement or an expression?AST 设计 - 增量运算符是语句还是表达式?
【发布时间】:2021-02-15 00:57:44
【问题描述】:

我正在尝试在我的解析器中实现增量运算符。 但是,我对是否应将增量运算符视为语句或表达式感到困惑。将其实现为语句是有意义的,因为可以将其用作独立语句,例如:

i++;

不过它也可以用在如下表达式中:

int 2 = i++;

这对我的 AST 有影响,因为我目前有两种类型的节点,一个表达式节点和一个语句节点,其他节点可以接受它们作为它们的子节点。表达式节点在通过解释器的代码生成部分运行时将始终具有返回值。

关于 AST,增量运算符在其他语言中是如何分类的?它们是否最好地表示为表达式或语句?

【问题讨论】:

    标签: compiler-construction abstract-syntax-tree


    【解决方案1】:

    如果写int variableName = i++; 是合法的,那意味着i++ 是一个表达式。 i++; 是一个合法的声明意味着 <increment-operator> ';' 被定义为一个有效的声明,或者直接或更通常使用诸如 <statement> ::= <expression> ';' 之类的规则,即“后跟分号的表达式是一个声明”。这种类型的语句称为表达式语句,这也是为什么您可以在大多数语言中将函数调用用作语句的原因(某些语言限制可以在表达式语句中使用的表达式类型以禁止诸如 42; 或 @ 之类的无操作语句987654327@,但其他语言允许)。

    【讨论】:

    • 感谢您的回复。那么这是否意味着函数调用可以有两种类型的 AST 节点?例如。一个用于表达式语句的情况下,它被称为语句,另一个被称为表达式?
    • @Tom 表示表达式语句的一种常用方法是只为包含表达式节点的表达式语句设置一个节点(例如 class ExpressionStatementNode extends StatementNode { ExpressionNode expr; TerminalNode semicolon; }。另一种选择是让 ExpressionNode 继承自 @987654330 @(但前提是你不关心分号)。
    猜你喜欢
    • 2018-03-04
    • 2011-07-10
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2017-12-09
    相关资源
    最近更新 更多