我坚持如何编写我的语法,使得函数调用中的括号是可选的(如Ruby中)。
这是我现在的语法(简化版本)。
expr:
'-' expr
| expr '+' application
| application
application:
primary arg_list
| primary '(' arg_list ')'
| primary '(' ')'
| primary
arg_list:
application
| application ',' arg_list
primary:
IDENT
| '(' expr ')'
f a, b
之类的表达式应解析为App(f, [a, b])
。 f f a, b
应为App(f, App(f, [a, b]))
。
我没有能够在没有转换/减少冲突的情况下解析后者。关于如何构造语法的任何想法,以便我们可以拥有任意嵌套的运算符和应用程序,如(f f c + a) + b
,而不会发生冲突?