资源简介
文法为:
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
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 编译原理c语言编译器
- 编译原理实验-词法分析(c语言代码)
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
评论
共有 条评论