当前位置:文档之家› 编译原理词法分析实验报告

编译原理词法分析实验报告

编译原理词法分析实验报告

实验一词法分析

一、实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

二、实验内容

(1)功能描述:

该程序是实现一个词法分析器,词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是将单词分为五种的方法。

识别关键字:main、if、int、for、while、do、return、break、continue;

单词种别码为1。

标识符:单词种别码为2。

常数:为无符号整形数;单词种别码为3。

运算符:包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。

分隔符:包括:,、;、{、}、(、);单词种别码为5。

(2)程序结构描述:

输入:从控制台输入一段源程序代码,对输入的代码进行词法分析,

处理:分离出关键字、标识符、数值、运算符和界符。

输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。其中,编码是自定义的,一种类型对应一个编码。词法分析结

果显示在控制台上。

(3)程序设计思路

1、定义编码表,用ArrayList集合存放单词,如:关键字、运算符、分界符。这三种单词是固定的,标示符和数字这两种单词不存放在集合中。编码表是固定的,只需要初始化一次就够了,所以将集合定义为static类型,使其在类加载时,进行一次初始化。

2、static char allstr[] = new char[100000];该数组用于存储用户从控制台输入的所有字符。

3、//从键盘获取一个一个的字符

public char Getchar() {

try {

ch = (char) System.in.read();

} catch (Exception e) {

e.printStackTrace();

}

return ch;

}

4、用while循环遍历allstr数组中存放的字符,判断分离出关键字、标示符、数字、运算符、标示符。

5、Reserve() 遍历编码表,查询单词的编码号。

三、实验过程记录

实验过程中,比较费力的是如何分割出一个一个的单词,定义一个变量j来记录一个单词在allstr数组中的起始位置,变量index来判定一个单词是否到结尾位置。用String类中的subString(str,start,end)方法来截取一个单词。一旦一个单词的下标移动错误,导致后面识别出的单词全都不正确。通过加断点,对程序一步一步的调试,查看j、index变量的值的变化。一步一步的分析,最终得到了正确的运行结果。

测试数据:

main()

{

int a,b;

a = 10;

b = b +a ;

}#

运行结果:

测试数据:

Int abc(){

Int a=5,b=6;

While(a>=0){

a--;

}

}#

运行结果:

==>>>

测试数据:

int a=10,b=5;

if(a>=9)

return b;#

运行结果:

四、主要源代码

//判断是否为字母

public boolean IsLetter(char ch) {

return https://www.doczj.com/doc/3e19227813.html,ng.Character.isLetter(ch);

}

//判断是否为数字

public boolean IsDigit(char ch) {

return https://www.doczj.com/doc/3e19227813.html,ng.Character.isDigit(ch);

}

public int Reserve() {

name = new String(allstr).substring(j, index);// 取子串

for (int i = 0; i < 5; i++)

if (table[i].key.contains(name))

return table[i].code;

return 0;

}

