没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
(二)DO-WHILE 循环语句的翻译程序设计(简单优先法、输出四元式)
一、1.简单优先法的基本思想
根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,
称作简单优先矩阵。PDA 读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号
优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归
约,找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到 “#”为止。此时
识别正确。可分点描述如下:
(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄 ;
(2)、规定句柄内各相邻符号之间具有相同的优先级 ;
(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,
以先归约句柄;
(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的
优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.
2.简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
3.简单优先法的优缺点
优点:技术简单,当做简单优先矩阵是要求较短。
缺点:适用范围小,分析表尺寸太大。
二、源代码实现:
#include<iostream>
#dene MAX 35
#include<list>
#include<string>
#include<fstream>
using namespace std;
#dene TABLE_LEN 8
#dene STR_LEN 256
int zhlen;
char sTable[TABLE_LEN+1] = {"+-*/()i#"};//顺序索引
int ShipTable[TABLE_LEN][TABLE_LEN] = //优先表
{
{ 1, 1,-1,-1,-1, 1,-1, 1},
{ 1, 1,-1,-1,-1, 1,-1, 1},
{ 1, 1, 1, 1,-1, 1,-1, 1},
{ 1, 1, 1, 1,-1, 1,-1, 1},
{-1,-1,-1,-1,-1, 0,-1,-2},
{ 1, 1, 1, 1,-2, 1,-2, 1},
{ 1, 1, 1, 1,-2, 1,-2, 1},
{-1,-1,-1,-1,-1,-2,-1, 0}
};
char X,a;
char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};
char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};
char p[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-
TG\0","\0","FR\0",
"*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};
char stack[MAX];
char queue[MAX];
int sp,front;
int M[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},{1,-1,-1,-1,-
1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},{4,-
1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-
1,8,8,8},{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},{-1,-1,-1,-
1,12,12,10,11,-1,-1,-1,12,12,12},
{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},{-1,15,16,17,-1,-1,-1,-1,-1,-
1,-1,-1,-1,-1},
};
int f=0; int count=0;int c=0;char arr_i[MAX];char var[MAX]; //表格管理
int td[MAX]; int t=0;
int opd=-1;int opr=-1;int id=0;int d=0;
char arr[MAX][4];//存放待输出的四元式
//char keyword[2][7]={"do\0","while\0"};
bool IsCharInStr(char c,char s[])
{
for(int i=0;s[i]!='\0';i++)
{
if(s[i]==c)
return true;
}
return false;
}
int GetIndex(char s[],char c)
{
for(int i=0;s[i]!='\0';i++)
{
if(c==s[i])
return i;
}
return -1;
}
//
string GetSubString(char s[],int from,int to)
{
string st;
for(int i=from;i<to;i++)
{
st+=s[i];
}
return st;
}
/*******************************************
翻译赋值表达式
********************************************/
void translatefuzhi(char *sInput)
{
//栈结构的初始化
char Stack[STR_LEN]={0};
int index = 0;
int top = 1;
Stack[0] = '#';
list<char> rPolish;
list<string> Num;
int begin=0;
while(sInput[begin]!='=')
{
if(IsCharInStr(sInput[begin],sTable))
{
cout<<"Equal expression is illegal!"<<endl;
return ;
}
begin++;
}
Num.push_back(GetSubString(sInput,0,begin));
int now = begin+1;
int before = begin;
rPolish.push_back('i');
while(sInput[now]!='\0')
{
if(IsCharInStr(sInput[now],sTable))
{
char temp[3]={0};
if(now-before>1)
{
剩余11页未读,继续阅读
资源评论
qq_23884093
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Qt+opencv+C++实现图像旋转+自动&&手动+直线检测,角度计算+界面操作+源码(期末大作业&课程设计&项目开发)
- 基于servlet的简单游戏管理系统
- matlab基于混沌系统的图像加密.zip
- Fortran语言教程,详细地介绍了Fortran语言
- (函数)图论中最短路径计算D算法MATLAB源代码,修改网络上D算法的错误,并编写通用的MATLAB函数.rar
- 基于matlab 2Dijkstra最短路径算法的matlab程序,希望对大家有所帮助.zip
- python入门学习,基础语法,用法等.zip
- Swift代码转换指南(Swift Swift Code Convension Guide .)
- Python入门到精通.zip
- 基于QT+C++开发的炫酷九宫格主界面+源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功