搜档网
当前位置:搜档网 › 编译原理实验指导

编译原理实验指导

编译原理实验指导
编译原理实验指导

计算机图形学

实验指导书

课程名称: 编译原理

英文名称: Compiler Principle 课程性质: 必修/ 限选

编写人: 孔繁茹卢云宏

2010年9月1日

计算机学院

阅读说明

●未加标注的为必做实验

●标有★的为选做实验

实验要求

●每个小组不超过4人,需要完成以下任务

?必做实验: 全部完成(70%)

?实验1.1 (20%)

?实验1.2 (10%)

?实验1.3 (20%)

?实验1.4 (10%)

?选做实验: 至少完成3个★(30%)

?实验报告(10%)

●实验成绩上限(120%)

第1部分单元实验

实验1.1 根据状态转换图手工构造词法分析程序

一、实验目的

1. 理解词法分析器的基本功能

2. 理解词法规则的描述方法

3. 理解状态转换图及其实现

4. 能够编写简单的词法分析器

二、实验平台

C/C++

三、实验内容

手工构造一个简单的词法分析程序, 能够识别标识符、整数、关键字、算符、界符。

1. 画出识别所有单词的状态转换图。(若状态转换图过于复杂,可以只画出主要部分)

2. 根据状态转换图手工构造词法分析程序。从以下方法中选一:

?词法分析器可以作为独立的一遍

?也可以作为一个子程序被语法分析器调用

3. 实现状态转换图。从以下方法中选一:

?直接转向法

?表驱动法

四、设计文档

1. 画出状态转换图

?若通过正规式或正规文法手工转换得到,需写明转换步骤

?若通过正规式或正规文法编程转换得到,需附源程序清单

2. 分析直接转向法和表驱动法的优缺点

五、参考资料

1. 《程序设计语言编译原理》国防陈火旺3.2 词法分析器的设计

实验1.2 用LEX自动构造词法分析程序

一、实验目的

1.掌握词法分析程序的自动构造方法

2.掌握词法分析程序自动构造工具Lex的工作原理和使用方法

3.熟悉LEX源程序语法

4.学习使用自动构造软件SLex

二、实验平台

Windows + Slex

三、实验内容

1.实现以下步骤, 掌握SLex的工作过程

a) 构造LEX源程序, 例如命名为Test.Lex

b) 编译lex源程序,生成C语言词法分析程序lexyy.c

在DOS 命令提示符下执行编译Slex Test.Lex 得到目标文件lexyy.c

c) 改写生成的C语言代码lexyy.c ,增加主函数(如果没有)

main ( )

{ yylex(); }

d) 编译lexyy.c,产生可执行程序lexyy.exe

e) 运行生成的可执行文件lexyy < Test2.pl0

f) 察看运行结果,并对结果进行分析

2. 编写LEX源程序, 使其自动生成的C程序能够实现以下功能(至少完成2个)

?复制一个文件,将文件中每个非空的空白符号序列替换为单个空格

?将输入文件中的所有小写字母转换成大写字母,将转换后的文件存入另一个文件,

同时在屏幕上输出转换后的文件内容。

?输入一个C源程序文件, 将其中的所有关键字(即保留字)均转换为大写字母, 将转

换后的文件存入另一个文件,同时在屏幕上输出转换的关键字个数。

?将输入文件中的标识符输出到屏幕上。

?将输入文件中所有能被9整除的整数输出到屏幕上。

?为输入文件的每一行打印行行号。

?统计输入文件中的字符个数、字母个数、各类单词个数、行数。

(字符包括空格、制表符,不包括换行符)

?把一个文件改变为“Pig Latin”文.

假设该文件是一个用空白符分隔开的单词(字母串)序列, 每当你遇到一个单词时:

(1) 如果第一个字母是辅音字母, 则将它移到单词的结尾, 并加上ay

(2) 如果第一个字母是元音字母, 则只在单词的结尾加上ay

所有非字母的字符不加处理直接复制到输出

★3. 用Lex自动生成词法分析程序

?词法分析的输出存入文件中, 输出的单词序列格式可以自己定义

★4. 修正Slex的bug

Slex本身存在Bug,每次运行后不能正常退出。

注意:因此前已有学生完成了bug修正,所以只有提出不同的修正方案,或者更好的修正方案,才可以得分。

四、设计文档

1. 分析Test.lex的功能

2. 分析词法分析程序的自动生成原理

3. 分析自动生成的词法分析程序的结构

4. 若对Slex的bug进行了修正, 详细写出修正方案。

五、参考资料

1. lex源程序: Test.lex

2. 参考函数: atoi() –将字符串转换成整数。例如,调用atoi(“123”),得到整数123

实验1.3 递归下降分析

一、实验目的

1. 加深对递归下降分析的理解。

二、实验平台

Windows + VC

三、实验内容

1. 选择一个文法或自己设计一个文法(应与范例中的文法不同),写出文法接受的语言。

2. 对该文法进行LL(1)判别,若不是LL(1)文法,则进行等价变换。

3. 针对文法手工构造递归下降分析程序,实现以下功能:

?输入一符号串, 输出语法分析的结果(接受/出错)。

★从文件中读入若干个符号串, 依次输出语法分析的结果

★用可视化工具输出语法树

四、设计文档