public static void main(String[] args) {

WordAnalyzer a = new WordAnalyzer();

ch = a.Getchar();

int m = 0;

while (ch != '#') {

allstr[index] = ch;

index++;

ch = a.Getchar();}

int k = index;

index = 0;

while (j < k) {

m = j;

//标示符

if (a.IsLetter(allstr[j])) {

while (a.IsLetter(allstr[index]) || a.IsDigit(allstr[index])) {

index++;

}

if (a.Reserve() != 0)

System.out.println("(" + a.Reserve()+","+name+")");

else

System.out.println("(2," +name+ ")");

j = index;

//数字

if (a.IsDigit(allstr[j])) {

while (a.IsDigit(allstr[index]))

index++;

if (a.Reserve() != 0)

System.out.println("(" + a.Reserve()+","+name+")");

else

System.out.println("(3," +name+ ")");

j= index;

//识别分界符

//判断'('

if (allstr[j] == '(') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

。。。。。。

//识别运算符

//判断=和==

if (allstr[j] == '=') {

index++;

if(allstr[index]=='='){

index++;

System.out.println("("+a.Reserve()+","+name+")");

j=index;

}else{

System.out.println("("+a.Reserve()+","+name+")");

j=index;

}}

。。。。。。

五、实验总结

做本次实验大约用了三个小时,用了一个多小时思考,设计,查资料,剩余的时间来编码。由于刚开始对问题的理解不太深入,造成在编码过程中出现了很多问题,一直在考虑是用一个单词一个编码还是将单词分为五种编码,浪费了很长时间,最后选择了将单词分为五种编码的方法来编写词法分析,因为一个编码对应多个单词,考虑到用键值对的形式来存放编码列表。多个固定的单词用ArrayList集合来存储,这些编码数据是固定的,所以定义为static类型,只需要初始化一次。在试验中最困难的就是分离出关键字、标识符、数字、运算符和分界符,通过调试观察变量的值,修改,调试,运行。来回重复,最后的得到了正确的运行结果。

package com.fgy.practice;

import java.util.ArrayList;

import java.util.List;

public class WordAnalyzer {

static char ch;

static int index = 0;

static int j = 0;

static char allstr[] = new char[100000];

static String name;

static KeyTable[] table=new KeyTable[5];

static{

List al=new ArrayList<>();

al.add("main");

al.add("if");

al.add("else");

al.add("int");

al.add("for");

al.add("while");

al.add("return");

List al1=new ArrayList<>();

List al2=new ArrayList<>();

List al3=new ArrayList<>();

al3.add("+");

al3.add("++");

al3.add("-");

al3.add("--");

al3.add("=");

al3.add("==");

al3.add(">");

al3.add(">=");

al3.add("<");

al3.add("<=");

List al4=new ArrayList<>();

al4.add(",");

al4.add(";");

al4.add("{");

al4.add("}");

al4.add("(");

al4.add(")");

table[0]=new KeyTable(al,1);//关键字

table[1]=new KeyTable(al1,2);//标示符

table[2]=new KeyTable(al2,3);//常数

table[3]=new KeyTable(al3,4);//运算符

table[4]=new KeyTable(al4,5);//分界符

}

//从键盘获取一个一个的字符

public char Getchar() {

try {

ch = (char) System.in.read();

} catch (Exception e) {

e.printStackTrace();

}

return ch;

}

//判断是否为字母

public boolean IsLetter(char ch) {

return https://www.doczj.com/doc/3e19227813.html,ng.Character.isLetter(ch);

}

//判断是否为数字

public boolean IsDigit(char ch) {

return https://www.doczj.com/doc/3e19227813.html,ng.Character.isDigit(ch);

}

public int Reserve() {

name = new String(allstr).substring(j, index);// 取子串

for (int i = 0; i < 5; i++)

if (table[i].key.contains(name))

return table[i].code;

return 0;

}

public static void main(String[] args) {

WordAnalyzer a = new WordAnalyzer();

ch = a.Getchar();

int m = 0;

while (ch != '#') {

allstr[index] = ch;

index++;

ch = a.Getchar();

}

int k = index;

index = 0;

while (j < k) {

m = j;

//标示符

if (a.IsLetter(allstr[j])) {

while (a.IsLetter(allstr[index]) || a.IsDigit(allstr[index])) { index++;

}

if (a.Reserve() != 0)

System.out.println("(" + a.Reserve()+","+name+")");

else

System.out.println("(2," +name+ ")");

j = index;

}

//数字

if (a.IsDigit(allstr[j])) {

while (a.IsDigit(allstr[index]))

index++;

if (a.Reserve() != 0)

System.out.println("(" + a.Reserve()+","+name+")");

else

System.out.println("(3," +name+ ")");

j= index;

}

//识别分界符

//判断'('

if (allstr[j] == '(') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//判断')'

if (allstr[j] == ')') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//判断‘{’

if (allstr[j] == '{') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//判断‘}’

if (allstr[j] == '}') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//判断;

if (allstr[j] == ';') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//判断,

if (allstr[j] == ',') {

index++;

System.out.println("(" + a.Reserve()+","+name+")");

j = index;

}

//识别运算符

//判断=和==

if (allstr[j] == '=') {

index++;

if(allstr[index]=='='){

index++;

System.out.println("("+a.Reserve()+","+name+")");

j=index;

}else{

System.out.println("("+a.Reserve()+","+name+")");

j=index;

}

}

//判断'<'和‘<=’

if (allstr[j] == '<') {

index++;

if (allstr[index] == '=') {

index++;

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

} else{

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

}

}

//判断‘>’和‘>=’

if (allstr[j] == '>') {

index++;

if (allstr[index] == '=') {

index++;

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

} else{

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

}

}

//判断‘+’和‘++’

if (allstr[j] == '+') {

index++;

if (allstr[index] == '+') {

index++;

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

} else{

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

}

}

//判断‘-’和‘--’

if (allstr[j] == '-') {

index++;

if (allstr[index] == '-') {

index++;

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

} else{

System.out.println("(" +a.Reserve()+","+name+")");

j = index;

}

//判断空格' '

if (allstr[j] == ' ') {

while (allstr[j] == ' ') {

index++;

j = index;

}

}

}

//判断是不是换行

if (allstr[j] == '\n') {

index++;

j = index;

}

if (m == j) {

index++;

j = index;

}

}

}

}

class KeyTable {

List key=new ArrayList<>();

int code;

public KeyTable(List key, int code) {

this.key = key;

this.code = code;

}

}

感谢您使用本店文档您的满意是我们的永恒的追求!(本句可删)

------------------------------------------------------------------------------------------------------------

编译原理实验报告2

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:计算机软件实验室实验时间: 一、实验室名称:计算机实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时:4 四、实验原理: 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。 2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3. 状态转换图是有限有向图,是设计词法分析器的有效工具。 五、实验目的: 通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。

六、实验内容: 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 七、实验器材(设备、元器件). 1. 操作系统:Windows 7 2.开发工具:visual studio 2008 八、实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。 (2)建立相应的单词符号与种别对照表; (3)根据状态转换图编写相应的处理函数; (4)完成词法分析器; (5)编译与调试以上程序; (6)生成相应的*.dyd文件,作为后面语法分析的输入文件。 九、实验数据及结果分析 1.结构与分析

武汉理工大学-编译原理实验报告-中国好学长系列之小灰灰的爸爸

学生学号实验课成绩 武汉理工大学 学生实验报告书 实验课程名称《编译原理》 开课学院计算机科学与技术学院 指导老师姓名何九周 学生姓名小灰灰的爸爸 学生专业班级中国好学长系列 2013 —2014 学年第一学期

实验课程名称:编译原理 实验项目名称单词的词法分析器的设计实验成绩 实验者专业班级组别 同组者实验日期年月日第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 1.实验目的: 设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。 2.实验要求 要求:在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写;上机时应随带有关的高级语言教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。 3.实验报告的内容 (1)实验题目、班级、学号、姓名、完成日期; (2)待分析的某种语言子集的词法描述; (3)词法分析程序的功能; (4)详细的算法描述; (5)程序清单; (6)运行结果(给3组典型输入数据进行测试); (7)收获与体会。 二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或 者算法描述) 1.待分析的简单语言的词法: (1)关键字: bengin if then while do end 所有的关键字都是小写。 (2)运算符和界符: := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标志符(ID)和整形常数(NUM),通过以下正规式定义: ID=letter(letter|digit)* NUM=digit digit* (4)空格空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.各种单词符号对应的种别码

编译原理词法分析实验报告

一、目的(本次实验所涉及并要求掌握的知识点) 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析等) 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。

要求: 识别保留字:if、int、for、while、do、return、break、continue; 单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、、<、=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、);单词种别码为5。 三、实验使用环境(本次实验所使用的平台和相关软件) 平台:WindowsXP SP3 软件:MyElicpse 四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)1)定义常量及变量:

