看了上面对于左递归和右递归的解释,人们会想第一个例子能不能写成右递归呢?答案是可以的
list -> digit suffix | digit suffix suffix -> - digit suffix | + digit suffix | epsilon digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //epsilon表示空字符串, ’|‘表示‘或’那它们有什么区别吗?就像上面那个string的例子,解释不同,对于右递归的文法,是右结合的。
例如加减运算是左结合的,所以3+2-1=(3+2)-1; 而等号是右结合的,所以a=b=2等同于a=(b=2)
函数调用中参数列表的文法产生式
call -> id (optparams) optparams -> epsilon | params params -> params , param | param