• 大小: 896KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-08-01
  • 语言: C/C++
  • 标签: SLR1  C++  编译原理  

资源简介

文法为: 0:S->E 1:E->E+E 2:E->E*E 3:E->(E) 4:E->id 运行时只需输入待验证的句子即可 如要实现其他SLR(1)文法的识别,只需修改头文件和错误处理函数即可 作者:WMD 日期:2018-6-1

资源截图

代码片段和文件信息

/*
文法为:
0:S->E
1:E->E+E
2:E->E*E
3:E->(E)
4:E->id

运行时只需输入待验证的句子即可

如要实现其他SLR(1)文法的识别,只需修改头文件和错误处理函数即可

作者:WMD
日期:2018-6-1
*/


#include “slr1.h“

linkList L;                //带头结点的双向链表
linkList tail;             //记录链表的尾

int ip=0;                  //访问输入串元素

char thetext[20];          //用于接收用户输入
char space[20];            //用于控制输出缩进

int text_len=0;

int status_num=0;    //栈中元素个数(状态栈和符号栈中元素个数相同)

int status_top=0;          //记录状态栈栈顶

/******************************************************************************************/
int main()                     //主函数
{
menu();
return 0;
}
/******************************************************************************************/
void menu()                   //菜单函数
{
initialList(L);
while(1)
{
cout<<“请输入要验证的句子输入‘0‘退出:“< cin>>thetext;

if(strcmp(thetext“0“)==0)
return;
cout<<“输入的句子为: “<
ip=0;
while(thetext[ip]!=‘\0‘)     //在句子末尾加入#
ip++;
thetext[ip]=‘#‘;
thetext[ip+1]=‘\0‘;
ip=0;

text_len=strlen(thetext);
for(ip=0;ip<(20-text_len);ip++)
{
space[ip]=‘ ‘;
}
space[ip]=‘\0‘;
ip=0;


initial();            //对栈进行初始化,并将初始状态入栈

push(0‘#‘);
tail=L->next;

cout<<“状态栈“<<“              “<<“符号栈“<<“              “<<“输入串“<<“                        “<<“动作说明“< cout<<“------------------------------------------------------------------------------------------“<
analyze();

system(“pause“);
system(“cls“);
}
}
/******************************************************************************************/
int initialList(linkList &L)  //栈初始化函数
{
L=new LNode;
if(!L)
return ERROR;
L->next=NULL;
L->prev=NULL;
return OK;
}
/******************************************************************************************/
void initial()                //对栈进行清空
{
linkList pq;
p=L;
while(p->next!=NULL)
{
q=p->next;
p->next=q->next;
delete q;
}

status_num=0;
}
/******************************************************************************************/
void push(int statuschar symbol)   //入栈
{
linkList pointer=new LNode;

pointer->status=status;
pointer->symbol=symbol;

pointer->next=L->next;
L->next=pointer;

pointer->prev=L;

if(pointer->next!=NULL)
pointer->next->prev=pointer;

status_num++;
}
/******************************************************************************************/
void pop()                    //出栈
{
linkList pointer;
pointer=L->next;

L->next=pointer->next;
pointer->next->prev=L;

free(pointer);

status_num--;
}
/******************************************************************************************/
void analyze()                //分析
{
int result_tab=0;                 //记录查表结果
int location_tab=0;               //记录在终结符表中的位置
int status_new=0;                 //记录查询goto后获取的状态 
int i=0fre=0;                    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     553014  2018-06-01 15:05  SLR1\Debug\SLR1.exe

     文件     797952  2018-06-01 15:05  SLR1\Debug\SLR1.ilk

     文件     199582  2018-06-01 15:05  SLR1\Debug\slr1.obj

     文件    2181788  2018-06-01 15:05  SLR1\Debug\SLR1.pch

     文件    1115136  2018-06-01 15:05  SLR1\Debug\SLR1.pdb

     文件      74752  2018-06-04 13:52  SLR1\Debug\vc60.idb

     文件     110592  2018-06-01 15:05  SLR1\Debug\vc60.pdb

     文件        190  2018-06-10 14:49  SLR1\readme.txt

     文件       7624  2018-06-10 14:50  SLR1\slr1.cpp

     文件       4319  2018-06-01 15:04  SLR1\SLR1.dsp

     文件        516  2018-06-01 15:02  SLR1\SLR1.dsw

     文件       1332  2018-06-01 15:03  SLR1\slr1.h

     文件      50176  2018-06-10 14:50  SLR1\SLR1.ncb

     文件      48640  2018-06-10 14:50  SLR1\SLR1.opt

     文件        873  2018-06-01 15:05  SLR1\SLR1.plg

     目录          0  2018-06-01 15:05  SLR1\Debug

     目录          0  2018-06-10 14:50  SLR1

----------- ---------  ---------- -----  ----

              5146486                    17


评论

共有 条评论