1. 文法、文法描述的语言、预测分析表

五、参考资料

1. 递归下降分析程序: “2-递归下降.c ”

此程序对应的文法如下:

G: (1) E→TG

(2) G→+TG|-TG

(3) G→ε

(4) T→FS

(5) S→*FS|/FS

(6) S→ε

(7) F→(E)

(8) F→i

实验1.4 在Windows平台下使用Flex和Bison

一、实验目的

1. 学习使用词法分析程序自动构造工具Flex和语法分析程序自动构造工具Bison

二、实验平台

Windows + Flex + Bison

三、实验内容

1. 实现以下步骤, 掌握Flex和Bison的工作过程

a) 在DOS 命令提示符下依次执行以下两行命令

flex -olexyy.c calc.lex

bison -ocalc.c calc.y

b) 编译运行calc.c

c) 分析运行结果

2. 用Flex和Bison实现以下功能

(1) 扩充范例程序, 实现以下功能之一

?乘方、开方运算

?按位运算–与、或、非...

?三角函数运算– sin、cos...

?其他功能

(2) 编写Yacc程序,使其自动生成的C程序能够实现以下功能:

输入中缀表达式,输出后缀表达式

参考属性文法:

G: E →E+T {print ‘+’}

E →T

T →T*F {print ‘*’}

T →F

F →(E)

F →i {print ‘i’}

★(3) 扩充范例程序, 实现实数运算

★(4) 编写Yacc程序,使其自动生成的C程序能够实现以下功能:

输入二进制数,输出十进制数

参考属性文法

G: N →S1.S { N.v=S1.v+S.v*2-S.L }

S →S1B { S.v=S1.v*2+B.v, S.L=S1.L+1 }

S →B { S.v=B.v, S.L=1 }

B →0 { B.v=0 }

B →1 { B.v=1 }

★ (5) 对给定文法G编写Yacc程序,使其自动生成的C程序能够实现以下功能: 读入输入符号串,若输入符号串合法,则输出括号()的对数

G: S → ( L ) | a

L → L , S | S

参考语义规则:

S'→ S print (S. num)

S → ( L ) S. num := L.num + 1

S → a S. num := 0

L → L1 , S L. num := L1. num + S. num

L → S L. num := S.num

四、设计文档

1. 详细说明参考源程序calc.lex和calc.y实现的功能。

2. 介绍自己添加的新功能。附程序源码、测试用例。

3. 完成附加题目的同学,附语义规则、程序源码、测试用例

五、参考资料

1. 源程序: calc.lex calc.y

★实验1.5 用YACC自动构造语法分析程序

一、实验目的

1.掌握语法法分析程序的自动构造方法

2.掌握语法分析程序自动构造工具Yacc的工作原理和使用方法

3.熟悉Yacc源程序语法

4.学习使用自动构造软件Yacc

二、实验平台

Windows + Slex + Yacc

三、实验内容

用LEX和YACC自动构造一个PL/0程序的命令行解释程序,要求具有变量和常量定义语句Var和Const,具有基本输入输出语句Read 和Write,包含基本的算术运算+ 、-、*、/ 和( ) 运算,语句以分号(;)结束,整个程序以END结束。

1. 学习Y ACC语法的使用

2. 使用LEX构造词法分析程序yylex.c

3. 使用Y ACC构造语法分析程序

实现以下步骤, 掌握Yacc的工作过程

a) 构造YACC源程序, 例如命名为PL0.Y AC

b) 编译Yacc源程序,生成C语言语法分析程序pl0.C

在DOS 命令提示符下执行编译Y ACC pl0.yac

产生C语言代码pl0.C

c) 编译pl0.C,产生可执行程序pl0.exe

d) 在DOS 命令提示符下执行生成的pl0.exe

输入程序示例如下:

Const a =3 ;

Var b,c ;

Read(b);

c := a + b ;

Write(c) ;

END.

e) 察看运行结果,并对结果进行分析

四、设计文档

1. 解答: YACC所依据的文法是什么?

2. 分析语法分析程序的自动生成原理。

2. 分析生成的语法分析程序是如何工作的。

五、参考资料

1. Yacc源程序: pl0.yac

★实验1.6 用JFlex构造词法分析程序

一、实验目的

1. 学习使用Jflex

二、实验平台

Java

三、实验内容

1. 设计一个简单的语言,用正规式描述其词法规则。

2. 下载词法分析程序自动生成工具JFlex

JFlex本身采用Java语言编写,并且生成Java语言的词法分析源程序。

下载Flex,根据你自己的安装配置,修改JFlex安装目录下脚本文件bin\jflex.bat中的两个环境变量JFLEX_HOME 和JA V A_HOME的设置。然后运行JFlex附带的输入源文件例子,以验证你是否正确安装并配置了JFlex。

3. 生成词法分析程序

参考JFlex使用手册,构造词法分析程序。

四、设计文档

1. 语言、词法规则描述、附JFlex源文件。

五、参考资料

1. 相关链接:http://www.jflex.de/download.html

https://www.sodocs.net/doc/d27347840.html,/projects/jflex/

https://www.sodocs.net/doc/d27347840.html,/~appel/modern/java/JLex/

★实验1.7 用JavaCUP构造语法分析程序

一、实验目的

1. 学习使用JavaCUP

