繁体   English   中英

编译器,找到语法的第一个集合

[英]Compilers, finding FIRST set for grammar

我正在阅读著名的紫罗兰色龙书第2版,但无法从第65页上获得有关创建FIRST集的示例:

我们有以下语法(终端使用粗体显示):

stmtexpr;
| 如果expr )stmt
| 对于 (optexpr; optexpr; optexpr)stmt
| 其他

optexpr→ε
| EXPR

书中建议以下是对FIRST的正确计算:

FIRST(stmt)→{ expr如果对于其他 } //对此达成共识

FIRST( expr; )→{ expr } //这是哪里来的?

正如评论所暗示的那样,第二行来自何处​​?

教科书中没有错误。

定义了FIRST功能(在第64页上,增加了重点):

α一串语法符号结尾和/或非结尾 )。 我们将FIRST(α)定义为出现在由α生成的一个或多个端子串的第一个符号中的端子集合。

在此示例中, expr ; 是由两个末端组成的一串语法符号,因此它是α的可能值。 由于它不包含非终结符,因此不能仅生成自身。 因此从α值产生的唯一端子串就是expr ; ,并且出现在FIRST(α)的唯一终端是该字符串expr中的第一个符号。

这看起来似乎很令人费解,但是在您引用的示例中却引出了重要的注意事项:

如果有两个乘积A → αA → β则必须考虑FIRST集。 暂时忽略ε产生, 预测分析要求FIRST(α)FIRST(β)不相交

expr; stmt的可能右侧之一,我们需要计算其FIRST集(即使这种情况下的计算是微不足道的)才能测试该先决条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM