编译原理词法分析及词法分析程序
- 格式:ppt
- 大小:1.93 MB
- 文档页数:117


编译原理上机实验试题
一、实验目的
通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术,如何针对确定的有限状态自动机进行编程序;熟悉和掌握程序设计语言的语法分析程序的设计原理、熟悉和掌握算符优先分析方法。
二、实验要求
本实验要求:①要求能熟练使用C++程序设计语言编程;②在上机之前要有详细的设计报告(预习报告);③要编写出完成相应任务的程序并在计算机上准确地运行;④实验结束后要写出上机实验报告。
三、实验题目
针对下面文法G(S):
S→ v = E
E→E+E│E-E│E*E│E/E│(E)│ v │ i
其中,v为标识符,i为整型或实型数。要求完成
① 使用自动机技术实现一个词法分析程序;
② 使用算符优先分析方法实现其语法分析程序;
③ 在语法分析过程中同时完成常量表达式的计算。
针对下面文法G(S):
S→ v = E
E→E+E│E-E│E*E│E/E│(E)│ v │ i
其中,v为标识符,i为整型或实型数。要求完成
① 使用自动机技术实现一个词法分析程序;
② 使用算符优先分析方法实现其语法分析程序;
③ 在语法分析过程中同时完成常量表达式的计算。
//编译原理课程设计,词法自动机。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
class frame extends JFrame implements ActionListener
{
JButton button1=new JButton("打开现有文件");
JButton button2=new JButton("现场输入文件");
1.正规式与有限自动机之间的关系。——有限自动机M向正规式阿尔法的转换。1)把状态转换图的概念拓展,令每条弧上都可以用一个正规式作标记。2)在M的转换图上加两个结点:x,y。从x用一颗塞隆弧连接到M的所有初态结点;从M的终态结点用一颗塞隆弧连接到y。这个新的NFA为M’,且L(M)=L(M')3)通过引入的3条有限自动机替换规则逐步消去M’中的所有结点,直到只剩下x和y为止。这样,在x至y的弧线上的标记就是一颗塞隆上的正规式,也就是M接受的正规式。
2.正规式阿尔法向确定有限自动机M的转换。1)由正规式阿尔法构造一个如下仅有两个结点x,y的状态图。2)按所引入的3条正规式分裂规则分裂阿尔法。3)重复步骤2直到每个弧上的标记是一颗塞隆上的一个字符或空串为止。4)将所得到的NFA M进行确定化就可得到DFA M。
3.词法分析程序:
4.任务:从左至右扫描源程序的字符串,按照词法规则识别出一个个正确的单词,并转换为相应的二元式形式,交给语法分析适用。
5.预处理原因:1)源程序中包含注解部分,还有无用的空格、跳格、回车换行等编辑字符,它们与词法分析无关。2)一行语句结束应配上一个特殊字符说明。3)有些语言要识别标号区,区分标号语句,找出续行符连接成完整语句等。4)输出源程序清单以便复核。
6.超前搜索:注:一般高级语言不必超前搜索,但有些对关键词不加保护的语言,单词间没有明确界符,要在上下文环境中识别单词,这时需要超前搜索。
7.单词分类(以c语言为例):基本字(关键字、保留字),标识符(变量名、数组名、函数名、过程名......),常量,运算符,界符。
8.扫描器的输出格式:使用二元式(类号,内码),每个单词对应一个二元式。其中类号用整数表示,类号既可区分单词种类,又可便于程序处理。类号考虑原则是:1)每个基本字占有一个类号,内码缺省;2)各种标识符统一为一类,由内码来区分不同的标识符名。通常将各标识符的符号表入口地址作为其内码。3)对于常量,以常量的数据类型区分不同类号,对每一类设置相应常量表。各常量在其常量表中的入口地址作为其内码。
编译原理实验一 词法分析
输入:source.tny
输出:token[40]
tokenstring[40][30]
以下样例程序已经能够识别:变量、数、赋值号、分号
要求修改代码使其能够识别:变量、数、赋值号、分号、加号、减号、乘号、除号
自动机: 字母 数 其他
字母 数
数 其它
: =
;
+
样例程序
#include
#include
FILE * source; /*源程序文件句柄*/
typedef enum
{PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,ASSIGN,NUM,ID,DOLLAR}
tokentype;/*记号*/
typedef enum
{ START,INASSIGN,INCOMMENT,INNUM,INID,INSEMI,INDOLLAR,DONE } statetype;/*状态*/
tokentype token[40]; /*存记号*/
char tokenstring[40][30];/*存记号串*/
int wordindex=0; /*以上两个数组的索引*/
int back=0; /*0不回退字符,1回退字符*/
int c; /*存获得的字符*/
int getnextchar(); /*获得下一个字符*/ START INID
INNUM
INASSIGN
INSEMI
INADDDONE int gettoken(); /*获得下一个记号*/
实 验 报 告
课程名称: 编译原理
实验项目: 词法分析
姓 名:
专 业:
班 级:
学 号:
计算机科学与技术学院
20 年 月 日 成绩:
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
实验名称: 词法分析
一、实验目的
1、为了更好的配合《编译原理》有关词法分析章节的教学。
2、加深和巩固学生对于词法分析的了解和掌握。
3、使学生通过本实验能够初步的了解和掌握程序词法分析的整个过程 。
4、提高学生的上机和编程过程中处理具体问题的能力。
二、实验要求
设计、编制并调制一个词法分析程序,对一个C语言的子集进行扫描。词法分析,把程序转换成记号,所有的关键词,操作符,分隔符,标识符和常量都被立即识别和报告。
词法分析,也就是把输入的符号串整理成特定的词素。词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等。
(1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符 如+、-、*、/等等。
(5) 界符 如逗号、分号、括号、等等。
词法分析器所输出单词符号常常表示成如下的二元式:
(单词种别,单词符号的属性值)
表1 各种单词符号的种别码
单词符号 种别码 单词符号 种别码
Main 1 [ 28
Int 2 ] 29
Char 3 { 30
If 4 } 31
Else 5 , 32
For 6 : 33