• 大小: 227KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-07
  • 语言: C/C++
  • 标签: LR语法  C  

资源简介

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

评论

共有 条评论