此文是我晚上完成的一个编译原理实验...LR(1)分析法实验,大家如果学过编译原理肯定对LR 分析法印象很深,它很麻烦不是我说直到我写完这个程序才真正理解了LR分析法 .下面分析以下LR分析法
一 优点:
(1)LR分析器能够构造来识别所有能用上下文无关文法写的程序设计语言的结构。
(2)LR
分析方法是已知的最一般的无回溯移进-归约方法,它能够和其他移进-归约方法一样有效地实现。
(3)LR
方法能分析的文法类是预测分析法能分析的文法类的真超集。
(4)LR
分析器能及时察觉语法错误,快到自左向右扫描输入的最大可能.
二 组成
(1)
总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。
(2)
分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。
(3)
分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
我写的参考代码
/**************************************
*@Author: oDon 200490513101 WJ-0411
*@Create: 2006-12-7
*@Copyright: yuanonline@hotmail.com
*@Corporation: xxxx.CO.TD
*@Description: LR(1) Syntax Analysister
*************************************/
/*-------------------LR(1) Syntax -------------------------------------
*@Author: oDon 200490513101 WJ-0411
*@Create: 2006-12-7
*@Copyright: yuanonline@hotmail.com
*@Corporation: xxxx.CO.TD
*@Description: LR(1) Syntax Analysister
*************************************/
/*-------------------LR(1) Syntax -------------------------------------
(0)E -> E + T
(1)E -> T
(2)T -> T*F
(3)T -> F
(4)F -> E
(5)F -> (i)
----------------------------LR(1) SYNTAX TABLE-------------------------------------------
Status Action GOTO |
i + * ( ) # E T F |
-----------------------------------------------------------------------------------------
0 | S5 S4 | 1 2 3 |
1 | S6 acc | |
2 | R2 S7 R2 R2 | |
3 | R4 R4 R4 R4 | | | 8 2 3 |
5 | R6 R6 R6 R6 | |
6 | S5 S4 | 9 3 |
7 | S5 S4 | 10 |
8 | S6 S11 | |
9 | R1 S7 R1 R1 | |
10 | R3 R3 R3 R3 | |
11 | R5 R5 R5 R5 | |
---------------------------------------------------------------------------------------*/
(1)E -> T
(2)T -> T*F
(3)T -> F
(4)F -> E
(5)F -> (i)
----------------------------LR(1) SYNTAX TABLE-------------------------------------------
Status Action GOTO |
i + * ( ) # E T F |
-----------------------------------------------------------------------------------------
0 | S5 S4 | 1 2 3 |
1 | S6 acc | |
2 | R2 S7 R2 R2 | |
3 | R4 R4 R4 R4 | | | 8 2 3 |
5 | R6 R6 R6 R6 | |
6 | S5 S4 | 9 3 |
7 | S5 S4 | 10 |
8 | S6 S11 | |
9 | R1 S7 R1 R1 | |
10 | R3 R3 R3 R3 | |
11 | R5 R5 R5 R5 | |
---------------------------------------------------------------------------------------*/
#include "stdio.h"
#include "string.h"
#include "string.h"
//----------------------Global Declarition---------------------------------
#define SIZE 20
#define sSIZE 12 //There are sSIZE status
#define aSIZE 6 //There will ecounter aSIZE symb
#define SIZE 20
#define sSIZE 12 //There are sSIZE status
#define aSIZE 6 //There will ecounter aSIZE symb