gpt4 book ai didi

compiler-construction - 编译器AST如何实现语句和表达式

转载 作者:行者123 更新时间:2023-12-04 02:16:30 26 4
gpt4 key购买 nike

目前正在开发一个小玩具编译器,请考虑以下代码:

// AST base class
abstract class AST { /* codegen methods */}

// abstract classes for Statements and Expressions
abstract class Statement : AST {}
abstract class Expression : AST {}

// usage of the abstract classes
class CodeBlock : AST {
public List<Statement> BlockStatements;
}
class BinOp : AST {
public Expression LHS, RHS;
public char Operator;
}

// a constant value is always an expression
class ConstantInt : Expression {
public int Value;
}

现在问题来了,我将如何实现 FunctionCall 类?如果它用在表达式中,它将是表达式的一部分,例如 min(4, 5) + 3 因此 FunctionCall : Expression 是有意义的。但是我不能在这样的 block 中调用函数 { writeToConsole("Hello World"); } 所以 FunctionCall : Statement 听起来很合理,但这不适用于表达式语法。使 StatementExpression 继承也不会起作用,因为它允许像这样的 AST min(4, 5) + int a

我想获得有关如何将语句和表达式分开的建议,但可以同时分开的事情除外。

最佳答案

使语句成为表达式确实不是一个好主意(出于您指出的原因)。然而,使表达式成为语句具有更多优点。

事实上,大多数¹ 语言的语法都有一个与此类似的条目:

statement ::= expression ';'

也就是说一个表达式后面跟一个分号就是一个语句,即所谓的表达式语句。在您的 AST 中,您可以通过使 Expression 继承 Statement 或通过创建类 ExpressionStatement 来表示它,它只是包装 Expression.

除了允许函数调用作为语句外,它还允许其他表达式作为语句。对于赋值、复合赋值或增量表达式等副作用表达式,这很有意义。

对于没有副作用的表达式,比如简单的算术,它的意义不大。在 C 和 C++ 中,像 a + b; 这样的语句实际上是合法的,但会在大多数编译器中引起警告。在其他语言中,有一条明确的规则禁止将某些类型的表达式用作语句表达式。


¹ 当然,只考虑那些完全区分语句和表达式的语言。

关于compiler-construction - 编译器AST如何实现语句和表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com