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

时间:2014-11-13 13:53:54

标签: compiler-construction go

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

这样的定义
    // 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
    }

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

2 个答案:

答案 0 :(得分:7)

Golang spec使用这些条款:

  • Expressions:通过将操作符和函数应用于操作数来指定值的计算。
  • Statements:控制执行
  • Declarations(和范围):将非空标识符绑定到常量,类型,变量,函数,标签或包

IncDecStmt指定为

IncDecStmt = Expression ( "++" | "--" ) .
  

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

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

答案 1 :(得分:5)

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

来自Wikipedia

  

在大多数语言中,语句与表达式形成鲜明对比   语句不返回结果,仅为其执行   副作用,而表达式总是返回结果并经常这样做   根本没有副作用。

在Go an expression may be used as statement

你的困惑似乎来自增量和减量运算符。在Go中,与大多数基于C的语言相反,the increment and decrement statements don't produce a value, they're statements and not expressions。也就是说,你可能不会写

b := a++