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

时间:2014-03-10 12:02:14

标签: compiler-construction language-agnostic

一般而言,我怎么称呼这个?我不知道这是一个陈述还是一元表达还是其他什么。我猜这是一个单一的表达,因为他们只需要一件事:它的工作论据,对吗?我想我正在寻找一个编译器术语,但我自己找不到。

2 个答案:

答案 0 :(得分:3)

函数调用是函数调用。它是该语言的production rule中的单独formal grammar

制作规则通常类似于:

function_call := identifier '(' argument_list ')'
argument_list := expression ( ',' argument_list )*

这意味着无论有多少个参数,所有函数调用都只有一个规则。

由于函数调用返回一个值,整个事物就是一种表达式。但不是“一元表达”,这不是不同语言的共同点。表达式的生成规则看起来像这样:

expression := literal
expression := '(' expression ')'
expression := function_call
...

我对表达式略显过分。表达式规则通常由运算符优先级分解为许多不同的级别。例如。 argument_list规则将包含优先级高于逗号的表达式,带括号的规则将在其中具有最低优先级表达式并生成优先级最高的表达式。但这是一般的想法。

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

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

答案 1 :(得分:0)

在许多语言中,典型的语法规则比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_expression包括语法上可以作为函数参数的所有表达式(包括带括号的表达式和元组之类的东西)。