LR(1)项和LALR(1)解析表怎么做?

时间:2017-03-06 00:45:01

标签: bnf lr1

根据下面给出的语法创建LR(1)项并合并已给出LALR(1)项集的项集。我不确定如何从这个语法构建

B - > id | id(B)| B。 id | B [B] | B。 id(B)

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

1 个答案:

答案 0 :(得分: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)项目的集合。 Canonical LR(1)解析器表不适用,除非语法很小。