具有epsilon转换的递归LR(0)项?

假设我有这个语法:

A: ε
 | B 'a'
B: ε
 | B 'b'

什么被认为是关闭项目A: • B 'a'
换句话说,在解决封闭问题时,如何处理epsilon转换?


这非常简单。 包括在关闭中

    A = ... <dot> X ... ;

都是规则

    X =   <dot> R1 R2 R3 ... ;

其中第一个(R1)不是空的。 对于第一个(R1)中的每个(非空)标记K,您都需要(transitively!)包含

    R1 = <dot> k ... ;

等等,但大概你已经清楚了。

你具体的问题是如果R1可以为空会发生什么? 那么你还需要包括

    X =   R1 <dot> R2 ... ;

类似地,对于R2是空的,如果R1可以是空的,并且类似地,如果R1 ... Ri-1可以是空的,则Ri是空的。 在极端的情况下,所有的Ri都可以是空的(语法中有很多可选的小节),并且最终可以包含

    X =  R1 R2 ... Rn <dot> ;

请注意,确定第一个(R1)“可以为空”本身就是一个传递闭包问题。

我为DMS构建的GLR解析器生成器使用Warshall的算法预先计算first_can_be_empty,然后在闭包构造中使用它。

链接地址: http://www.djcxy.com/p/64975.html

上一篇: recursive LR(0) item with epsilon transitions?

下一篇: How to programmatically rename a method using JDT