【问题标题】:Defining the Context Free Grammar for a function's signature为函数签名定义上下文无关语法
【发布时间】:2013-11-12 10:00:09
【问题描述】:

我正在为我正在参加的编译器课程学习上下文无关语法。我试图为函数的签名定义一个语法。例如:

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

我能达到的最接近的目标是:

Params -> Params, Param
       |  Param
       |  lambda

Param -> paramType paramName

但这不是我想要的。此语法允许不正确的字符串为, int a。我在这里已经有一段时间了,我想不出更好的方法来获得正确的语法。

任何帮助将不胜感激。

【问题讨论】:

    标签: compiler-construction context-free-grammar


    【解决方案1】:

    基本上我们想要的是(Param,)* Param | lambda,那么如何在生产规则中做到这一点?好吧,我们可以为(Param,)* 引入另一条规则,如下所示:

    ParamCommas -> Param, ParamCommas
                |  lambda
    

    然后我们可以像这样在Params 中使用它:

    Params -> ParamCommas Param
           |  lambda
    

    请注意,对于单个 Param,我们不需要额外的规则,因为 ParamCommas 已经可以是 lambda

    【讨论】:

    • 这是一个不错的尝试。然而,它遇到了一个问题。它接受像“int a int b”这样的字符串。当 ParamCommas 为 lambda 时会发生这种情况。问题是允许 ParamCommas 成为 lambda。
    • @devoured:我没看到。您使用哪些推导来获得“int a int b”? ParamCommas 将由 lambda 或以逗号分隔并以逗号结尾的一系列参数。所以规则ParamCommas Param 要么只给你Param(如果ParamCommas 是lambda),要么给你用逗号分隔的多个参数。
    【解决方案2】:

    这样做怎么样:

    Param-> AB|lambda
    A-> param
    B->','paramB|lambda
    

    【讨论】:

      猜你喜欢
      • 2014-04-23
      • 2014-04-26
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2021-09-12
      • 1970-01-01
      相关资源
      最近更新 更多