private JTextArea ta1; private JTextArea ta2; private JButton jb=new JButton("词法分析"); private JButton jb1=new JButton("清空文本区"); private JLabel jl1=new JLabel("输入源代码:"); private JLabel jl2=new JLabel("分析结果:"); static int m=0; //标识字符位置标记 static String str1 = new String(); String blz[]={"int","return","break","while","for","do","continue","if","else"}; 2)主要实现的函数: public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { int a=JOptionPane.showConfirmDialog(null, "确定清空吗?","提示! ",JOptionPane.YES_NO_OPTION); if( a==JOptionPane.YES_OPTION) { ta1.setText(""); ta2.setText(""); } } if(e.getSource()==jb) { String a=ta1.getText(); //把输入的软代码赋值给字符串变量a char[] b=new char[a.length()]; //把a中的字符一个一个放入字符数组b中 for(int i=0;i

编译原理词法分析报告+代码(C语言版)[1]

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

编译原理实验报告1

编译原理实验报告 某某: 班级: 学号: 自评:中

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,V ALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;V ALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,V ALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,本次试验用手工的方式(C语言)构造词法分析程序。根据文法和状态转换图直接编写词法分析程序。 四、基本实验题目 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:*********** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理实验报告

编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化

完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。

华科编译原理实验报告

