【问题标题】:Syntax directed definition (count number of pairs of parentheses)语法定向定义(计算括号对的数量)
【发布时间】:2014-11-28 14:44:38
【问题描述】:

给定以下语法,我必须找到适当的语义动作来计算语言的每个字符串,字符串中括号对的数量。

S -> (L)

S -> 一个

L -> L, S

L -> S

通常,为了执行这种类型的练习,我会构建一个示例字符串的派生树,然后添加属性。之后就更容易找到语义规则了。

所以我为字符串“((a, (a), a))”构建了这个派生树,但是我无法继续解决这个练习。如何计算括号对?我做不到……

我不想要解决方案,但我希望有人帮助我在这些情况下进行推理。

(对不起这棵坏树...)

【问题讨论】:

  • 这不清楚。如果你有树,计算括号的数量有什么问题?
  • 由于参数的配对是由语法本身处理的,看来您可以将计数语义动作附加到右括号(或左,就此而言)的匹配。
  • @OliverCharlesworth 嗨,奥利弗,感谢您的回复。我会说属性的结构必须使用每次找到一对括号时更新的计数器来制作。但是在哪里初始化计数器呢?如何升级?比如产生式L -> S的属性是什么?我没有放任何人,没有括号..但这似乎很奇怪。在这种类型的练习中,有什么东西可以阻止我,你必须计算某些事情的发生......
  • @500-InternalServerError 例如,我可以在规则 S -> (L) 中添加语义操作 S.p = 1+ counter。但是我如何以及在哪里初始化计数器?而其他的作品他们只是带着这个价值?
  • 计数器将保持在全局级别并在您调用解析器之前初始化为零。附加到 )( 的匹配项的语义操作将只是 counter++

标签: syntax grammar parse-tree


【解决方案1】:

OP 写道:

这些可能是该语法的正确语义动作?

S -> (L) {S.p = counter + 1}

S -> a {什么都不做}

L -> L, S {L.p = S.p}

L -> S {L.p = S.p}

.p 是一个综合属性。

【解决方案2】:
S-> (S)     { S.count =S.count + 1} 
S-> SS{ S.count  = S.count + S.count}
S-> ϵ{S.count = 0}

这应该让事情变得清晰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 2011-04-14
    • 2019-07-04
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多