二、实验平台

Java

三、实验内容

1. 从附录中选择一个语言。

2. 下载语法分析程序自动生成工具JavaCUP

JavaCUP本身采用Java语言编写,并且生成Java语言的语法分析源程序。

下载JavaCUP,运行附带的输入源文件例子(一个基于命令行的简单计算器应用),以保证你正确安装并配置了JavaCUP。

3. 生成语法分析程序

参考JavaCUP使用手册,构造语法分析程序。

四、设计文档

1. 语言、语法规则描述、附JavaCUP源文件。

五、参考资料

1. 相关链接:http://www

https://www.sodocs.net/doc/d27347840.html,/projects/cup/

第2部分综合实验

★★实验2.1 理解Ansi C的文法规则

一、实验目的

1. 进一步理解Lex和Yacc的工作原理

2. 理解Ansi C的文法规则

二、实验平台

Lex + Yacc

三、实验内容

1. 阅读Ansi C 的Lex和Yacc源程序,理解词法和语法规则

2. 对Ansi C 的文法进行改进:

(1) 添加'+ +' 和'––' 操作符

提示: 在词法分析程序段添加正规式,同时在Yacc程序的前缀表达式和后缀表达

式中添加相应的文法规则,也可以只在Yacc程序段中添加文法规则。

(2) 限定标识符长度为32个字符,超过32个字符部分无效,并给出警告信息。

提示: 在词法分析程序段中添加计算标识符长度的函数,并根据计算结果做出相应

处理。、

五、参考资料

1. 参考源码: ANSI C grammar (Lex).htm

ANSI C grammar (Yacc).htm

★★★实验2.2 扩充PL/0编译程序

一、实验目的

1. 掌握自上而下的语法分析方法

2. 掌握递归子程序的书写方法

3. 了解编译器前端的实现过程

二、实验平台

C 或 Pascal

三、实验内容

从以下任务中选一:

1. 扩充条件语句为

<条件语句> ::= IF <条件> THEN <语句> [ ELSE <语句>]

2. 增加重复语句为

<重复语句> ::= REPEAT <语句> {; <语句>} UNTIL<语句>

3. 增加一维整型数组为

VAR <数组标识名> ( <下界> : <上界> )

4. 增加FOR语句

5. 增加CASE语句

6. 增加多维数组

四、设计文档

补充要求:

1. 写出对PL/0语言扩充语句的的一般步骤。

2. 给出PL/0扩充部分的语法描述图和巴科斯-瑙尔范式的文法表示。

3. 对程序的修改部分给出注释。

五、参考资料

1. 参考源码: PL0编译程序(Pascal版本/C版本)

★★★★★实验2.3 对选定的语言实现编译器前端

一、实验目的

1. 掌握编译器前端的实现过程

二、实验平台

任选

三、实验内容

1.选定附录中的一个文法,分析其描述的语言,确定语言中的终结符和非终结符。

若选了标注★的语言,则自起评点额外获得相应★数。

2.分析文法的二义性

3.编写源程序

?编写两个以上语法正确的源程序,要求用到该语言的所有语法结构。如果有可

能,你编写的源程序最好有实际意义,比如求平均值、阶乘、斐波那契序列等

?编写两个以上有语法错误的源程序,既包含词法错误,也包含语法错误

?以上源程序可作为测试用例

4.构造词法分析程序

?若文法中包含词法定义,将词法定义分离出来;否则自己补全词法定义。将词

法定义写成正规式的形式。

?可以采用手工构造方式,也可以选择自动生成方式

5.构造语法分析程序

?可以采用手工构造方式,也可以选择自动生成方式

?注意:若采用递归下降分析法,当文法不满足LL(1)条件时,需等价变换为LL(1)

文法

?对一个存在词法错误或语法错误的源程序,需至少指出一处语法错误的原因及

其位置(错误产生的位置定位允许有偏差)

?可尝试在错误中恢复并继续进行语法分析

6.为其添加相应的语义动作,生成中间代码。

?中间代码可以采用三地址代码或抽象语法树

五、参考资料

1. 参考源码:

附录

A. straight-line语言

Straight-line语言的简洁EBNF文法

Stm →Stm; Stm

Stm →id := Exp

Stm →print (ExpList)

Exp →id

Exp →num

Exp →Exp Binop Exp

Exp →(Stm, Exp)

ExpList →Exp, ExpList

ExpList →Exp

Binop →+

Binop →?

Binop →×

Binop →/

B. SimpleBlock语言

SimpleBlock语言的简洁EBNF文法

simpleblock ::= LBRACE { assignment } RBRACE

assignment ::= assignment_expression SEMICOLON

assignment_expression ::= IDENTIFIER EQ expression

expression ::= expression binary_operator expression

| LPAREN expression RPAREN

| IDENTIFIER

| INTEGER_LITERAL

binary_operator ::= PLUS | MINUS | MULT | DIV | MOD

一个SimpleBlock程序有一个内含0条或多条赋值语句的语句块组成,每条赋值语句由一个赋值表达式后跟分号(;)组成。

C. QTiny语言★

QTiny语言的文法表示

