Parsing 使用可选括号解析函数调用

Parsing 使用可选括号解析函数调用,parsing,yacc,Parsing,Yacc,我被困在如何编写语法上,以至于函数调用中的括号是可选的(比如Ruby) 这是我现在掌握的语法(精简版) expr: '-' expr | expr '+' application | application application: primary arg_list | primary '(' arg_list ')' | primary '(' ')' | primary arg_list: application | application

我被困在如何编写语法上,以至于函数调用中的括号是可选的(比如Ruby)

这是我现在掌握的语法(精简版)

expr:
    '-' expr
  | expr '+' application
  | application

application:
    primary arg_list
  | primary '(' arg_list ')'
  | primary '(' ')'
  | primary

arg_list:
    application
  | application ',' arg_list

primary:
    IDENT
  | '(' expr ')'
fa,b
这样的表达式应该解析为
App(f[a,b])
fa,b
应该是
App(f,App(f[a,b]))

我从未能够让后者在没有移位/减少冲突的情况下进行解析。关于如何构造语法,使我们可以任意嵌套运算符和应用程序,如
(fc+a)+b
,而不发生冲突,有什么想法吗