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

2016-01-29 12:15 140 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载源代码

摘要:本文介绍了一个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);//跳过空格,回车,换行符,Tabvoid 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
                        

来源:http://www.tulaoshi.com/n/20160129/1485318.html

延伸阅读
标签: Web开发
SyCODE Syntax Highlighter是一个基于javascript实现的语法高亮程序,实现方式借鉴了著名的db.SyntaxHighlighter采用正则表达式进行关键字匹配,处理速度比db.SyntaxHighlighter高出 5~10倍,是目前处理速度最快的javascript语法高亮程序。 SyCODE Syntax Highlighter具有速度高可扩展性强的特点,在一台当前主流PC机上可以轻松完成32KB的代码...
标签: Web开发
元素和标签是WML的主要语法,它们决定了WML编程的基本原则。本章我们将从WML的元素、标签、属性等方面详细讲解WML的编程方法。学习本章知识之前,读者应当了解WML元素与标签的区别。WML的元素通常有一个首标签、内容、其它元素及一个尾标签组成。也就说,单独的标签是一个元素,成对出现的标签与其包含的内容也构成一个元素。由于元素牵涉及标签...
摘要 本章中主要通过详尽的实例,配以合理的练习,让读者了解、把握Java语言的基本语法。通过本章的学习,读者应能学会:Java程序的结构、变量、方法、运算符、表达式等,以便今后编写Java程序时更加得心应手。 -------------------------------------------------------------------------------- 本章目...
标签: Web开发
完成WAP服务器的建立和WAP浏览器的安装之后,我们接下来就可以使用WML语言来编写WAP网页或应用,并通过WAP服务器及浏览器进行调试。从本章开始我们将系统地学习WML语言,本章主要讲解WML语言的基础知识,下一章全面讲解WML的语法、标签和规则。 2.1 WML的简单例子及编辑、测试方法 无限标记语言WML(Wireless Markup Language)是一种基于扩展...
在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认的编码方式是UNICODE,而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编...

经验教程

332

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部