Program ( BEGIN StatementList END

StatementList ( StatementList Statement

| Statement

Statement ( Ident = Expr;

| READ(IdList);

| WRITE(ExprList);

IdList →IdList,Ident

| Ident

ExprList →ExprList, Expr

| Expr

Expr →Expr Op Factor

| Factor

Factor →(Expr)

| Ident

| INT

Op →+

| -

Ident →ID

Qtiny语言范例程序

BEGIN

READ(X,AB);

Z = (AB+(X+1));

WRITE(X,AB,Z,X-AB,X+AB,X+1);

END

D. Tiny语言★★

Tiny语言的文法表示

Program →stmt-sequence

stmt-sequence →stmt-sequence ; statement | statement

statement →if-stmt

| repeat-stmt

| assign-stmt

| read-stmt

| write-stmt

If-stmt →if expr then stmt-sequence end

| if expr then stmt-sequence else stmt-sequence end repeat-stmt →repeat stmt-sequence until expr

assign-stmt →identifier := expr

read-stmt →read identifier

write-stmt →write expr

expr →simple-expr comparison-op simple-expr

| simple-expr

comparision-op →< | =

simple-expr →simple-expr add-op term | term

add-op →+ | -

term →term multiple-op factor | factor

multiple-op →* | /

factor →(expr) | identifier | number

identifier →letter | letter number

number →digit | number digit

letter → a | b | … | z | A | B | … | Z

digit ( 0 | 1 | … | 9

E. C0语言★★★

C0语言的文法表示

<加法运算符> ::= +|-

<乘法运算符> ::= * |/

<关系运算符> ::= <|<=|>|>=|!=|==

<字符> ::= _|a|...|z|A|...|Z

<数字> ::= 0|<非零数字>

<非零数字> ::= 1|...|9

<字符串> ::= "{<合法字符> }"

//字符串中可以出现所有合法的可打印字符集中的字符<程序> ::= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数> <常量说明部分> ::= const<常量定义>{,<常量定义>};

<常量定义> ::= <标识符>=<整数>

<整数> ::= [+|-] <非零数字>{<数字>}|0

<标识符> ::= <字符>{<字符>|<数字>}

<声明头部> ::= int <标识符>

<变量说明部分> ::= <声明头部>{,<标识符>};

<子函数定义部分>::= (<声明头部>|void <标识符>)<参数><复合语句>

<复合语句> ::= ‘{’[<常量说明部分>][<变量说明部分>]<语句序列>‘}’<参数> ::= ‘(‘<参数表>‘)’

<参数表> ::= int<标识符>{,int<标识符>} | <空>

<主函数> ::= void main’(‘‘)’<复合语句>

<表达式> ::= [+|-] <项>{<加法运算符><项>}

<项> ::= <因子>{<乘法运算符><因子>}

<因子> ::= <标识符>|’(‘<表达式>‘)’|<整数>|<子函数调用语句> <语句> ::= <条件语句> | <循环语句>

| ’{‘<语句序列>‘}’

| <子函数调用语句>;|<赋值语句>;

| <返回语句>; | <读语句>; | <写语句>;

| ;

<赋值语句> ::= <标识符>=<表达式>

<条件语句> ::= if’(‘<条件>‘)’<语句>[else<语句>]

<条件> ::= <表达式><关系运算符><表达式>|<表达式>

<循环语句> ::= while’(‘<条件>‘)’<语句>

<子函数调用语句>::= <标识符>‘(‘<值参数表>‘)’

<值参数表> ::= <表达式>{,<表达式>}|<空>

<语句序列> ::= <语句>{<语句>}

<读语句> ::= scanf’(‘<标识符>‘)’

<写语句> ::= printf’(‘<字符串>,<表达式 >|<字符串>|<表达式 >‘)’<返回语句> ::= return [ ‘(‘<表达式>‘)’]

F. MiniJava语言★★★

MiniJava语言文法表示

Program →MainClass ClassDecl*

MainClass →class id { public static void main ( String [] id )

{ Statement }}

ClassDecl →class id { VarDecl* MethodDecl* }

→class id extends id { VarDecl* MethodDecl* }

VarDec →Type id ;

MethodDecl →public Type id ( FormalList )

{ VarDecl* Statement* return Exp ;}

FormalList →Type id FormalRest*

FormalRest →, Type id

Type → int []

→ boolean

→ int

→ id

Statement → { Statement* }

→ if ( Exp ) Statement else Statement

→ while ( Exp ) Statement

→ System.out.println ( Exp ) ;

→ id = Exp ;

→ id [ Exp ]= Exp ;

Exp → Exp op Exp

→Exp [ Exp ]

→ Exp . length

→ Exp . id ( ExpList )

→ INTEGER LITERAL

→ true

→ false

→ id

→ this

→ new int [ Exp ]

→ new id ()

→ ! Exp

→ ( Exp )

ExpList → Exp ExpRest*

ExpRest → ,Exp

MiniJava语言范例程序

class Factorial {

public static void main(String[] a) {

System.out.println(new Fac().ComputeFac(10));

}

}

class Fac {

public int ComputeFac(int num) {

int num_aux;

if (num < 1)

num_aux = 1;

else

num_aux = num * (https://www.sodocs.net/doc/d27347840.html,puteFac(num-1));

return num_aux;

}

}

编译原理实验(布置版)

编译原理实验(布置版) 实验一:基于有限自动机方法的简单词法分析程序的设计与实现 ——无符号实数识别程序 1、实验目的 通过本实验,使学生进一步熟悉词法分析程序所用的工具——自动机方法,掌握文法转换成自动机的技术及用C语言实现有穷自动机识别单词的方法。 2、实验内容 根据教材P46无符号实数的状态转换图,用C或C++语言编制识别无符号实数的程序。 要求:程序执行时,首先给出提示“Please input a unsigned real number:”,输入数据后,给出对该数据的分析结果信息如“The number is right!”或“The number is error!”,反复输入数据和分析,直到输入回车或其他键符,退出程序执行。 3、实验报告要求 按照实验报告模板格式要求组织内容,必须要有以下内容: (1)无符号实数词法分析的思想。 (2)无符号实数的文法和根据文法生成的状态转换图(即有穷自动机)。 (3)程序处理的流程图 (4)程序运行(测试)结果截图 (5)源程序清单 实验二:综合词法分析程序的设计与实现 1、实验目的 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 2、实验内容 (1)本程序自行规定: 关键字:“begin”,“end”,“if”,“then”,“else”,“while”,“write”,“read”,“do”,“call”,“const”,“char”,“until”,“procedure”,“repeat”。 运算符:“+”,“-”,“*”,“/”,“=” 界符:“{”,“}”,“[”,“]”,“;”,“,”,“.”,“(”,“)”,“:” 标识符:以字母开头的字符串。 空格、回车、换行符跳过。 (2)用C或C++语言编制程序,实现对下述一段源程序的词法分析。 //源程序文件位置及名称:F:\…\MY.TXT begin x:=9 if x>0 then x:=x+1; while a:=0 do b:=2*x/3; end;

编译原理实验指导

编译原理实验指导 实验安排: 上机实践按小组完成实验任务。每小组三人,分别完成TEST语言的词法分析、语法分析、语义分析和中间代码生成三个题目,语法分析部分可任意选择一种语法分析方法。先各自调试运行,然后每小组将程序连接在一起调试,构成一个相对完整的编译器。 实验报告: 上机结束后提交实验报告,报告内容: 1.小组成员; 2.个人完成的任务; 3.分析及设计的过程; 4.程序的连接; 5.设计中遇到的问题及解决方案; 6.总结。

实验一词法分析 一、实验目的 通过设计编制调试TEST语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验预习提示 1.词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示 成以下的二元式(单词种别码,单词符号的属性值)。 2.TEST语言的词法规则 |ID|ID |NUM →a|b|…|z|A|B|…|Z →1|2|…|9|0 →+|-|*|/|=|(|)|{|}|:|,|;|<|>|! →>=|<=|!=|== →/* →*/ 三、实验过程和指导 1.阅读课本有关章节,明确语言的语法,画出状态图和词法分析算法流程图。 2.编制好程序。 3.准备好多组测试数据。 4.程序要求 程序输入/输出示例:

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理实验词法解析总结器的设计及实现.doc

南华大学 计算机科学与技术学院 实验报告 ( 2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号

专业班级 地点教师 1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以 <种别码,值 >的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符 >::=< 字母 >|< 标识符 ><字母 >|< 标识符 ><数字 >

<常数 >::=< 数字 >|< 数字序列 ><数字 > <数字序列 >:: =<数字序列 ><数字 >|< 数字 >|<.> <字母 >::=a|b|c|??|x|y|z <数字 >::=0|1|2|3|4|5|6|7|8|9 <运算符 >::=< 关系运算符 >|< 算运算符 >|< 运算符 >|< 位运算符 >|< 运算符 > <算数运算符 >:: =+|-|*|/|...|-- <关系运算符 >:: =<|>|!=|>=|<=|== <运算符 >::=&&| || |! <位运算符 >::=&| | |! <运算符 >::==|+=|-=|/=|*= <分界符 >:: = ,|;|(|)|{|}|:| // |/**/ <保留字 >:: = main|if|else|while|do|for|...|void 2.符号的 符号种符号种 main0>26 if1>=27 else2<28 while3<=29 do4!30 for5!=31

编译原理实验指导书2010

《编译原理》课程实验指导书 课程编号: 课程名称:编译原理/Compiler Principles 实验总学时数: 8 适用专业:计算机科学与技术、软件工程 承担实验室:计算机学院计算机科学系中心实验室、计算机技术系中心实验室 一、实验教学的目的与要求 上机实习是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实习题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的2次上机实验都属于一种设计类型的实验,每个实验的训练重点在于基本的编译技术和方法,而不强调面面俱到;实验的目的是旨在使学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容;培养学生编制算法的能力和编程解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法设计和程序代码的编写;上机时应随带有关的编译原理教材或参考书;要学会程序调试与纠错。 每次实验后要交实验报告,实验报告的内容应包括: (1)实验题目、班级、学号、姓名、完成日期; (2)简要的需求分析与概要设计; (3)详细的算法描述; (4)源程序清单; (5)给出软件的测试方法和测试结果; (6)实验的评价、收获与体会。 开发工具: (1)DOS环境下使用Turbo C; (2)Windows环境下使用Visual C++ 。 考核: 实验成绩占编译原理课程结业成绩的10%。 三、单项实验的内容和要求: 要求每个实验保证每个学生一台微机。 实验一(4学时):单词的词法分析程序设计。 (一)目的与要求 1.目的 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

《编译原理实验》

《编译原理实验》 —LR分析器 院、系(部) 计算机科学与技术学院 专业及班级计算机科学与技术专业1403班 学号1408030322 姓名朱浩 日期2017年5月29日

一、实验目的与任务 设计一个非递归预测分析器,实现对表达式语言的分析,理解自上而下语法分析方法的基本思想,掌握设计非递归预测分析器的基本方法。 二、实验要求 建立文法及其LL(1)分析表表示的数据结构,设计并实现相应的预测分析器,对源程序经词法分析后生成的二元式代码流进行预测分析,如果输入串是文法定义的句子则输出“是”,否则输出“否”。 三、文法描述及其LL(1)分析表 表达式语言(XL) 的语法规则如下: 1.程序→ 表达式; 2.|表达式;程序 3.表达式→ 表达式+ 项 4.|项 5.项→ 项* 因式 6.|因式 7.因式→ num_or_id 8.|(表达式) 将该语言的文法转换为如下的LL(1)文法: 1prgm → expr;prgm’ 8 term → factor term’ 2prgm’ → prgm 9 term’ → *factor term’ 3prgm’ →ε 10 term’ →ε 4expr → term expr’ 11 factor → (expr) 5expr →ε 12 factor → num 6expr’ → +term expr’ 13 system_goal → prgm 7expr’ →ε

四、文法及其LL(1)分析表的数据结构 文法的产生式可用数组Yy_pushtab[]存放。数组的第一个下标是产生式号,第一个产生式的序号为0;每列按逆序存放该产生式右部各符号的常数值,并以0结束。对于该表达式语言XL的LL(1)分析表,可用数组Yy_d[]存放。第一个下标是非终结符数值,第二个下标是终结符数值,数组元素的值为:0(表示接受) ,1(表示产生式号) ,-1(表示语法错) 。 数组Yy_d[]的具体内容及表示如下: 0 1 2 3 4 5 6 prgm 256 prgm’ 257 expr 258 term 259 expr’ 260 factor 261 term’ 262 system_goal 263 数组Yy_pushtab[]的具体内容及表示如下:

编译原理实验题目及报告要求

编译原理上机实验试题 一、实验目的 通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术, 如何针对确定的有限状态自动机进行编程序;熟悉和 掌握程序设计语言的语法分析程序的设计原理、熟悉 和掌握算符优先分析方法。 二、实验要求 本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告); ③要编写出完成相应任务的程序并在计算机上准确 地运行;④实验结束后要写出上机实验报告。 三、实验题目 针对下面文法G(S): S→v = E E→E+E│E-E│E*E│E/E│(E)│v │i 其中,v为标识符,i为整型或实型数。要求完成 ①使用自动机技术实现一个词法分析程序; ②使用算符优先分析方法实现其语法分析程序,在 语法分析过程中同时完成常量表达式的计算。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第一项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理: (1)单词分类:标识符,保留字,常数,运算符,分隔符等等 (2)单词类型编码 (3)自动机 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第二项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理:构造出算法优先关系表 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

《编译原理》实验指导书-2015

武汉科技大学计算机科学与技术学院 编译原理实验指导书

实验一词法分析器设计 【实验目的】 1.熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。 2.复习高级语言,进一步加强用高级语言来解决实际问题的能力。 3.通过完成词法分析程序,了解词法分析的过程。 【实验内容】 用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常数以及界符)输出。 【实验要求】 1.要求绘出词法分析过程的流程图。 2.根据词法分析的目的以及内容,确定完成分析过程所需模块。 3.写出每个模块的源代码,并给出注释。 4.整理程序清单及所得结果。 【说明】 运行成功以后,检查程序,并将运行结果截图打印粘贴到实验报告上。 辅助库函数scanerLib设计以及使用说明: 下面内容给出了一个辅助库函数的接口说明以及具体实现。 接口设计 //字符类 class Token { TokenType type; String str; Int line; } //词法分析结果输出操作类 class TokenWriter { ArrayList tokens; //用来记录所识别出来的token TokenWriter(); //构造函数指定输入文件名,创建文件输出流 V oid Add(Token); //将词法分析器中分析得到的Token添加到tokens中 WriteXML(); //将tokens写出到目标文件.xml中 } //词法分析操作词法分析生成文件接口<暂时不需要对该类的操作;下一步做语法分析的时候使用> class TokenReader

编译原理实验二

编译原理二 -------词法分析器一.问题描述 词法分析程序的功能: 输入源程序,输出单词符号,如图所示: 单词符号 处理过程:在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。 二.需求分析 1.对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词类型,单词符号)显示; 2.可以将要分析的程序保存到文件中进行读取; 3.删除无用的空白字符、回车符、及其它非实质性符号。 三.程序设计 本程序规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"

(2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 对于一段可能的输入代码,其结果在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 关键字或标识符的判断:读入一串字符,将ASCII码在字母范围的字符存入数组中,将该数组与设置好的关键字比较,如果相等则输出是关键字,否则继续读入直至下一字符既非数字也非字母,输出为标识符; 数字的判断:若跟在字母后面则一起输出为标识符,否则输出为数字; 界符、运算符的判断:直接判断其ASCII码 运行过程为: 1.预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除多余的空格; 2.源程序字符数组中获得单词, 编码为二元式.:二元式采用结构体数组存储, 把单词类型和词元记录下来。

《编译原理》实验指导书

《编译原理》实验指导书 实验目的和内容 编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法,并加深对编译技术的认识。 实验内容共需实现编译器的词法、语法和语义分析程序三个组成部分。要求学生必须完成每个实验的基本题目要求,有余力的同学可尝试实验的扩展要求部分。 实验报告 要求每人针对所完成的实验内容上交一份实验报告,其中主要包括三方面内容:1、实验设计:实验采用的实现方法和依据(如描述语言的文法及其机内表示,词分析 的单词分类码表、状态转换图或状态矩阵等,语法分析中用到的分析表或优先矩阵等,语法制导翻译中文法的拆分和语义动作的设计编写等);具体的设计结果(应包括整体设计思想和实现算法,程序结构的描述,各部分主要功能的说明,法以及所用数据结构的介绍等)。 2、程序代码:实验实现的源程序清单,要求符合一般的程序书写风格,有详细的注释。 3、实验结果分析:自行编写若干源程序作为测试用例,对所生成的编译程序进行测试 (编译程序的输入与输出以文件的形式给出);运行结果分析(至少包括一个正确和一个错误单词或语句的运行结果);以及改进设想等。 注意事项 1、电子版实验报告和源程序在最后一次机时后的一周内上交。(每个同学上交一个压 缩文件,其命名格式为“学号_姓名.rar”,内含实验报告和一个命名为“源程序” 的文件夹。注意提交的源程序应是经过调试、测试成功的较为通用的程序,并应有相应的注释、运行环境和使用方法简介。) 2、不接受不完整的实验报告和没有说明注释的源程序,或者说明与程序、运行结果不 符合的作业。 特别鼓励:扩展题目 1、为亲身经历一个小型编译器的开发全过程,触摸一下与实际编译器开发相关的工作, 大家可以自由组成3人左右的小组,推举组长,模拟一个团队分工协作开发大型软件的实战环境,融入软件工程的思想规范和一般理论方法,初步体验从系统分析设计、编码测试到交付维护的一个完整编译器软件的开发过程。要求组长为每个小组成员分配主要负责的任务,完成相应的分析设计员、程序员和测试员等角色的工作,并以小组为单位提交一份实验报告和源程序,在报告封面上写明每个同学主要完成和负责的部分。 2、以组为单位完成的实验内容至少必须整合词法、语法和语义三个部分的实验,对于 选定的适当规模的文法(如C语言的一个大小适宜的子集),进行系统的总体设计、功能分析、编码测试等工作。完成一个从对源程序的词法分析开始,到中间代码生成的完整的编译器前端的开发,使所涉及到的编译系统的各个组成模块有机地衔接在一起,提交一份完整的实验报告和源程序,并将以下几个方面描述清楚:

编译原理实验 中间代码生成

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表 达式也称做后缀式。 2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。 3、三元式:形式序号:(op,arg1,arg2) 4、四元式:形式(op,arg1,arg2,result) 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。 (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。 (4)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。 四、程序代码: //这是一个由中缀式生成后缀式的程序 #include<> #include<> #include<> #include<> #define maxbuffer 64 void main() { char display_out(char out_ch[maxbuffer], char ch[32]); //int caculate_array(char out_ch[32]); static int i=0; static int j=0; char ch[maxbuffer],s[maxbuffer],out[maxbuffer]; cout<<"请输入中缀表达式: ";

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

编译原理实验指导书

编译原理 实 验 指 导 书 作者:莫礼平 2011年3月

实验一简单词法分析程序设计 一、实验目的 了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造方法。 二、实验内容 1、了解编译程序的词法分析过程。 2、根据PASCAL语言的说明语句形式,用手工方法构造一个对说明语句进行词法分析的程序。该程序能对从键盘输入或从文件读入的形如: “const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;” 的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。 三、实验要求 1、输入的常量说明串,要求最后以分号作结束标志; 2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容; 3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线; 4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定 义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定 义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号, 不以0开头的若干数字加上小数点再后跟若干数字的组合; 5、统计并输出串或文件中包含的各种类型的常量个数; 6、以二元组(类型,值)的形式输出各常量的类型和值; 7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编 译器对不同错误情况做出相应处理。 四、运行结果 1、输入如下正确的常量说明串: const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=‘@’,str2=“aa!+h”; 输出: count(integer,10) sum(float,81.5) char1(char, ‘f’) max(integer,169) str1(string,“h*54 2..4S!AAsj”) char2(char, ‘@’) str2(string,“aa!+h”) int_num=2; char_num=2; string_num=2; float_num=1. 2、输入类似如下的保留字const错误的常量说明串: Aconstt count=10,sum=81.5,char1=‘f’; 输出类似下面的错误提示信息:

编译原理实验1

大学学生实验报告 开课学院及实验室:年月日 实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 针对表达各类词语的一组正规表达式,设计一个确定化的最简的有限自动机,对输入的符号串进行单词划分及词类识别。 实验容 将词法分析器分解为以下几个部分: 1.正规表达式的解析:将正规表达式中的符号分解为常量字符、正规表达 式标识符和正规表达式运算符,然后基于正规表达式运算将正规表达式 分解为更小的正规表达式(通过正规表达式运算符进行串接)。 2.正规表达式到NFA的转换:根据转换规则,基于正规表达式运算,将正 规表达式转换为非确定有限自动机,并确定各类词的终止状态。

3.NFA的确定化:通过计算各状态的传递闭包,将NFA确定化,并确定 各类词的终止状态。 4.最小化:通过子集法,求得最简的确定有限自动机,并确定各类词的终 止状态。 例如:分析C语言子集的词法 1)关键字 main if else int return void while (都是小写)2)专用符号 = + —* / < <= < >= = = != ;:,{ } [ ] ( ) 3)其他模式(正规表达式) STRING::=" [^"]* ID::=letter(letter|digit)* INT::=digit digit* letter::= a|…|z|A|…|Z digit::= 0|…|9 4)空格由空白、制表符和换行符组成 空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。 部分单词符号对应的种别码

