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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 58 ::
收藏到网摘: 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