为函数签名定义Context Free Grammar

时间:2011-03-06 23:18:13

标签: compiler-construction context-free-grammar

我正在学习我正在参加的编译器课程的Context Free Grammars。我试图为函数的签名定义语法。例如:

int a
int b, int c
Object a, Object d
...

我能达到的最接近的是:

Params -> Params, Param
       |  Param
       |  lambda

Param -> paramType paramName

但这不是我想要的。该语法允许错误的字符串为, int a。我已经在这里待了一段时间,我想不出更好的方法来达到正确的语法。

任何帮助都将不胜感激。

2 个答案:

答案 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