資源簡介
C語言實現的LR(0)語法分析器程序,能用于大多數LR型文法分析,程序只需局部修改就可使用。

代碼片段和文件信息
/**
此程序識別的為LR(0)語法分析器
文法為:
(0)?S‘->S
(1)?S->aRST
(2)?S->aR
(3)?R->+
(4)?T->b
識別的輸入語句為:a+a+b
如有其它文法和輸入語句大體程序不用改,只需修改部分數字,重新構造action表與goto表即可使用。
作者:wang?jia?meng
時間:2013-4-16
學校:CUMT
*/
#include
#include
#define?OK?1
#define?ERROR?0
#define?STACK_INIT_SIZE?100
#define?STACKINCREMENT?10
#define?X?8
#define?Y1?4
#define?Y2?3
typedef?struct
{
int?*base;
int?*top;
int?stacksize;
}SqStack;
typedef?struct
{
char?key;
int?data;
}Array;
typedef?Array?Action[X][Y1];
typedef?Array?Goto[X][Y2];
SqStack?*StateStack?*SignStack;
int?k=0;
char?a[]={‘a‘‘+‘‘a‘‘+‘‘b‘‘#‘};
int?Gotofind(intcharGoto);
void?InitActionAndGoto(Action?AGoto?G)
{
/*action表?說明:將規約定在<10的數字,將移進定在>=10的數字*/
A[0][0].key=‘a‘;A[0][1].key=‘+‘;A[0][2].key=‘b‘;A[0][3].key=‘#‘;
A[0][0].data=2;A[0][1].data=-1;A[0][2].data=-1;A[0][3].data=-1;
A[1][0].key=‘a‘;A[1][1].key=‘+‘;A[1][2].key=‘b‘;A[1][3].key=‘#‘;
A[1][0].data=-1;A[1][1].data=-1;A[1][2].data=-1;A[1][3].data=0;
A[2][0].key=‘a‘;A[2][1].key=‘+‘;A[2][2].key=‘b‘;A[2][3].key=‘#‘;
A[2][0].data=-1;A[2][1].data=4;A[2][2].data=-1;A[2][3].data=-1;
A[3][0].key=‘a‘;A[3][1].key=‘+‘;A[3][2].key=‘b‘;A[3][3].key=‘#‘;
A[3][0].data=2;A[3][1].data=-1;A[3][2].data=20;A[3][3].data=20;
A[4][0].key=‘a‘;A[4][1].key=‘+‘;A[4][2].key=‘b‘;A[4][3].key=‘#‘;
A[4][0].data=30;A[4][1].data=-1;A[4][2].data=30;A[4][3].data=30;
A[5][0].key=‘a‘;A[5][1].key=‘+‘;A[5][2].key=‘b‘;A[5][3].key=‘#‘;
A[5][0].data=-1;A[5][1].data=-1;A[5][2].data=7;A[5][3].data=-1;
A[6][0].key=‘a‘;A[6][1].key=‘+‘;A[6][2].key=‘b‘;A[6][3].key=‘#‘;
A[6][0].data=-1;A[6][1].data=-1;A[6][2].data=10;A[6][3].data=10;
A[7][0].key=‘a‘;A[7][1].key=‘+‘;A[7][2].key=‘b‘;A[7][3].key=‘#‘;
A[7][0].data=-1;A[7][1].data=-1;A[7][2].data=40;A[7][3].data=40;
????/*goto表*/
G[0][0].key=‘S‘;G[0][1].key=‘R‘;G[0][2].key=‘T‘;
G[0][0].data=1;G[0][1].data=-1;G[0][2].data=-1;
G[1][0].key=‘S‘;G[1][1].key=‘R‘;G[1][2].key=‘T‘;
G[1][0].data=-1;G[1][1].data=-1;G[1][2].data=-1;
G[2][0].key=‘S‘;G[2][1].key=‘R‘;G[2][2].key=‘T‘;
G[2][0].data=-1;G[2][1].data=3;G[2][2].data=-1;
G[3][0].key=‘S‘;G[3][1].key=‘R‘;G[3][2].key=‘T‘;
G[3][0].data=5;G[3][1].data=-1;G[3][2].data=-1;
G[4][0].key=‘S‘;G[4][1].key=‘R‘;G[4][2].key=‘T‘;
G[4][0].data=-1;G[4][1].data=-1;G[4][2].data=-1;
G[5][0].key=‘S‘;G[5][1].key=‘R‘;G[5][2].key=‘T‘;
G[5][0].data=-1;G[5][1].data=-1;G[5][2].data=6;
G[6][0].key=‘S‘;G[6][1].key=‘R‘;G[6][2].key=‘T‘;
G[6][0].data=-1;G[6][1].data=-1;G[6][2].data=-1;
G[7][0].key=‘S‘;G[7][1].key=‘R‘;G[7][2].key=‘T‘;
G[7][0].data=-1;G[7][1].data=-1;G[7][2].data=-1;
}
int?InitStack(SqStack?*s)
{
s->base=(int?*)malloc(STACK_INIT_SIZE?*?sizeof(int));
if(!s->base)
return?ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
????return?OK;
}
template
int?Push(SqStack?*s?T?e)
{
if((s->top-s->base)>=s->stacksize)
{
s->base=(int?*)?realloc?(s->base(s->stacksize+STACKINCREMENT)*sizeof(int))
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-04-16?19:52??語法分析三\
?????目錄???????????0??2013-04-16?19:52??語法分析三\Debug\
?????文件???????33792??2013-04-16?19:51??語法分析三\Debug\vc60.idb
?????文件???????53248??2013-04-16?19:51??語法分析三\Debug\vc60.pdb
?????文件??????184380??2013-04-16?19:51??語法分析三\Debug\語法分析三.exe
?????文件??????263688??2013-04-16?19:51??語法分析三\Debug\語法分析三.ilk
?????文件???????11218??2013-04-16?19:51??語法分析三\Debug\語法分析三.obj
?????文件??????211060??2013-04-16?01:02??語法分析三\Debug\語法分析三.pch
?????文件??????451584??2013-04-16?19:51??語法分析三\Debug\語法分析三.pdb
?????文件????????5447??2013-04-16?19:52??語法分析三\語法分析三.cpp
?????文件????????3451??2013-04-15?21:29??語法分析三\語法分析三.dsp
?????文件?????????528??2013-04-15?23:54??語法分析三\語法分析三.dsw
?????文件???????41984??2013-04-16?19:52??語法分析三\語法分析三.ncb
?????文件???????49664??2013-04-16?19:52??語法分析三\語法分析三.opt
?????文件????????1279??2013-04-16?19:51??語法分析三\語法分析三.plg
評論
共有 條評論