• 大小: 754KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-07-05
  • 语言: 其他
  • 标签: pl0  编译原理  

资源简介

是pl0的语法分析器,编译原理实验; 用C写的。 /语法分析过程中 /利用词法分析的结果进行分析 /严格按照PL0程序定义来编写 / / ::= . / ::= PROGRAM ; / ::= [][][] / ::= CONST {,}; / ::= = / ::= VAR {,}; / ::= ;;【原课件中没有最后的分号,经分析应该有分号】 / ::= PROCEDURE / ::= | / ::= BEGIN {;} END【符合语句应该注意的是,END前距离END最近的那条语句一定没有分号,其他语句必须有分号】 /::= |||||| / ::= := / ::= READ({,}) / ::= WRITE({,}) / ::= CALL 【原课件中有分号,实际不应该有】 / ::= IF THEN / ::= WHILE DO / ::= ||() / ::= {} / ::= *|/ / ::= [+|-]{} / ::= +|- / ::= |ODD / ::= #|=|>|>=|<|<=

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

/********************************************************************
/PL0的编译程序 C++版
/
/词法分析  语法分析  符号表
/
/词法分析过程中
/遇到.号就立即结束,无论后面是否有内容都忽略
/遇到非法字符,中断分析并给出错误报告
/遇到超过14个字母的单词,截断成14个字母的,如果他不是数字再截断成10个字母的并给出错误报告
/遇到数字开头的标识符 中断分析并给出错误报告
/
/语法分析过程中
/利用词法分析的结果进行分析
/严格按照PL0程序定义来编写
/
/<程序> ::= <程序首部> <分程序>.
/<程序首部> ::= PROGRAM <标识符>;
/<分程序> ::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句部分>
/<常量说明部分> ::= CONST <常量定义>{<常量定义>};
/<常量定义> ::= <标识符>=<无符号整数>
/<变量说明部分> ::= VAR <标识符>{<标识符>};
/<过程说明部分> ::= <过程首部>;<分程序>;【原课件中没有最后的分号,经分析应该有分号】
/<过程首部> ::= PROCEDURE <标识符>
/<语句部分> ::= <语句>|<复合语句>
/<复合语句> ::= BEGIN <语句>{;<语句>} END【符合语句应该注意的是,END前距离END最近的那条语句一定没有分号,其他语句必须有分号】
/<语句>::= <赋值语句>|<条件语句>|<当型 循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>
/<赋值语句> ::= <标识符>:=<表达式>
/<读语句> ::= READ(<标识符>{<标识符>})
/<写语句> ::= WRITE(<表达式>{<表达式>})
/<过程调用语句> ::= CALL <标识符>【原课件中有分号,实际不应该有】
/<条件语句> ::= IF <条件> THEN <语句>
/<当型循环语句> ::= WHILE <条件> DO <语句>
/<因子> ::= <标识符>|<常量>|(<表达式>)
/<项> ::= <因子>{<乘法运算符><因子>}
/<乘法运算符> ::= *|/
/<表达式> ::= [+|-]<项>{<加法运算符><项>}
/<加法运算符> ::= +|-
/<条件> ::= <表达式><关系运算符><表达式>|ODD <表达式>
/<关系运算符> ::= #|=|>|>=|<|<=
/
/如果上述的任意一个步骤出了问题都会有错误提示,并指出是在源文件中的第几行,是哪一个定义出了问题
/当一个<语句>【复合语句除外】判断成功之后,在词法分析的结果找到这个语句的开始和结束,并输出这个语句是什么语句
/语法分析的实际操作类似一个走迷宫的搜索问题,找到一个可行的方向就前进,直到走到把所有单词都分析完,或者走不通了,一层层回溯返回FALSE给出错误信息
/
/符号表
/符号表的建立是在语法分析的深度优先搜索的基础上完成的
/基于深度优先搜索的特点当一个过程分析完,直接就能得到它的层级
/变量的LEVEL等于定义该变量的过程的LEVEL+1
/每个过程的变量的ADR都重新从3开始递增
/常量没有LEVEL,没有ADR,
/变量和常量都没有SIZE
/当程序的变量分析完就得到了符号表中最近插入的过程的SIZE【SIZE等于该过程的最后一个变量的ADR+1,若该过程没有变量则等于3】
/
*******************************************************************/

