上面的参数列表文法产生式中用id表示标识符,epsilon表示空字符串,param表示形参。 这个文法产生式某种意义上来说是”不完整“的, 因为它没有将id与params推导到字符级别,但有时候为了方便理解,就这么写了。
除此之外,文法产生式是很严谨的,连参数之间的逗号和函数调用的括号都要考虑在内,因为param仅代表一个字符串,不包含逗号在内。
运算符的优先级
到现在可以看到文法生成式算得上是一种严谨的”数学推导“了,而且它还能表示运算符号的优先级。
考虑 +-:左结合 */:左结合 优先级 */ > +-
expr -> expr - term | expr + term | term term -> term * factor | term / factor | factor factor -> digit | (expr)语法树的翻译是从叶子节点开始的,因此可以区分出优先级,子树的运算优先级比其父节点高。
factor是最小的运算单位,表示不能被其它任何运算符分开的表达式。
上面这个文法可以实现*/优先级比+-高,但是他也能表示2 *(1+3)这类语句。
后缀表达式
上面的文法都是中缀形式,后缀可以写成E -> E E op | digit
C语句的子集的文法