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:判断表达式的奇偶性。

下面我们先来看看词法及语法分析器的设计与实现。词法分析采用循环分支方法实现,语法分析采用递归下降来实现。它们的程序流程图如下:

时间: 2024-11-18 16:33:30

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

vb-VB 6.0语言系统的控件缺少一些接口或者事件的问题

问题描述 VB 6.0语言系统的控件缺少一些接口或者事件的问题 能不能在VB 6.0 中添加一个新的事件接口到一个现有的控件中?事件能不能进行自定义呢? 解决方案 http://blog.sina.com.cn/s/blog_9c4f7b570100zlmb.html

《C语言程序设计:问题与求解方法》——0.4节理想厨房系统与计算机系统术语对照表

0.4 理想厨房系统与计算机系统术语对照表下面给出两个系统之间的术语对照表,见表0-1. 表0-1中这些与计算机相关的术语将在下一章进行讲解.与在理想厨房系统上运行一个菜谱极为类似,在电子计算机上运行一个程序时,表0-1中列出的计算机的各个部件也会协同工作,完成程序给定的任务(参见下一章).学习了理想厨房这个例子,理解计算机基本工作原理就变得非常容易了.

《C语言程序设计:问题与求解方法》——0.1节理想厨房系统

0.1 理想厨房系统理想厨房系统是一个通过顺序执行菜谱中的各个加工步骤,把原材料加工成菜肴的系统.它由硬件和软件(菜谱)组成. 1)软件部分:菜谱是理想厨房系统中的一个无重量.无体积.不会损坏但可以经常更换的极为重要的"软件"部件.菜谱由一个个加工步骤顺序组成.每个加工步骤命令理想厨房系统完成一个基本操作(比如,炒.蒸.煮.输入一种原材料等).注意:为了简洁起见,在以下叙述中,我们经常把菜谱中的一个"加工步骤"称为一条"指令".因为一个加工步骤就

用c语言做一个学籍系统登陆界面,求源代码

问题描述 用c语言做一个学籍系统登陆界面,求源代码 请问我要用c语言做一个学籍系统登陆界面咋做,有没有源代码,格式如下: ****************学生学籍管理系统**************** 1,注册 2,登陆 3,修改密码 0,退出系统 请选择0~3 解决方案 http://www.docin.com/p-565175373.htmlhttp://wenku.baidu.com/link?url=k0FVy3GjeXwWYcZsHz3X5ir_qGRBS_OElVg5XDcTydD

[转贴]Oracle PL/SQL语言基础

oracle|sql语言 [转贴]Oracle PL/SQL语言基础 Oracle PL/SQL语言基础   PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序.    PL/SQL的优点    从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有

Oracle PL/SQL语言基础

oracle|sql语言 Oracle PL/SQL语言基础  2002-8-23   Oracle PL/SQL语言基础 PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独

c语言中字符数组系统初始化为什么?

问题描述 c语言中字符数组系统初始化为什么? c语言中声明一个字符数组,如果自己没有初始化,那系统初始化为什么?是被初始化为空字符吗?我的实验结果好像是空字符 解决方案 在debug调试下,vc会将它初始化为0xcc 0xcc...,也就是"烫烫烫烫...",release运行的时候,vc++不会初始化,内容随机,但是很大可能是0,因为只有在堆内存被重新分配的时候,才可能出现其他值. 其它编译器不好说. 解决方案二: C语言字符数组的初始化C语言字符数组的初始化

用C语言写一个小系统,要求登录时,输入密码错误三次后,必须等10分钟才能再次登录。

问题描述 用C语言写一个小系统,要求登录时,输入密码错误三次后,必须等10分钟才能再次登录. 写一个小系统,要求登录时,输入密码错误三次后,必须等10分钟才能再次登录.怎么样实现? 解决方案 第一个循环三次判断,用户登录是否成功. for(i =0 ; i<3; i++){...} if(i >=3){ startTime = currenttime; endTime= currenttime; timespan = endTime - startTme; while(timespan <

v8世界探险(2) - 词法和语法分析

v8世界探险(2) - 词法和语法分析 上节我们学习了API的概况,这节开始我们就循着API来分析实现. 对于解释器或者编译器来说,我们第一个感兴趣的当然是编译的过程. 上节我们学习过了,编译调用的API是Script::Compile函数: // Compile the source code. Local<Script> script = Script::Compile(context, source).ToLocalChecked(); Script::Compile API的实现,大部