课程实验报告课程名称:《编译原理》 专业班级: 学号: 姓名: 指导教师: 报告日期: 计算机科学与技术学院

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。

广工编译原理实验报告

广工编译原理实验报告 广工编译原理实验报告 一、实验目的 编译原理是计算机科学与技术专业中非常重要的一门课程,通过该课程的学习,我们可以了解到编译器的基本原理和实现方法。本实验的目的是通过实践,加 深对编译原理的理解,掌握编译器的设计和实现过程。 二、实验环境 本次实验使用的是C语言作为编程语言,使用的编译器是GCC。实验使用的操 作系统是Linux。 三、实验内容 本次实验的主要内容是设计一个简单的编译器,实现对一个简单的语言的词法 分析和语法分析。该语言是一种类似于C语言的语言,具有变量声明、赋值语句、条件语句和循环语句等基本功能。 四、实验步骤 1. 词法分析 词法分析是编译器的第一步,它将输入的源代码分解成一个个的单词或符号。 在本次实验中,我们需要设计一些正则表达式来描述各种单词的模式,并使用 有限自动机来实现词法分析器。 2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的单词序列转化为一个语法树。在本次实验中,我们需要设计一些文法规则来描述语言的语法结构,并使用自 顶向下的递归下降分析法来实现语法分析器。

3. 语义分析 语义分析是编译器的第三步,它对语法树进行分析,检查语法的正确性,并生 成中间代码。在本次实验中,我们需要设计一些语义规则来检查语法的正确性,并使用符号表来存储变量和函数的信息。 4. 代码生成 代码生成是编译器的最后一步,它将中间代码转化为目标代码。在本次实验中,我们需要设计一些规则来将中间代码转化为汇编语言,并使用汇编器将汇编代 码转化为机器码。 五、实验结果 经过实验,我们成功地设计并实现了一个简单的编译器。该编译器可以正确地 将输入的源代码转化为目标代码,并且可以正确地执行目标代码。通过本次实验,我们加深了对编译原理的理解,掌握了编译器的设计和实现过程。 六、实验总结 编译原理是一门非常重要的课程,通过学习和实践,我们可以了解到编译器的 基本原理和实现方法。本次实验通过设计和实现一个简单的编译器,加深了对 编译原理的理解,提高了我们的实践能力。希望通过今后的学习和实践,能够 进一步提高自己的编译器设计和实现的能力。

编译原理实验报告 词法分析

编译原理实验一·词法分析

