当前位置:网站首页>编译原理——预测表C语言实现
编译原理——预测表C语言实现
2022-07-06 09:43:00 【芣苢的成长之路】
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
/* 广西师范大学 计算机科学与工程学院 GuangXi Normal University College of Computer Science and Engineering Student STZ */
string map[6][7]={
{
"", "i", "+", "*", "(",")","#"},
{
"E", "TD", "", "", "TD", "", ""},
{
"D", "","+TD", "", "","e","e"},
{
"T", "FS", "", "", "FS", "", ""},
{
"S", "", "e","*FS", "","e","e"},
{
"F", "i", "", "","(E)", "", ""},
};
char input[] = "i+i*i#";
char start[] = "#E";
void match(int l,int c){
// int len = map[l][c].length();//替换串的长度
int i = 0;
int isfirst = 0;
cout<<start[strlen(start)-1]<<"->"<<map[l][c]<<endl;
for(string::reverse_iterator iter=map[l][c].rbegin();iter!=map[l][c].rend();iter++){
//反向迭代
if(isfirst==0){
start[strlen(start)-1] = *iter;
isfirst=1;
}else{
start[strlen(start)] = *iter;
}
for(int j=0;j<6;j++){
printf("%c",start[j]);
}cout<<endl;
}
int analysis(char l,char c){
int flag = 1;
int i,j;
string L = "";
L += l;
string C = "";
C +=c;
//cout<<l<<endl;
for(i=1;i<6;++i){
if(L.compare(map[i][0])==0){
//匹配到行
break;
}
}
// cout<<i<<endl;
// i--;
for(j=1;j<7;++j){
if(C.compare(map[0][j])==0){
//匹配到列
break;
}
}
// cout<<j<<endl;
// j--;
if(map[0][j].compare("")!=0){
match(i,j);//
return 1;
}else{
cout<<l<<"不匹配"<<map[0][j]<<" map为:"<<map[i][j]<<endl;
return 0;
}
}
int main(){
int flag = 1;
while(flag){
cout<<endl<<"当前start状态:";
for(int j=0;j<6;j++){
printf("%c",start[j]);
}cout<<endl;
cout<<"当前input状态:"<<input<<endl;
if(start[strlen(start)-1] == input[0]){
//如果栈尾和剩余字符串队首一样先消除;
start[strlen(start)-1]='\0';
for(int i=0;i<strlen(input)-1;i++){
input[i] = input[i+1];
}
input[strlen(input)-1]='\0';
cout<<endl<<"消除成功!\n当前start状态:"<<start<<"\n当前input状态:"<<input<<endl;
}
else if(start[strlen(start)-1]=='e'){
//如果最后一位是空,自动去掉
start[strlen(start)-1]='\0';
}
else
flag = analysis(start[strlen(start)-1],input[0]);//如果栈尾和剩余字符串队首不一样;
if(flag==0){
cout<<"编译出错!!"<<endl;
break;
}
if(strlen(input)==0){
cout<<"END!!"<<endl;
break;
}
}
return 0;
}
边栏推荐
- Alibaba brand data bank: introduction to the most complete data bank
- 自动化运维利器ansible基础
- EasyCVR平台通过接口编辑通道出现报错“ID不能为空”,是什么原因?
- 网络分层概念及基本知识
- Pyspark operator processing spatial data full parsing (4): let's talk about spatial operations first
- Flink analysis (I): basic concept analysis
- Run xv6 system
- Flink parsing (III): memory management
- 历史上的今天:Google 之母出生;同一天诞生的两位图灵奖先驱
- There is a gap in traditional home decoration. VR panoramic home decoration allows you to experience the completion effect of your new house
猜你喜欢
Huawei certified cloud computing hica
Unity小技巧 - 绘制瞄准准心
自动化运维利器ansible基础
JMeter interface test response data garbled
C WinForm series button easy to use
Sqoop I have everything you want
The problem of "syntax error" when uipath executes insert statement is solved
The most complete tcpdump and Wireshark packet capturing practice in the whole network
Flink parsing (IV): recovery mechanism
TCP connection is more than communicating with TCP protocol
随机推荐
Growth of operation and maintenance Xiaobai - week 7
The shell generates JSON arrays and inserts them into the database
[elastic] elastic lacks xpack and cannot create template unknown setting index lifecycle. name index. lifecycle. rollover_ alias
How to submit data through post
BearPi-HM_ Nano development board "flower protector" case
2022年大厂Android面试题汇总(一)(含答案)
Single responsibility principle
Mysqlimport imports data files into the database
The NTFS format converter (convert.exe) is missing from the current system
Concept and basic knowledge of network layering
node の SQLite
OliveTin能在网页上安全运行shell命令(上)
Quick start of Hongmeng system
远程代码执行渗透测试——B模块测试
分布式不来点网关都说不过去
The art of Engineering (2): the transformation from general type to specific type needs to be tested for legitimacy
Summary of study notes for 2022 soft exam information security engineer preparation
Wordcloud colormap color set and custom colors
在一台服务器上部署多个EasyCVR出现报错“Press any to exit”,如何解决?
C # nanoframework lighting and key esp32