typedef struct t{
    string namekind;
    int vallevadrsize;
}Table;

bool isChengXu(int lev);
bool isFenChengXu(int lev);
bool isChengXuShouBu();
bool isChangLiangShuoMing();
bool isBianLiangShuoMing();
bool isGuoChengShuoMing(int lev);
bool isYuJuBuFen();
bool isChangLiangDingYi();
bool isGuoChengShouBu(int lev);
bool isYuJu();
bool isFuHeYuJu();
bool isFuZhiYuJu();
bool isWhileDoYuJu();
bool isIfYuJu();
bool isCallYuJu();
bool isWriteYuJu();
bool isReadYuJu();
bool isTiaoJian();
bool isYinZi();
bool isXiang();
bool isBiaoDaShi();
void printYuFa(int xint ystring statement);//输出语法分析的结果
void addtotable(string namestring kindint valint levint adrint size);//把记录加入符号表
int stoi(string s);//字符串转化成数字
string itos(int n);//数字转化成字符串
int error(int eint eline);//指出在eline行有错误e
bool isNumber(string s);//判断一个字符串是不是一个数字
string strtoupper(string s);//把字符串转换为大写
string strtolower(string s);//把字符串转换为小写
int lvkongge(string mSourseint &i);//虑空格,遇到文件末尾结束,返回-1
string getnext(string mSourseint &i);//从源文件中识别一个单词并返回
bool cifafenxi(string mSourse);//词法分析的主函数,执行虑空格操作,然后用getnext函数获取下一个单词进行分析,依次循环知道lvkongge函数返回-1
void initmp();//初始化保留字界符的查找表,
bool nexteql(string s);//从词法分析的结果顶部取出一个单词,判断s是否与之相等,

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-06-26 15:36  实验\
     目录           0  2012-06-26 15:37  实验\PL0语法分析器\
     目录           0  2012-06-26 16:18  实验\PL0语法分析器\Debug\
     目录           0  2012-06-26 15:43  实验\PL0语法分析器\PL0语法分析器\
     文件     2731008  2012-06-26 16:21  实验\PL0语法分析器\PL0语法分析器.ncb
     文件         925  2012-06-26 15:36  实验\PL0语法分析器\PL0语法分析器.sln
     文件        8192  2012-06-26 16:21  实验\PL0语法分析器\PL0语法分析器.suo
     目录           0  2012-06-26 16:18  实验\PL0语法分析器\PL0语法分析器\Debug\
     文件        4218  2012-06-26 16:18  实验\PL0语法分析器\PL0语法分析器\Debug\BuildLog.htm
     文件        2048  2012-06-26 16:15  实验\PL0语法分析器\PL0语法分析器\Debug\PL0语法分析器.exe.embed.manifest
     文件        2112  2012-06-26 16:15  实验\PL0语法分析器\PL0语法分析器\Debug\PL0语法分析器.exe.embed.manifest.res
     文件      232448  2012-06-26 16:15  实验\PL0语法分析器\PL0语法分析器\Debug\vc90.idb
     文件      282624  2012-06-26 16:15  实验\PL0语法分析器\PL0语法分析器\Debug\vc90.pdb
     文件      657707  2012-06-26 16:15  实验\PL0语法分析器\PL0语法分析器\Debug\yufa.obj
     文件        3967  2012-06-26 16:18  实验\PL0语法分析器\PL0语法分析器\PL0语法分析器.vcproj
     文件        1419  2012-06-26 16:21  实验\PL0语法分析器\PL0语法分析器\PL0语法分析器.vcproj.annie-THINK.annie.user
     文件       32785  2012-06-26 15:37  实验\PL0语法分析器\PL0语法分析器\yufa.cpp

评论

共有 条评论