一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。 功能要求如下所示: ·按单词符号出现的顺序,返回二元组序列,并输出。 ·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。 ·如果出现词法错误,报出:错误类型,位置(行,列)。 ·处理段注释(/* */),行注释(//)。 ·有段注释时仍可以正确指出词法错误位置(行,列)。 三、实验过程 1、词法形式化描述 使用正则文法进行描述,则可以得到如下的正规式: 其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A→(ID | NUM | RES | DEL | OPR) * ID→letter(letter | didit)* NUM→digit digit* letter→a | …| z | A | …| Z digit→0 | …| 9 RES→program | begin | end | var | int | and | or | not | if | then | else | while | do DEL→( | ) | . | ; | , OPR→+ | * | := | > | < | = | >= | <= | <>

计算机编译原理---词法分析器实验报告

编译原理 实验报告书

词法分析器 目录 1、摘要: (2) 2、实验目的: (2) 3、任务概述 (3) 4、实验依据的原理 (3) 5、程序设计思想 (5) 6、实验结果分析 (7) 7、总结 (9)

1、摘要: 本实验用C/C++高级语言编写词法分析程序,通过课堂上对词法分析器相关的背景知识的足够了解,清晰词法分析的过程,在脑海中形成词法分析的一般方案,根据方案一步步所要实现的目的,形成对词法分析器程序的模块划分和整体规划,最终实现一个词法分析器。具体要求能够通过扫描源程序分析出单词符号,将相应字符流转换成内码。 2、实验目的: 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的时间能力。通过本实验,掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法以及掌握词法分析的实现方法,并可以成功的上机调试编出词法分析程序。 3、任务概述 用C/C++实现对Pascal的子集程序设计语言的词法识别程序。 词法分析程序的主要工作为: (1)从源程序文件中读入字符。 (2)统计行数和列数用于错误单词的定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(内码,属性)二元式表示。 (5)根据需要是否填写标识符表供以后各阶段使用。 4、实验依据的原理 (1)词法分析器工作流程图

图1 词法分析器工作流程图 实现流程:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。词法分析的功能是输入源程序,输出单词符号。所依据的理论基础有有限自动机、正规式、正规文法。

计算机编译原理实验报告

编译原理实验报告 实验一词法分析设计 一、实验功能: 1、对输入的txt文件内的内容进行词法分析: 2、由文件流输入test.txt中的内容,对文件中的各类字符进行词法分析 3、打印出分析后的结果; 二、程序结构描述:(源代码见附录)

1、分别利用k[],s1[],s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。 2、bool isletter(){} 用来判断其是否为字母,是则返回true,否则返回false; bool isdigit(){} 用来判断其是否为数字,是则返回true,否则返回false; bool iscalcu(){} 用来判断是否为算术运算符,是则返回true,否则返回false; bool reserve(string a[]){} 用来判断某字符是否在上述四个表中,是则返回true,否则返回false; void concat(){} 用来连接字符串; void getn(){} 用来读取字符; void getb(){} 用来对空格进行处理; void retract(){}某些必要的退格处理; int analysis(){} 对一个单词的单词种别进行具体判断; 在主函数中用switch决定输出。 三、实验结果

四、实验总结 词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。对于一个字符的种别和类型可以用bool函数来判断,对于关键字和标示符的识别(尤其是3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好时候退格,否则将会导致字符漏读甚至造成字符重复读取。 我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。 将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。 实验二LL(1)分析法

编译原理实验报告2-词法分析程序的设计

实验2 词法分析程序的设计 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < = ( ) ; 关键字if then else while do 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、根据正规式,画出状态转换图;

词法分析器实验报告

词法分析器实验报告 词法分析器是编译器的一个重要组成部分,用于将输入的字符流转换成一个个词法单元(token)。 本次实验使用Python语言实现了一个简单的词法分析器。主 要包括以下几个步骤: 1. 预处理:去除源代码中的空格、换行符等无意义字符,并进行必要的错误检查。 2. 正则表达式定义词法单元:利用正则表达式定义源代码可以被识别为词法单元的模式。例如,整数可以定义为由数字组成的串,标识符可以定义为以字母或下划线开头,后面跟着任意个字母、数字或下划线的串。 3. 正则表达式匹配:利用Python的re模块,使用定义好的正 则表达式对预处理后的源代码进行匹配。如果匹配成功,则生成对应的词法单元,并存储起来。 4. 输出词法单元:将生成的词法单元按照一定的格式输出。 实验结果: 通过对不同的源代码进行测试,可以得到正确的词法单元输出。例如,对于以下的源代码: ```python

x = 123 + 456 * (789 - 100) ``` 经过词法分析器处理后,可以得到以下的词法单元输出: ``` Token(ID, 'x') Token(ASSIGN, '=') Token(INT, '123') Token(PLUS, '+') Token(INT, '456') Token(LPAREN, '(') Token(INT, '789') Token(MINUS, '-') Token(INT, '100') Token(RPAREN, ')') ``` 总结与收获: 通过本次实验,我对词法分析器的基本原理和实现方法有了更深入的了解。同时,我学会了如何使用正则表达式进行模式匹配,以及如何使用Python的re模块进行正则表达式匹配。这对于我进一步学习和理解编译原理以及编译器的工作原理有很大帮助。

(完整)编译原理实验报告(词法分析器 语法分析器)

(完整)编译原理实验报告(词法分析器语法分析器) 编辑整理: 尊敬的读者朋友们: 这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)编译原理实验报告(词法分析器语法分析器))的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。 本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)编译原理实验报告(词法分析器语法分析器)的全部内容。

