Compiler construction 函数调用是一元表达式或语句还是什么?

Compiler construction 函数调用是一元表达式或语句还是什么?,compiler-construction,language-agnostic,Compiler Construction,Language Agnostic,一般来说,我该怎么称呼这个?我不知道这是一个陈述还是一元表达式或其他什么。我猜这是一个一元表达式,因为它们只需要一件事:它的参数起作用,对吗?我想我正在寻找一个编译器术语,但我自己找不到。函数调用就是函数调用。它是一种独立的语言 产生式规则通常类似于: function_call := identifier '(' argument_list ')' argument_list := expression ( ',' argument_list )* 这意味着无论有多少个参数,所有函数调用都只

一般来说,我该怎么称呼这个?我不知道这是一个陈述还是一元表达式或其他什么。我猜这是一个一元表达式,因为它们只需要一件事:它的参数起作用,对吗?我想我正在寻找一个编译器术语,但我自己找不到。

函数调用就是函数调用。它是一种独立的语言

产生式规则通常类似于:

function_call := identifier '(' argument_list ')'
argument_list := expression ( ',' argument_list )*
这意味着无论有多少个参数,所有函数调用都只有一个规则

因为函数调用返回一个值,所以整个过程就是一种表达式。但不是“一元表达”,这不是不同语言的共同点。表达式的产生式规则如下所示:

expression := literal
expression := '(' expression ')'
expression := function_call
...
我对这个表达有点过于简单化了。表达式规则通常按运算符优先级分成许多不同的级别。例如,
参数列表
规则将包含优先级高于逗号的表达式,带括号的规则将包含优先级最低的表达式,并生成优先级最高的表达式。但这是总的想法

在某些情况下,最高优先级的表达式称为“一元表达式”,在这种情况下,函数调用将是一元表达式。根据特定语言的语法定义,它可以被称为其他语言


请注意,上述内容适用于函数调用具有任意数量参数的语言。有一些语言,比如函数调用可能只有一个参数(多参数函数通过实现)。

在许多语言中,典型的语法规则比Jan Hudec在另一个答案中给出的语法规则更为一般:

function_call ::= expression '(' argument_list ')'
argument_list ::= expression ( ',' argument_list )*
expression ::= ... | identifier | function_call
请注意,函数调用以表达式开始,然后是以终端符号开始和结束的构造。这可以很容易地看作是一个带有后缀运算符的一元表达式(即括号和括号之间的所有参数)。例如,C和C++这样做。 有些语言(如Haskell)将函数调用视为二进制运算符表达式,二进制“运算符”是一个空的符号序列:

function_call ::= expression argument_expression
expression ::= ... | function_call | argument_expression

这里,
argument\u expression
包括所有语法上可以是函数参数的表达式(包括括号表达式和元组之类的内容)。

这个问题更适合。