词法分析程序的功能 输入:所给文法的源程序字符串 输出:二元组(syn, token或sum)构成的序列。其中syn 为单词种别码;token 为存放的单词自身字符串;sum为整型常量(作为常量的值)。实现时,可将单词的二元组用结构进行处理 代码: #include #include

编译原理实验-词法分析器的设计说明

集美大学计算机工程学院实验报告 课程名称:编译原理班级: 指导教师:: 实验项目编号:实验一学号: 实验项目名称:词法分析器的设计实验成绩: 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 二、实验容 编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 三、实验要求 1、词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符 2 别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。 3、编程语言不限。

四、实验设计方案 1、数据字典 本实验用到的数据字典如下表所示:

3、实验程序 #include #include #include #include //判断读入的字符是否为字母 bool isLetter(char c){ if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){ return true; } else return false; } //判断读入的字符是否为数字 bool isDigit(char c){ if(c >='0' && c <= '9'){ return true; } else return false; } //判断是否为关键字 bool isKey(char *string) { if(!strcmp(string,"void") || !strcmp(string,"if")|| !strcmp(string,"for")|| !strcmp(string,"wh ile") || !strcmp(string,"do")|| !strcmp(string,"return")|| !strcmp(stri ng,"break") || !strcmp(string,"main")|| !strcmp(string,"int")|| !strcmp(strin g,"float")|| !strcmp(string,"char") || !strcmp(string,"double")|| !strcmp(string,"String"))

