【问题标题】:Multiple entries in an LL(1) parsing table?LL(1) 解析表中有多个条目?
【发布时间】:2013-05-01 18:41:08
【问题描述】:

鉴于此语法:

S → S1 S2

S1 → a | ε

S2 → ab | ε

因此,我们有

FIRST(S1) = { a, ε }

FOLLOW(S1) = { a }

这是否意味着在解析表中我将在 S1 的行和 a 的列中有多个定义?

【问题讨论】:

    标签: parsing compiler-construction context-free-grammar ll


    【解决方案1】:

    是的,没错。 (但是,请注意您的 FOLLOW 集是错误的;它还包含输入结束标记 $)。这里的问题是,如果解析器看到a,它无法判断那是否是因为它想要使用派生

    S → S1S2 → 一个 S2

    或者推导

    S → S1S2 → S2 → ab

    要解决此问题,您可以注意您的语法仅生成字符串 { a, ab, aab }。因此,您可以为直接产生这三个字符串的语言语法构建一个 LL(1):

    S→aY

    Y → ε |一个Z

    Z → ε | b

    希望这会有所帮助!

    【讨论】:

    • 但是为什么 $ 在 S1 的后面?因为 S2 包含 epsilon ?
    • @MarounSassine- 是的,没错。因为 S2 在其 FIRST 集中有 epsilon,所以 S1 的 FOLLOW 集包含 S2 的 FOLLOW 集中的所有内容。由于 S2 出现在开始生产的最后,它的后续集包含 $。因此,S1 的 FOLLOW 集包含 $。这能说明问题吗?
    • @templatetypedef 抱歉在这里打扰,实际上我对编译器设计很感兴趣并找到了您的幻灯片 web.stanford.edu/class/archive/cs/cs143/cs143.1128 我发现它们非常直观,但有时我发现它们在您重复幻灯片的地方很浅,我认为您一定是在课堂上解释什么的,我怎样才能从你的笔记中获得更多的资源/帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多