编 译 原 理 实 验 报 告 实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号

2,识别出并输出简单语言的基本字.标示符.无符号整数。运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1)主程序 (2)扫描子程序 3 五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用

来表示正在分析的字符.字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include 〈stdio.h〉 #include

(完整word版)编译原理词法分析程序实现实验报告

(完整word版)编译原理词法分析程序实现实验报告 实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: GOTO 1:

(完整word版)编译原理词法分析程序实现实验报告 GOTO 2: 三、源程序代码部分 #include #include #include #define MAX 100 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3

#define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111 int count=0; int Class; void StoreType(); int Type[100]; char Store[20]={'\0'}; void ShowStrFile();//已经将要识别的字符串存在文件a中 void Output(int a,char *p1,char *p2);//字符的输出过程 int Sign(char *p);//'+''-''*''/'整体识别过程 int UnsignedNum(char *p);//是否适合合法的正整数0~9 int LegalCharacter(char *p);//是否是合法的字符:Sign(p)||UnsignedNum(p)||'E'||'.' void DistinguishSign(char *p);//'+''-''*''/'具体识别过程 void TypyDistinguish();//字符的识别过程 void ShowType();//将类别码存储在Type[100]中,为语法分析做准备 void ShowStrFile()//已经将要识别的字符串存在文件a中 { FILE *fp_s; char ch; if((fp_s=fopen("a.txt","r"))==NULL)

编译原理词法分析器实验报告

一、实验目的 设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的明白得。 二、实验要求 一、该个词法分析器要求至少能够识别以下几类单词: (1)关键字:else if int return void while共6个,所有的关键字都是保留字,而且必需是小写; (2)标识符:识别与C语言词法规定相一致的标识符,通过以下正那么表达式概念:ID = letter (letter | digit)*; (3)常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等; (4)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */; 二、分析器的输入为由上述几类单词组成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变成其对应的机内符,常数利用二进制形式,标识符利用相应的标识符表指针表示。 3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。 三、实验环境 实验环境为win7系统、vs2005。 四、实验内容 1、词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token)或(sum或fsum,对应二进制)组成的序列。 其中:syn为单词类别码; token为寄存的单词自身字符串; sum为整型常数; fsum为浮点型常数。 二、各类单词符号类别码如下表:

山东科技大学编译原理实验报告

(需要源代码请私信!请私信!) 编译原理实验报告 设计题目: 专业:班级: 设计人: 学号: 山东科技大学 2021年12 月4 日

指导教师对实验报告的评语 成绩: 指导教师签字: 年月日

