我正在学习我正在参加的编译器课程的Context Free Grammars。我试图为函数的签名定义语法。例如:
int a
int b, int c
Object a, Object d
...
我能达到的最接近的是:
Params -> Params, Param
| Param
| lambda
Param -> paramType paramName
但这不是我想要的。该语法允许错误的字符串为, int a
。我已经在这里待了一段时间,我想不出更好的方法来达到正确的语法。
任何帮助都将不胜感激。
答案 0 :(得分:2)
基本上我们想要的是(Param,)* Param | lambda
,那么在生产规则中如何做到这一点?好吧,我们可以为(Param,)*
引入另一条规则,如下所示:
ParamCommas -> Param, ParamCommas
| lambda
然后我们可以在Params
中使用它:
Params -> ParamCommas Param
| lambda
请注意,我们不需要针对单个Param
的额外规则,因为ParamCommas
已经lambda
。
答案 1 :(得分:0)
这样做:
Param-> AB|lambda
A-> param
B->','paramB|lambda