在生成 LR(0) 解析器 table 时,是否有先移动哪个符号的经验法则?
Is there a rule of thumb for which symbol to shift first when generating LR(0) parser table?
我正在阅读这本书中有关 LR(0) 解析器的内容:Java 中的现代编译器实现。下面是根据本书解析 table 的样子。
http://postimg.org/image/hyowddu1h/
起始符号:S --> E$
作品:
(1) E --> T + E
(2) E --> T
(3) T --> x
我尝试根据给定的产生式进行解析 table,但我没有得到与书中相同的解析 table。我想我正确地移动了符号。只是我的解析 table 与书中的不同。
(注意:我从状态 0 而不是书中的状态 1 开始)
那么解析 table 是否是唯一的,或者是否有任何经验法则来决定首先将哪个符号移入堆栈或如何正确标记解析状态?我总是先移动终端符号,然后移动非终端符号,如下所示:
http://postimg.org/image/76vbu2vu3/
提前致谢!
状态数字并不那么重要。事实上,它们根本不重要。重要的是国家认同;您如何标记状态以表明身份取决于您。您可以使用飓风和龙卷风等名称。
如果您可以在两个状态集之间构建一对一的映射,使得所有标记的转换都保留映射,则两台机器是相同的。我很确定您可以在教科书中的状态机和您构建的机器之间构建映射。
我正在阅读这本书中有关 LR(0) 解析器的内容:Java 中的现代编译器实现。下面是根据本书解析 table 的样子。 http://postimg.org/image/hyowddu1h/
起始符号:S --> E$
作品:
(1) E --> T + E
(2) E --> T
(3) T --> x
我尝试根据给定的产生式进行解析 table,但我没有得到与书中相同的解析 table。我想我正确地移动了符号。只是我的解析 table 与书中的不同。 (注意:我从状态 0 而不是书中的状态 1 开始)
那么解析 table 是否是唯一的,或者是否有任何经验法则来决定首先将哪个符号移入堆栈或如何正确标记解析状态?我总是先移动终端符号,然后移动非终端符号,如下所示: http://postimg.org/image/76vbu2vu3/
提前致谢!
状态数字并不那么重要。事实上,它们根本不重要。重要的是国家认同;您如何标记状态以表明身份取决于您。您可以使用飓风和龙卷风等名称。
如果您可以在两个状态集之间构建一对一的映射,使得所有标记的转换都保留映射,则两台机器是相同的。我很确定您可以在教科书中的状态机和您构建的机器之间构建映射。