目录 实验一词法分析之基于文法实现 (3) 1、实验目的 (3) 2、设计要求 (3) 3、设计说明 (3) 3.1需求分析 (3) 3.2概要设计 (4) 3.3详细设计 (4) 4、运行结果及分析 (11) 4.1测试数据及输出结果 (11) 4.2设计与思考 (11) 5、总结 (12) 实验二词法分析之基于Lex实现 (13) 1、实验目的 (13) 2、设计要求 (13) 3、设计说明 (13) 3.1需求分析 (13) 3.2概要设计 (13)

3.3详细设计 (16) 4、运行结果及分析 (17) 4.1测试数据及输出结果 (17) 4.2设计与思考 (19) 5、总结 (20) 实验三语法分析之递归下降分析法 (21) 1、实验目的 (21) 2、设计要求 (21) 3、设计说明 (21) 3.1需求分析 (21) 3.2概要设计 (22) 3.3详细设计 (23) (25) 4、运行结果及分析 (27) 4.1测试数据及输出结果 (27) 4.2设计与思考 (27) 5、总结 (28) 源代码 (29)

实验一词法分析之基于文法实现 1、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 2、设计要求 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇到错误时可显示“Error”,然后跳过错误部分继续显示) 3、设计说明 3.1需求分析 输入范围:基本保留字、标识符、常数、运算符、分隔符。 输出范围:对正确的单词,按照<单词内部编码,值>的形式进行输出。对不正确的单词,做出错误处理,并进行记录输出。 输出形式:该程序依照<单词内部编码,值>的形式每行一个进行输出,例如(1,"int")。 程序功能:读入单词,并依次输出各个单词的内部编码及单词符号自身值。 正确测试数据:int,},3,=,a 错误测试数据:==

词法分析器的实验报告

词法分析器的实验报告 词法分析器的实验报告 引言: 词法分析器是编译原理中的重要组成部分,它负责将源代码中的字符序列转换 为有意义的词法单元,为后续的语法分析提供基础。本实验旨在设计和实现一 个简单的词法分析器,并对其进行测试和评估。 实验设计: 1. 词法规则设计: 在开始实验之前,我们首先需要设计词法规则,即定义源代码中的合法词法单元。例如,对于一门类C的语言,我们可以定义关键字(如if、while、int等)、标识符、运算符(如+、-、*等)、分隔符(如()、{}等)等。 2. 有限自动机(DFA)的设计: 基于词法规则,我们可以设计一个有限自动机,用于识别和分析源代码中的词 法单元。有限自动机是一个状态转换图,其中每个状态代表一种词法单元,而 边表示输入字符的转换关系。 3. 实现代码: 根据有限自动机的设计,我们可以使用编程语言(如Python、C++等)实现词 法分析器的代码。代码的主要功能包括读取源代码文件、逐个字符进行词法分析、识别和输出词法单元。 实验过程: 1. 词法规则设计: 我们以一门简单的算术表达式语言为例,设计了以下词法规则:

- 数字:由0-9组成的整数或浮点数。 - 运算符:包括+、-、*、/等。 - 分隔符:包括括号()和逗号,。 - 标识符:以字母开头,由字母和数字组成的字符串。 2. 有限自动机(DFA)的设计: 我们基于词法规则,设计了一个简单的有限自动机。该自动机包含以下状态:- 初始状态:用于读取和识别源代码中的字符。 - 数字状态:用于识别和输出数字。 - 运算符状态:用于识别和输出运算符。 - 分隔符状态:用于识别和输出分隔符。 - 标识符状态:用于识别和输出标识符。 3. 实现代码: 我们使用Python编程语言实现了词法分析器的代码。代码主要包括以下功能:- 读取源代码文件。 - 逐个字符进行词法分析,根据有限自动机的设计进行状态转换。 - 识别和输出词法单元。 实验结果: 我们对几个测试样例进行了词法分析,并对结果进行了评估。结果显示,词法分析器能够正确识别和输出源代码中的词法单元,符合我们设计的词法规则。讨论与总结: 通过本次实验,我们设计并实现了一个简单的词法分析器。该词法分析器能够正确识别和输出源代码中的词法单元,为后续的语法分析提供了基础。然而,

相关主题
文本预览
相关文档 最新文档