-1

从下面给出的语法创建 LR(1) 项并合并具有给出 LALR(1) 项集的项集。我不知道如何从这个语法构造

B -> 身份证 | 编号 ( B ) | 乙。编号 | 乙[乙]| 乙。身份证(乙)

到目前为止的答案:i0- B' -> .B, $ | .id, $ | .id ( B )

4

1 回答 1

0

以下是LRSTAR 8.0给出的 LALR(1) 项集:

STATE MACHINE LISTING:

      +=>  Shift and goto next state.
      +<=  Shift and reduce.
       <=  Reduce.

///////////////////////////// STATE 0 /////////////////////////////
//
// *    0  G -> . B <eof> 

        2  <id>        +=>    2

        1  B           +=>    1

///////////////////////////// STATE 1 /////////////////////////////
//
// *    0  G -> B . <eof> 
// *    3  B -> B . '.' <id> 
// *    4  B -> B . '[' B ']' 
// *    5  B -> B . '.' <id> '(' B ')' 

        1  <eof>       +=>   11
        5  '.'         +=>    3
        6  '['         +=>    4

Came from: 0

///////////////////////////// STATE 2 /////////////////////////////
//
// *    1  B -> <id> . 
// *    2  B -> <id> . '(' B ')' 

        3  '('         +=>    5
           (default)    <=    1

Came from: 0 4 5 9

///////////////////////////// STATE 3 /////////////////////////////
//
// *    3  B -> B '.' . <id> 
// *    5  B -> B '.' . <id> '(' B ')' 

        2  <id>        +=>    6

Came from: 1 7 8 10

///////////////////////////// STATE 4 /////////////////////////////
//
// *    4  B -> B '[' . B ']' 

        2  <id>        +=>    2

        1  B           +=>    7

Came from: 1 7 8 10

///////////////////////////// STATE 5 /////////////////////////////
//
// *    2  B -> <id> '(' . B ')' 

        2  <id>        +=>    2

        1  B           +=>    8

Came from: 2

///////////////////////////// STATE 6 /////////////////////////////
//
// *    3  B -> B '.' <id> . 
// *    5  B -> B '.' <id> . '(' B ')' 

        3  '('         +=>    9
           (default)    <=    3

Came from: 3

///////////////////////////// STATE 7 /////////////////////////////
//
// *    3  B -> B . '.' <id> 
// *    4  B -> B . '[' B ']' 
// *    4  B -> B '[' B . ']' 
// *    5  B -> B . '.' <id> '(' B ')' 

        5  '.'         +=>    3
        6  '['         +=>    4
        7  ']'         +<=    4

Came from: 4

///////////////////////////// STATE 8 /////////////////////////////
//
// *    2  B -> <id> '(' B . ')' 
// *    3  B -> B . '.' <id> 
// *    4  B -> B . '[' B ']' 
// *    5  B -> B . '.' <id> '(' B ')' 

        4  ')'         +<=    2
        5  '.'         +=>    3
        6  '['         +=>    4

Came from: 5

///////////////////////////// STATE 9 /////////////////////////////
//
// *    5  B -> B '.' <id> '(' . B ')' 

        2  <id>        +=>    2

        1  B           +=>   10

Came from: 6

///////////////////////////// STATE 10 /////////////////////////////
//
// *    3  B -> B . '.' <id> 
// *    4  B -> B . '[' B ']' 
// *    5  B -> B . '.' <id> '(' B ')' 
// *    5  B -> B '.' <id> '(' B . ')' 

        5  '.'         +=>    3
        6  '['         +=>    4
        4  ')'         +<=    5

Came from: 9

///////////////////////////// STATE 11 /////////////////////////////
//
// *    0  G -> B <eof> . 

           (default)    <=    0

Came from: 1

//
////////////////////////////////////////////////////////////////////

最小 LR(1) 的项目集是相同的。我不确定规范的 LR(1) 项目集。规范 LR(1) 解析器表不实用,除非文法很小。

于 2017-03-20T17:21:12.453 回答