从编译器的角度来看,表达,陈述和宣言之间有什么区别?

gga*_*ngg 4 compiler-construction go

我在这里浏览ast.go的Go源代码,有3种类型的接口,分别是Expression,Statement和Declaration.但只有源代码我无法弄清楚它们之间的区别.我能弄明白的是,表达式导致一个对象可以被分配或比较或用作参数,而语句是一些流控制,如if-else或循环.但我发现了一些定义

    // An IncDecStmt node represents an increment or decrement statement.
    IncDecStmt struct {
            X      Expr
            TokPos token.Pos   // position of Tok
            Tok    token.Token // INC or DEC
    }
Run Code Online (Sandbox Code Playgroud)

它不应该是一个表达式吗?我感到困惑如何区分表达式和语句,是否有任何规则?

Von*_*onC 7

Golang规范使用这些术语:

  • 表达式:通过将操作符和函数应用于操作数来指定值的计算.
  • 陈述:控制执行
  • 声明(和范围):将非空标识符绑定到常量,类型,变量,函数,标签或包

IncDecStmt被指定为

IncDecStmt = Expression ( "++" | "--" ) .
Run Code Online (Sandbox Code Playgroud)

"++"和" - "语句通过无类型常量1递增或递减其操作数.

它使用表达式,但仍然是一个语句(不产生新值).


Den*_*ret 5

这些是CS中的常用术语.表达式产生一个值而一个语句通常不会(这个最后一个点取决于语言,事实上,某些语言将表达式视为语句的子类别).

来自维基百科:

在大多数语言中,与语句中的表达形成对比的语句不会返回结果并且仅针对其副作用执行,而表达式总是返回结果并且通常根本没有副作用.

在Go中,表达式可以用作语句.

你的困惑似乎来自增量和减量运算符.在Go中,与大多数基于C的语言相反,递增和递减语句不产生值,它们是语句而不是表达式.也就是说,你可能不会写

b := a++
Run Code Online (Sandbox Code Playgroud)