[英]Compilers, finding FIRST set for grammar
我正在阅读著名的紫罗兰色龙书第2版,但无法从第65页上获得有关创建FIRST集的示例:
我们有以下语法(终端使用粗体显示):
stmt → expr;
| 如果 ( 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.