【问题标题】:Compilers: First and Follow Sets of a grammar that does not contain epsilon编译器:不包含 epsilon 的语法的 First 和 Follow 集
【发布时间】:2016-03-23 21:53:35
【问题描述】:

在我目前的编译器课程中,我已经了解了如何找到第一组和后一组语法,并且到目前为止我处理的所有语法都包含 epsilon。现在我被要求找到第一个并遵循没有 epsilon 的语法集,并确定它是 LR(0) 还是 SLR。没有 epsilon 让我失望了,所以我不知道我是否做得正确。我将不胜感激任何关于我是否在第一组和后续组的正确轨道上,以及如何开始确定它是否是 LR(0)

考虑以下描述 Lisp 算术的语法:

S -> E // S是开始符号,E是表达式

E -> (FL) // F 是数学函数,L 是一个列表

L -> 李 | I // I 是列表中的一个项目

我 -> n | E // 一个项目是一个数字 n 或一个表达式 E

F -> + | - | *

第一:

FIRST(S)= FIRST(E) = {(}

FIRST(L)= FIRST(I) = {n,(}

FIRST(F) = {+, -, *}

关注:

关注(S) = {$}

跟随(E) = 跟随(L) = {), n, $}

FOLLOW(I) = {),$}

FOLLOW(F) = {),$}

【问题讨论】:

    标签: parsing compiler-construction


    【解决方案1】:

    FIRST 集是正确的,但 FOLLOW 集是不正确的。

    FOLLOW(S) = {$} 是正确的,尽管从技术上讲,这是针对增强语法 S' -> S$ 的。

    E 出现在 S -> E 和 I -> E 的右侧,都表示该集合的后续在 E 的后续,所以:FOLLOW(E) = FOLLOW(S) ∪ FOLLOW (一世) 。

    L 出现在 L -> LI 的右侧,给出 FOLLOW(L) ⊇ FIRST(I) 和 E -> (FL),给出 FOLLOW(L) ⊇ {)} 。

    I 出现在 L 的右侧 -> LI | I ,它给出了 FOLLOW(I) = FOLLOW(L) 。

    F 出现在 E -> (FL) 的右侧,给出 FOLLOW(F) = FIRST(L)

    解决这些问题:

    FOLLOW(F) = {n, (}

    FOLLOW(L) = FIRST(I) ∪ {)} = {n, (, )}

    FOLLOW(I) = {n, (, )}

    FOLLOW(E) = {$} ∪ {n, (, )} = {n, (, ), $}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多