当前位置: 首页 > 图文教程 > 开发语言 > VC++ > PL/0语言词法及语法分析系统的设计与实现

VC++
如何隐藏显示在任务栏中的对话框程序
一个效果很好的outlookbar控件CXTOutBarCtrl
如何在对话框程序中使用动画控件
形态各异的不规则窗体
支持换肤功能的窗口实例
如何给基于对话框的应用加启动画面
Convert CHtmlView to CHtmlCtrl(View与Frame的分离)
《Windows 程序设计》学习笔记(四)
如何模拟《WORD》的窗口形式
如何按非客户区移动窗体
仿制金山毒霸专杀工具界面
在对话框程序中插入DialogBar
接触VC之三:MFC基于对话框程序
无标题栏对话框的拖动
MFC框架程序中全屏显示特性的实现
给你的应用程序添加动态鼠标
在MFC程序中添加全屏显示功能
制作类似网络蚂蚁的拉帘式Tab
如何有效的使用对话框之二
IE控制条的实现

VC++ 中的 PL/0语言词法及语法分析系统的设计与实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: n/a

PL/0语言词法及语法分析系统的设计与实现

作者:陶善文
南京航空航天大学信息与计算机科学专业

下载源代码

摘要:本文介绍了一个PL/0语言的词法及语法分析系统的设计与实现
关键词:循环分支 递归下降 管道 输出重定向

  现在的编译系统都是IDE(Integrated Development Environment)和编译器独立实现,他们之间通过管道通信,本系统也采用这一方法来实现。我首先给出本文中的PL/0语言的文法:

PL/0语言的BNF描述(扩充的巴克斯范式表示法)

<prog> → program <id>;<block><block> → [<condecl>][<vardecl>][<proc>]<body><condecl> → const <const>{,<const>}<const> → <id>:=<integer><vardecl> → var <id>{,<id>}<proc> → procedure <id>(<id>{,<id>});<block>{;<proc>}<body> → begin <statement>{;<statement>}end<statement> → <id> := <exp> |if <lexp> then <statement>[else <statement>] |while <lexp> do <statement> |call <id>[(<exp>{,<exp>})] |<body> |read (<id>{,<id>}) |write (<exp>{,<exp>})<lexp> → <exp> <lop> <exp>|odd <exp><exp> → [+|-]<term>{<aop><term>}<term> → <factor>{<mop><factor>}<factor>→<id>|<integer>|(<exp>)<lop> → =|<>|<|<=|>|>=<aop> → +|-<mop> → *|/<id> → l{l|d} (注:l表示字母)<integer> → d{d} 
注释:
<prog>:程序 ;<block>:块、程序体 ;<condecl>:常量说明 ;<const>:常量;<vardecl>:变量说明 ;<proc>:分程序 ; <body>:复合语句 ;<statement>:语句;<exp>:表达式 ;<lexp>:条件 ;<term>:项 ; <factor>:因子 ;<aop>:加法运算符;<mop>:乘法运算符; <lop>:关系运算符odd:判断表达式的奇偶性。 
  下面我们先来看看词法及语法分析器的设计与实现。词法分析采用循环分支方法实现,语法分析采用递归下降来实现。它们的程序流程图如下:



  下面我们来实现这个两个分析器。这两个分析器采用一个类CCompiler来实现,这个类的定义如下:
//编译类
class CCompiler{public:	CCompiler();	virtual ~CCompiler();public:	void Compile(char *szFile);//编译,公共接口	vector<SYNTAXERR> GetSyntaxErr(){return m_vectorSyntaxErr;};//得到语法错误protected:	bool LexAnalysis(char *szStr);	//词法分析	bool IsOprSym(char *szStr);	//是否为运算符	bool IsBndSym(char *szStr);	//是否为界符	bool IsKeyWord(char *szStr);	//是否为关键字	bool IsInSymbolTab(char *szStr); //是否已在符号表中	char* JumpNoMatterChar(char *szStr);//跳过空格,回车,换行符,Tab	void OutSymbolTab(char *szFile);//输出符号表到文件	void SyntaxAnalysis();//语法分析	void SyntaxAnalysis_Prog();	bool SyntaxAnalysis_Mop();	bool SyntaxAnalysis_Integer();	bool SyntaxAnalysis_Aop();	bool SyntaxAnalysis_Lop();	int SyntaxAnalysis_Id();	int SyntaxAnalysis_Block();	int SyntaxAnalysis_Body();	int SyntaxAnalysis_Factor();	int SyntaxAnalysis_Term();	int SyntaxAnalysis_Lexp();	int SyntaxAnalysis_Exp();	int SyntaxAnalysis_Statement();	int SyntaxAnalysis_Const();	int SyntaxAnalysis_Proc();	int SyntaxAnalysis_Vardecl();	int SyntaxAnalysis_Condecl();	protected:	int m_iVecotrSymbolSize; //符号表大小	int m_iCurPointer; //符号表中当前指针	vector<LEXPROPERTYVS> m_vectorSymbol;//符号表	vector<SYNTAXERR> m_vectorSyntaxErr; //语法错误代码}; 
  其中:函数bool LexAnalysis(char *szStr);是对输入字符串szStr采用循环分支方法进行词法分析,分析出来的符号放在符号表m_vectorSymbol中,这个符号表采用向量这个数据结构来表示。词法分析得出符号表后,即进入语法分析阶段,语法分析由函数void SyntaxAnalysis();完成。下面这些函数是各非终结符对应的递归子程序。
bool SyntaxAnalysis_Mop();bool SyntaxAnalysis_Integer();bool SyntaxAnalysis_Aop();bool SyntaxAnalysis_Lop();int