编译原理实验指导

编译原理实验指导书 主编:徐静李娜 信息与电气工程学院 2010年3月

概述 一、本课程实验的目的和任务 编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。 二、实验方法 任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求 每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、实验目的 二、程序设计时采用的算法和方法 三、输入的源程序 四、词法分析程序清单和输出结果。 五、心得体会

实验一词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2. 单词的BNF表示 <标识符>→ <字母><字母数字串> <字母数字串>→<字母><字母数字串>|<数字> <字母数字串>| <下划线><字母数字串>|ε <无符号整数>→<数字> <数字串> <数字串>→<数字><数字串>|ε <加法运算符>→+ <减法运算符>→- <大于关系运算符>→> <大于等于关系运算符>→>= 3. “超前搜索”方法

编译原理实验指导书-语法分析

编译原理实验指导书 实验2 语法分析 实验目的 1.巩固对语法分析的基本功能和原理的认识。 2.通过对语法分析表的自动生成加深语法分析表的认识。 3.理解并处理语法分析中的异常和错误。 实验要求 一、对学生要求: 1.掌握语法分析程序的总体框架,并将其实现。 2.掌握语法分析表的构造方法 3.掌握语法分析的异常和错误处理。 二、对实验指导教师要求: 1.明确语法分析的基本功能和原理。 2.语法分析程序的总体结构及其关键之处。 3.语法分析表的生成程序。 4.语法分析的异常和错误处理。 5.编写并运行该题目程序代码,具有该题目的参考答案。 6.深刻理解题目内涵,能够清晰描述问题,掌握该题目涉及的知识点,指导学生实验时需要注意的问题。 实验内容 采用至少一种语法分析技术(LL(1)、SLR(1)、LR(1)或LALR(1))分析类高级语言中的基本语句(至少包括函数定义、变量说明、赋值、循环、分支等语句)。 对如下工作进行展开描述 (1)给出如下语言成分的文法描述 ?函数定义(或过程定义) ?变量说明 ?赋值

?表达式 ?循环 ?分支 (2) 语法分析程序的总体结构及物理实现(程序框图) (3) 核心数据结构和功能函数的设计 (4) 错误处理 错误的位置及类型等 实验评分标准 一、课堂表现(10分) 1.出勤情况(按时,迟到,早退,缺席) 2.是否遵守课堂纪律 二、实验结果(50分) 1.当堂按时完成(10分) 2.独立完成(10分),(和同学协商完成,在老师帮助下完成)3.结果正确无误(15分)其中分析表的输出占5分 4.功能齐全,界面美观,具有较好演示效果(10分) 5.在源程序中有必要的注释和说明,程序文档齐全(5分)三、实验报告(40分) 1.语言的文法描述(10分) 2.语法分析程序的模块结构图(10分) 3.核心数据结构的设计(10分) 4.错误处理(5分) 5.实验过程中遇到的问题的总结及实验的体会(5分)

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

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的: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 #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

相关主题