文档库 最新最全的文档下载
当前位置:文档库 › 实验二--语法分析报告程序的设计-

实验二--语法分析报告程序的设计-

实验二--语法分析报告程序的设计-
实验二--语法分析报告程序的设计-

实验二语法分析程序的设计

:学号:专业班级

一、实验目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法。

二、实验容

设计一个文法的预测分析程序,判断特定表达式的正确性。

三、实验要求

1、给出文法如下:

G[E]

E->T|E+T;

T->F|T*F;

F->i|(E);

2、根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,

利用C语言或C++语言或Java语言实现;

3、利用预测分析程序完成下列功能:

1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;

2)读入文本文件中的表达式;

3)调用实验一中的词法分析程序搜索单词;

4)把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;

5)完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换(见实验二附加资料1)。

四、实验环境

PC微机

DOS操作系统或Windows 操作系统

Turbo C 程序集成环境或Visual C++ 程序集成环境

五、实验步骤

1、分析文法,将给出的文法转化为LL(1)文法;

2、学习预测分析程序的结构,设计合理的预测分析程序;

3、编写测试程序,包括表达式的读入和结果的输出;

4、测试程序运行效果,测试数据可以参考下列给出的数据。

六、测试数据

输入数据:

编辑一个文本文文件expression.txt ,在文件中输入如下容:

正确结果:

(1)10;

输出:正确

(2)1+2;

输出:正确

(3)(1+2)*3+(5+6*7);

输出:正确

(4)((1+2)*3+4

输出:错误

(5)1+2+3+(*4+5)

输出:错误

(6)(a+b)*(c+d)

输出:正确

(7)((ab3+de4)**5)+1

输出:错误 七、源代码

import java.util.*; import java.io.*; public class test2 {

static String[] key_word = { "main", "if", "then", "while", "do", "int",

"else" };

static String[] cal_word = { "+", "-", "*", "/", "<", ">", "{", "}", "(",

")", "[", "]", "==", "!=", "!", "=", ">=", "<=", "+=", "-=", "*=",

"/=", ";" };

/* * 给定文法G[E]: E->T|E+T; T->F|T*F; F->i|(E); */ static String[] gram = { "E->TA", "A->+TA", "A->", "T->FB", "B->*FB", "B->", "F->P", "F->(E)" };

static String[] followE = { ")", "#" };

static String[] followEA = { ")", "#" };

static String[] followT = { "+", ")", "#" };

static String[] followTB = { "+", ")", "#" };

static String[] followF = { "*", "+", ")", "#" };

static String[] firstE = { "i", "(" };

static String[] firstEA = { "+", "" };

static String[] firstT = { "i", "(" };

static String[] firstTB = { "*", "" };

static String[] firstF = { "i", "(" };

static String[][] list = { { "", "i", "+", "*", "(", ")", "#" }, { "E", "TA", null, null, "TA", null, null },

{ "A", null, "+TA", null, null, "", "" },

{ "T", "FB", null, null, "FB", null, null },

{ "B", null, "", "*FB", null, "", "" },

{ "F", "i", null, null, "(E)", null, null } };

public static void scan(String infile,String outfile, Stack[] word, Stack[] expression)throws Exception { java.io.File file = new java.io.File(infile);

Scanner input = new Scanner(file);

java.io.PrintWriter output = new PrintWriter(outfile);

int count = 0;

word[count].push("#");

while (input.hasNext()) {

String tmp = input.next();

int i = 0;

while (i < tmp.length()) {

if (tmp.charAt(i) <= '9' && tmp.charAt(i) >= '1') {//检查十进制数字

String num = "";

while (tmp.charAt(i) <= '9' && tmp.charAt(i) >= '0') {

num += tmp.charAt(i);

i++;

if (i == tmp.length())

break;

}

output.println("< " + 1 + ", " + num + ">");

word[count].push("i");

expression[count].push(num);

}

if (i + 2 < tmp.length())// 检查十六进制数字

if (tmp.charAt(i) == '0' && tmp.charAt(i + 1) == 'x') {

i += 2;

String num = "";

while ((tmp.charAt(i) <= '9' && tmp.charAt(i) >= '0') ||

(tmp.charAt(i) <= 'f' &&

tmp.charAt(i) >= 'a')) {

num += tmp.charAt(i);

i++;

if (i == tmp.length())

break;

}

output.println("< " + 3 + ", " + num + ">");

word[count].push("i");

expression[count].push(num);

}

if (i + 1 < tmp.length())// 检查八进制数字

if (tmp.charAt(i) == '0') {

i++;

String num = "";

while (tmp.charAt(i) <= '7' && tmp.charAt(i) >= '0') {

num += tmp.charAt(i);

i++;

if (i == tmp.length())

break;

}

output.println("< " + 2 + ", " + num + ">");

word[count].push("i");

expression[count].push(num);

}

// 检查关键字和变量

if (i < tmp.length()) {

if (i < tmp.length() && tmp.charAt(i) >= 'a'

&& tmp.charAt(i) <= 'z') {

String tmp_word = "";

while (tmp.charAt(i) >= 'a' && tmp.charAt(i) <= 'z') {

tmp_word += tmp.charAt(i);

i++;

if (i == tmp.length())

break;

}

boolean is_keyword = false;

for (int j = 0; j < key_word.length; j++) {

if (tmp_word.equals(key_word[j])) {

output.println("< " + key_word[j] + ", " + "->");

word[count].push(key_word[j]);

expression[count].push(key_word[j]);

is_keyword = true;

break;

}

}

if (!is_keyword) {

output.println("< " + 0 + ", " + tmp_word + ">");

word[count].push("i");

expression[count].push(tmp_word);

}

}

}

// 检查运算符以及';'

if (i < tmp.length()) {

if (i + 1 < tmp.length()) {

if (tmp.charAt(i + 1) == '=') {

for (int j = 0; j < cal_word.length; j++) {

if (cal_word[j].equals("" + tmp.charAt(i)

+ tmp.charAt(i + 1))) {

output.println("< " + cal_word[j] + " ,"

+ "->");

word[count].push(cal_word[j]);

expression[count].push("-");

if (word[count].peek() == ";") {

word[count].pop();

word[count].push("#");

count++;

word[count].push("#");

}

i += 2;

break;

}

}

}

}

for (int j = 0; j < cal_word.length; j++) {

if (cal_word[j].equals("" + tmp.charAt(i))) {

output.println("< " + cal_word[j] + ", " + "->");

word[count].push(cal_word[j]);

expression[count].push(cal_word[j]);

if (word[count].peek() == ";") {

word[count].pop();

word[count].push("#");

count++;

word[count].push("#");

}

i++;

break;

}

}

}

}

}

input.close();

output.close();

}

}

public static void main(String[] args) throws Exception { String infile = "D:/expression.txt";

String outfile = "D:/result2.txt";

Stack[] tmpword = new Stack[20];

Stack[] expression = new Stack[20];

for (int i = 0; i < tmpword.length; i++) {

tmpword[i] = new Stack();

expression[i] = new Stack();

}

test1.scan(infile, outfile, tmpword, expression);

int i = 0;

while (tmpword[i].size() > 2){

String[] tmp = expression[i].toArray(new String[0]);

printArray(tmp);

isLL1(tmpword[i]);

i++;

}

}

public static void printArray(String[] s){

for (int i = 0; i < s.length; i++){

System.out.print(s[i]);

}

System.out.println();

}

public static void isLL1(Stack tmpword){

String[] input = tmpword.toArray(new String[0]);

int inputCount = 0;

Stack status = new Stack();

status.push(input[inputCount++]);

status.push("E");

boolean flag = true;

boolean result = true;

while (flag) {

编译原理(语法分析程序设计)

一、实验内容和目的 1. 已知待分析的C语言子集的语法,用EBNF表示如下: (1)<程序>→main()<语句块> (2)<语句块>→“{” <语句串>“}” (3)<语句串>→<语句>{;<语句>} ; (4)<语句>→<赋值语句>|<条件语句>|<循环语句> (5)<赋值语句>→ID=<表达式> (6)<条件语句>→if(条件)<语句块> (7)<循环语句>→while(<条件>)<语句块> (8)<条件>→<表达式><关系运算符><表达式> (9)<表达式>→<项>{+<项>}|<项>{-<项>} (10)<项>→<因子>{*<因子>}|<因子>{/<因子>} (11)<因子>→ID|NUM|(<表达式>) (12)<关系运算符>→<|<=|>|>=|==|!= 2. 实验目的、要求实现的功能 实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。 实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。 3. 将实验方法改写为适合预测分析法的文法如下: (1) <程序>→main()<语句块> (2)<语句块>→{ <语句串>} (3)<语句串>→<语句>; <语句串> (3_1) <语句串>→ε (4)<语句>→<赋值语句> (5)<语句>→<条件语句> (6) <语句>→<循环语句> (7)<赋值语句>→ID=<表达式> (8)<条件语句>→if(<条件>)<语句块> (9)<循环语句>→while(<条件>)<语句块> (10)<条件>→<表达式><关系运算符><表达式> (11)<表达式>→<项><表达式`> (11_1)<表达式`>→+<项><表达式`> (11_2)<表达式`>→-<项><表达式`> (11_3)<表达式`>→ε (12) <项>→<因子><项`> (12_1) <项`>→*<因子><项`> (12_2)<项`>→/<因子><项`> (12_3)<项`>→ε (13) <因子>→ID (14) <因子>→NUM (15) <因子>→(<表达式>) (16) <关系运算符>→< (17) <关系运算符>→<=

语法分析程序的要求

语法分析程序大作业 一、作业目的和要求 通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如LL(1)、递归下降分析法、LR、算符优先分析法)等,作为编制语法分析程序的依据,对词法分析器所提供的单词序列进行语法检测和结构分析,实现并进一步掌握常用的语法分析方法。 二、作业内容 选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象(例如表达式、if、while、for等等),给出其文法规则描述(注意,文法规则的描述要符合所选分析方法的要求,比如用LL(1)分析法,文法必须是LL(1)文法),设计并实现一个完整的语法分析程序。 输入:源程序以文件的形式输入。 输出:对于输入的源程序,如果输入源程序是给定文法定义的合法程序,则输出”success”,如果不是,即输入源程序有错误,则输出“Error”,并且尽可能指出出错位置和原因。 三、作业要求 1、说明语法分析的源语言是什么? 能分析的语法成分有哪些(比如if、while、表达式、switch等等)。 给出每个语法规则的文法描述。(可以自定义语法成分,设计合理的语法规则。) 2、说明选择的语法分析方法是哪种?描述总体设计思路和主要的流程图。 3、编程实现,程序中编写的各种函数,需要给出注释,说明函数的作用。 四、结果分析 1、输入正确的源程序截图: 输出结果截图: 2、输入错误的源程序截图: 输出结果截图: 3、总结(自己的心得体会、你编写的语法分析程序的优缺点) 作业分工 上交内容:将以下文件打包压缩,压缩包命名:班级学号姓名_语法分析大作业 学号姓名以组长名字命名即可 1、本报告 2、语法分析程序代码 3、编译生成可执行程序 4、用于测试的源程序代码文件。

编译原理 语法分析器 (java完美运行版)(精选.)

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

程序设计实验报告

学生实验报告 院系:测绘学院 专业班级:测绘13级3班 学号:2013305517 学生姓名:王泽 指导教师:郭辉老师 2016年05月20日

安徽理工大学实验报告 实验课程名称:数据结构与软件开发上机实验 开课院系及实验室:测绘学院红楼二楼机房 实验1 编程基本知识练习 实验目的: 通过该实验课内容的练习,学生应掌握VB 编程的基本语法、变量的定义、数组(动态数组)的定义、VB 语言中子过程与函数的定义以及文本文件的读写等知识。 实验内容: 1)变量的定义动态数组的定义与应用; 2)矩阵的加、减、乘运算(定义Sub()子过程或Function()来实现); 3)数据文件的建立、数据的读取与写入。 实验步骤: 1.编辑界面 1.1 打开VB 编程工具,进入编程主界面。

1.2 在窗体上新建“读入数据”和“输出数据”两个按钮。 1.3 双击“窗体”进入代码输入界面,进行代码编辑。 2.用VB 编写的源代码 2.1 矩阵基本运算源码详见附录一。 (1)两矩阵相加 (2)两矩阵相减 (3)矩阵转置 (4)两矩阵相乘 (5)矩阵求逆 2.2 文本文件(本实验中data.txt)的读取源代码 (1)建立文本文件并输入数据 在桌面上新建一“data.txt” ( 文本文件路径为C:\Users\ WH\Desktop\练习\data.txt”)。输入以下内容: 6,7,4,0.005 A,35.418 B,45.712 C,25.270

D,24.678 在桌面上新建一“result.txt” ( 文本文件路径为C:\Users\ WH\Desktop\练习\result.txt”)。(2)从文本文件中读数据 Dim linedata as string, m_GaochaN as integer,m_Pnumber as integer,m_knPnumber as integer,M as Double,k1 as integer 'linedata 为存储文本文件一行信息的字符串变量 Dim a() as String,H() as Double 'a()为存储点名,H()存储高程 Open“C:\Users\ WH\Desktop\练习\data.txt”For Input As #1 Line Input #1, linedata k = Split(linedata, ",") m_GaochaN = Val(k(0)) m_Pnumber = Val(k(1)) m_knPnumber = Val(k(2)) M = CDbl(k(3)) For k1 = 1 To m_knPnumber Line Input #1, linedata k = Split(linedata, ",") a(k1)= k(0) GetstationNumber (a) H(k1) = CDbl(k(1)) Next Close #1 (3)将读入点名存储到点名数组中,且返回该点名所对应编号 Function GetstationNumber(name As String) Dim i As Integer For i = 1 To m_Pnumber If P_Name(i) <> "" Then '将待查点名与已经存入点名数组的点比较 If P_Name(i) = name Then GetstationNumber = i Exit For End If Else '待查点是新的点名,将新点名放到P_Name 数组中 P_Name(i) = name GetstationNumber = i Exit For End If Next i End Function (4)从文本文件中写数据(将从data.txt 读入的数据,写入到result.txt 文件中) Open“C:\Users\ WH\Desktop\ 练习\result.txt” For Output As #1 outstring = outstring + str(m_GaochaN) +","

语义分析程序的设计与实现

语义分析程序的设计与实现 班号:2008211316姓名:张荣学号:08211627序号:26 实验日期:2010-11-23 一:实验内容: (2) 二:实验要求: (2) 三:实验方法: (2) ◆由LEX建立YACC的词法分析程序 (2) ◆yacc原理介绍 (3) ◆词法分析 (4) ◆解析器如何工作 (5) ◆Yacc环境 (6) ◆常用代码 (7) 第四:YACC内部名称: (7) 第五:运行结果(源代码见附录) (8) 第六:实验总结 (9) 第七:附录 (10) 附录一:yacc程序,加注释 (10) 附录二:词法分析器的工作原理 (16)

一:实验内容: 编写语法分析程序,实现对算术表达式的语法分析,要求所分析的算术表达式由如下的文法产生。 ◆E->E+T|E-T|T ◆T->T*F|T/F|F ◆F->id|(E)|num 二:实验要求: 在对表达式进行分析的同时,输出所采用的产生式。 可以采用多种方法 ◆编写递归调用程序,实现自顶向下的分析。 ◆编写LL(1)语法分析程序,要求: ◇编程实现算法4.2,为给定的文法自动构造预测分析表 ◇编程实现算法4.1,构造LL(1)预测分析程序, ◆编写语法分析程序,实现自底向上的分析,要求: ◇构造识别所有活前缀的DFA ◇构造LR分析表 ◇编程实现算法4.3,构造LR分析程序 ◆利用yacc自动生成语法分析程序,调用LEX自动生成的词法分析器程序 三:实验方法: ◆由LEX建立YACC的词法分析程序 由LEX产生的词法分析程序可用于YACC,LEX编译程序根据LEX

源程序产生词法分析程序yylex(),这个名字就是YACC所需要的词法分析程序的名字。如果YACC要调用LEX产生的词法分析程序,则在YACC源程序的第三部分用语句#include“lex.yy.c”代替函数yylex()的定义,这一yylex()就可以访问YACC中记号的名字,因为LEX的输出时候YACC输出文件的一部分,所有,每个LEX的动作都返回YACC 知道的终结符。 在UNIX的环境下,如果LEX源程序在first.l中,YACC的源程序在second.y中,可以使用以下命令得到所需要的分析程序。 Lex first.l Yacc second.y cc-o yaccdemo y.tab.c lex.yy.c ◆yacc原理介绍 Yacc 是用可移植的C 语言写成的。接受的规定类别是非常一般性的: 带有去歧义规则的LALR(1) 文法。 Yacc 提供了一个通用工具来在计算机程序的输入上施加结构。Yacc 用户准备输入处理的规定;它包括描述输入结构的规则,在识别了这些规则的时候调用的代码,和做基本输入的一个低层例程。Yacc 接着生成一个函数来控制输入处理。这个函数叫做解析器(parser),它调用用户提供的低层输入例程(词法分析器(analyzer))来从输入流中选取基本项目(叫做记号(token))。依据叫做文法规则的输入结构规则来组织这些记号;在识别了这些规则中的某一个的时候,接着调用为这个规则提供的叫做动作的用户代码;动作有能力返回值并

语法分析程序报告

xx理工大学 《编译原理》 题目语法分析程序 姓名: 学号: 班级:

一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 2.1 待分析的简单语言的语法 用扩充的BNF表示如下: ⑴<程序>::=begin<语句串>end ⑵<语句串>::=<语句>{;<语句>} ⑶<语句>::=<赋值语句> ⑷<赋值语句>::=ID:=<表达式> ⑸<表达式>::=<项>{+<项> | -<项>} ⑹<项>::=<因子>{*<因子> | /<因子> ⑺<因子>::=ID | NUM | (<表达式>) 2.2 实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 例如: 输入begin a:=9; x:=2*3; b:=a+x end # 输出success 输入x:=a+b*c end # 输出error 2.3 语法分析程序的酸法思想 ⑴主程序示意图如图2-1所示。 图2-1 语法分析主程序示意图 ⑵递归下降分析程序示意图如图2-2所示。 ⑶语句串分析过程示意图如图2-3所示。

图2-2 递归下降分析程序示意图 图2-3 语句串分析示意图 ⑷statement 语句分析程序流程如图2-4、2-5、2-6、2-7所示。 图2-4 statement 语句分析函数示意图 图2-5 expression 表达式分析函数示意图

图2-7 factor分析过程示意图三、语法分析程序的C语言程序源代码 #include "stdio.h" #include "string.h" char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() { p=kk=0; printf("\nGrade:05 Class:03 Name:Qiyubing Number:200507096 \n"); printf("\n----Please input the string end with '#':-------- \n"); do

实验5 LL(1)语法分析程序的设计与实现(C语言)

实验五LL(1)文法识别程序设计 一、实验目的 通过LL(1)文法识别程序的设计理解自顶向下的语法分析思想。 二、实验重难点 FIRST集合、FOLLOW集合、SELECT集合元素的求解,预测分析表的构造。 三、实验内容与要求 实验内容: 1.阅读并理解实验案例中LL(1)文法判别的程序实现; 2.参考实验案例,完成简单的LL(1)文法判别程序设计。 四、实验学时 4课时 五、实验设备与环境 C语言编译环境 六、实验案例 1.实验要求 参考教材93页预测分析方法,94页图5.11 预测分析程序框图,编写表达式文法的识别程序。要求对输入的LL(1)文法字符串,程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。 表达式文法为: E→E+T|T T→T*F|F F→i|(E) 2.参考代码

为了更好的理解代码,建议将图5.11做如下标注:

/* 程序名称:LL(1)语法分析程序*/ /* E->E+T|T */ /* T->T*F|F */ /* F->(E)|i */ /*目的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。 /********************************************/ /* 程序相关说明*/ /* A=E' B=T' */ /* 预测分析表中列号、行号*/ /* 0=E 1=E' 2=T 3=T' 4=F */ /* 0=i 1=+ 2=* 3=( 4=) 5=# */ /************************************/ #include"iostream" #include "stdio.h" #include "malloc.h" #include "conio.h" /*定义链表这种数据类型参见: https://www.wendangku.net/doc/cf1779394.html,/link?url=_owQzf8PRZOt9H-5oXIReh4X0ClHo6zXtRdWrdSO5YBLpKl NvkCk0qWqvFFxjgO0KzueVwEQcv9aZtVKEEH8XWSQCeVTjXvy9lxLQ_mZXeS###*/ struct Lchar{ char char_ch; struct Lchar *next; }Lchar,*p,*h,*temp,*top,*base; /*p指向终结符线性链表的头结点,h指向动态建成的终结符线性链表节点,top和base分别指向非终结符堆栈的顶和底*/

编译原理语法分析程序

编译原理实验报告 题目:对下面的文法对象,使用c语言构造它的预测分析程序;并任意给一算术表达式进行分析测试. 分析对象对象定义如下: 算术表达式→项|算术表达式+项|算术表达式-项 项→因式|项*因式|项/因式 因式→变量|(算术表达式) 变量→字母 字母→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z 一、分析 语法分析部分我们我们采用ll(1)方法实现,采用ll(1)方法实现语法发分析要求文法满足以下要求: 一个文法能否用确定的自顶向下分析与文法中相同左部的每个产生式右部的开始符号集合有关,当有右部能=*=>ε时则与其左部非终结符的后跟符号集合也有关,此外在产生式中不存在左递归即经过压缩,无左递归,无回溯。它的基本思想是从左到右扫描源程序,同时从识别符号开始生成句子的最左推导,并只向前查看一个输入符号,便能唯一确定应选择的规则。 下面将确切地定义满足确定的自顶向下分析条件的文法即LL(1)文法及LL(1)文法的判 别并介绍如何对非LL(1)文法进行等价变换问题,也就是消除一个文法中的左递归和左公共因子。 注意: 一个文法中含有左递归和左公共因子绝对不是LL(1)文法,所以也就不可能用确定的自顶向下分析法,对此结论可以证明。然而,某些含有左递归和左公共因子的文法在通过等价变换把它们消除以后可能变为LL(1)文法,但需要用LL(1)文法的定义判别,也就是说文法中不含左递归和左公共因子,只是LL(1)文法的必要条件。 LL(1) 文法的定义(5种定义): 一个文法符号串的开始符号集合定义如下: 定义 1.设G=(VT,VN,S,P)是上下文无关文法,α是任意的文法符号串,FIRST(α)是从α推导出的串的开始符号的终结符集合。。。。 FIRST(α)={a|α=*=>aβ,a∈VT,α,β∈V*}若α=*=>ε,则规定ε∈FIRST(α).当一个文法中相同左部非终结符的右部存在能=*=>ε的情况则必须知道该非终结符的后跟符号的集合中是否含有其它右部开始符号集合的元素。为此,我们定义一个文法非终结符的后跟符号的集合如下: 定义2.设G=(VT,VN,S,P)是上下文无关文法,A∈VN,S是开始符号 FOLLOW(A)={a|S=*=>μAβ,且a∈VT,a∈FIRST(β),μ∈VT* ,β∈V+}若S=*=>μAβ,且βε, 则#∈FOLLOW(A)。也可定义为:FOLLOW(A)={a|S=*=> …Aa…,a ∈VT} 若有S=*=> …A,则规定#∈FOLLOW(A)

北京理工大学汇编语言实验报告实验五 子程序设计实验

实验五子程序设计实验(设计性实验) 一、实验要求和目的 1.熟悉汇编语言程序设计结构; 2.熟悉汇编语言子程序设计方法; 3.熟悉利用汇编语言子程序参数传递方法; 4.熟悉汇编语言字符串处理基本指令的使用方法; 5.掌握利用汇编语言实现字符串的输入输出程序设计方法; 6.掌握数制转换程序实现方法。 二、软硬件环境 1、硬件环境:计算机系统windows; 2、软件环境:装有MASM、DEBUG、LINK、等应用程序。 三、实验涉及的主要知识 A)子程序知识要点: 1、掌握子程序的定义语句; 过程名 PROC [near/far] 过程体 RET 过程名 ENDP 2.子程序结构形式 一个完整的子程序一般应包含下列内容: 1. )子程序的说明部分 在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容: .子程序名:命名时要名中见意. .子程序的功能:说明子程序完成的任务; .子程序入口参数:说明子程序运行所需参数及存放位置; .子程序出口参数:说明子程序运行结果的参数及存放位置; .子程序所占用的寄存器和工作单元; .子程序调用示例; 2、)掌握子程序的调用与返回 在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。 .段内调用与返回:调用子程序指令与子程序同在一个段内。因此只修改IP; .段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。 3.)子程序的现场保护与恢复 保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。 一般利用堆栈实现现场保护和恢复的格式: 过程名PROC [NEAR/FAR]

编译原理实验报告一 简单样本语言的词法分析器

理工大学信息工程与自动化学院学生实验报告 (2012 —2013学年第一学期) 一、实验目的及容 编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(框原理图或程序流程图) 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUAL C++6.0软件。 三、实验法、步骤(或:程序代码或操作过程) (1)程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++)

汇编语言程序设计实验报告三(子程序设计实验)

汇编语言程序设计实验报告三(子程序设计实验) 一、实验目的 1、掌握主程序与子程序之间的调用关系及其调用方法。 2、掌握子程序调用过程中近程调用与远程调用的区别。 3、熟练掌握码型变换的程序。 二、实验内容 1、从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制 数,并在屏幕上显示。要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。数据可循环输入,遇‘00’结束。 三、实验准备 1、预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。 2、熟悉键盘输入和字符显示的程序段的编制。 四、实验步骤 1、编辑、汇编源程序,生成可执行文件。 2、执行程序,检查输入、输出结果,看是否正确。如不正确,用DEBUG检查,修改 源程序,再汇编、运行,直到程序正确为止。 3、用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆 栈的变化情况。 五、实验报告要求 1、分析近程调用和远程调用的主要区别。用DEBUG命令观察执行过程有何不同。 2、分析实验结果及所遇到的问题的解决方法。 主程序流程图 转换子程序TRAN流程图

七、程序清单 STA SEGMENT STACK ’STACK’ DB 100 DUP(0) STA ENDS GSAG SEGMENT PARA ‘CODE’ ASSUME CS:CSAG MAIN PROC FAR STRA T: PUSH DS SUB AX,AX PUSH AX REV: MOV AH,1 INT 21H MOV BL,AL INT 21H MOV AH,AL MOV AL,BL CMP AX,3030H JE ENDTRAN CALL NEAR PTR TRAN CALL FAR PTR CON MOV AL,0DH CALL FAR PTR DISP MOV AL,0AH CALL FAR PTR DISP MOV AL,0AH CALL FAR PTR DISP JMP REV ENDTRAN: RET MAIN ENDP TRAN PROC NEAR AND AX,0F0FH MOV BL,AL MOV BL,AL MOV CL,3 SHL AL,CL MOV CL,1 SHL BL,CL ADD AL,BL ADD AL,AH RET TRAN ENDP CSAG ENDS CSBG SEGMENT PARA’CODE’ ASSUME CS:CSBG

LL(1)语法分析程序实验报告

1.设计要求 (1)对输入文法,它能判断是否为LL(1)文法,若是,则转(2);否则报错并终止; (2)输入已知文法,由程序自动生成它的LL(1)分析表; (3)对于给定的输入串,应能判断识别该串是否为给定文法的句型。 2.分析 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由总控算法判断输入符号串是否为该文法的句型。 3.流程图

4.源程序 /******************************************* 语法分析程序 作者:龚勋刘栋罗晓波 学号:200131500342 200131500350 200131500351 计科系13班 ********************************************/ #include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出^的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0) return(0);

实验5 子程序设计

实验五子程序结构设计 一、实验目的 1、加深对子程序的理解,掌握子程序的结构。 2、掌握子程序的设计、编写及调试方法。 二、实验内容 1、已知在内存数据段中GRADE开始单元连续存放着10个学生的成绩,试 采用子程序结构编程实现以下功能: (1)找到最高成绩,将其偏移地址存放在内存单元MAX中。 (2)统计不及格的人数,存放在内存单元COUNT中。 (3)计算平均成绩(只取整数部分)。 (4)在屏幕上显示平均成绩。 要求:将以上功能分别写成子程序,数据区定义如下 DSEG SEGMENT GRADE DB 76,68,54,80,45,92,63,58,94,85 MAX DW ? COUNT DB ? DSEG ENDS 答:源程序: DATAS SEGMENT GRADE DB 76,68,54,80,45,92,63,58,94,85 MAX DW? COUNT DB? DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS MAIN PROC FAR START: PUSH DS MOV AX,0 PUSH AX MOV AX,datas MOV DS,AX CALL MAXGRADE CALL BUJIGE

CALL AVGRADE RET MAIN ENDP MAXGRADE PROC FAR push ax push cx push si mov cx,10 mov ax,0 mov si,ax start_loop: mov ax,word ptr grade[si] cmp ax,word ptr grade[si+1] jge big mov ax,word ptr grade[si+1] big: inc si loop start_loop mov max,ax pop si pop cx pop ax ret MAXGRADE ENDP BUJIGE PROC FAR PUSH SI PUSH CX PUSH AX MOV AX,0 MOV COUNT,0 MOV CX,10 LOOP_START2: MOV AX,WORD PTR GRADE[SI] CMP AX,60 JG SMALL2 INC COUNT SMALL2: INC SI LOOP LOOP_START2 POP AX POP CX POP SI

实验二--语法分析程序的设计-

实验二语法分析程序的设计 姓名:学号:专业班级 一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法。 二、实验内容 设计一个文法的预测分析程序,判断特定表达式的正确性。 三、实验要求 1、给出文法如下: G[E] E->T|E+T; T->F|T*F; F->i|(E); 2、根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序, 利用C语言或C++语言或Java语言实现; 3、利用预测分析程序完成下列功能: 1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束; 2)读入文本文件中的表达式; 3)调用实验一中的词法分析程序搜索单词; 4)把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息; 5)完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换(见实验二附加资料1)。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境 五、实验步骤 1、分析文法,将给出的文法转化为LL(1)文法; 2、学习预测分析程序的结构,设计合理的预测分析程序; 3、编写测试程序,包括表达式的读入和结果的输出; 4、测试程序运行效果,测试数据可以参考下列给出的数据。 六、测试数据

输入数据: 编辑一个文本文文件expression.txt ,在文件中输入如下内容: 正确结果: (1)10; 输出:正确 (2)1+2; 输出:正确 (3)(1+2)*3+(5+6*7); 输出:正确 (4)((1+2)*3+4 输出:错误 (5)1+2+3+(*4+5) 输出:错误 (6)(a+b)*(c+d) 输出:正确 (7)((ab3+de4)**5)+1 输出:错误 七、源代码 import java.util.*; import java.io.*; public class test2 { static String[] key_word = { "main", "if", "then", "while", "do", "int", "else" }; static String[] cal_word = { "+", "-", "*", "/", "<", ">", "{", "}", "(", ")", "[", "]", "==", "!=", "!", "=", ">=", "<=", "+=", "-=", "*=", "/=", ";" }; /* * 给定文法G[E]: E->T|E+T; T->F|T*F; F->i|(E); */ static String[] gram = { "E->TA", "A->+TA", "A->@", "T->FB", "B->*FB", "B->@", "F->P", "F->(E)" }; static String[] followE = { ")", "#" };

语法分析器实验报告

语法分析器的设计实验报告 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

Web应用程序设计综合实验报告解析

Web应用程序设计综合实验报告题目:网上购物系统 学生姓名: XXX 学号: XXXXXXXXXXX 院(系): XXXXXXX 专业: XXXXXXXXXX 指导教师: XXXXXXXXXX 2014 年 7月 6 日

1、选题背景 随着计算机技术的发展和网络人口的增加,网络世界也越来越广播,也越来越来越丰富,网上商城已经成为网上购物的一股潮流。互联网的跨地域性和可交互性使其在与传统媒体行业和传统贸易行业的竞争中是具有不可抗拒的优势。在忙碌丰富的社会生活中,人们开始追求足不出户就能买到心仪的商品,是越来越多的上网爱好者实现购物的一种方式,对于企业来说,网络交易能大大提高交易速度、节约成本。在这种形势下,传统的依靠管理人员人工传递信息和数据的管理方式就无法满足企业日益增长的业务需求,因而开发了这样一个具有前台后台的网上商城系统,以满足购物者和企业的需求。 因此这次毕业设计题目就以目前现有的网上商城系统为研究对象,研究一般的网上商城的业务流程,猜测其各个功能模块及其组合、连接方式,并分析其具体的实现方式,最后使用Java加web服务器和数据库完成一个网上商城系统的主要功能模块。通过这样一个设计,可以提高自己Java编程的水准,也练习了怎样构建一个完整的系统,从系统的需求分析到设计,直至编码、测试并运行,熟悉并掌握一个完整的Web开发流程,为今后工作打下基础。 1.1设计任务 从以下几个方面实现网络商城的基本功能: 1、用户部分: (1)用户的登录和注册,用户必须注册才能购物,注册时系统会对注册信息进行验证,进入系统或是结账时,用户可以进行登录,登录时,如果密码错误,系统会进行验证并提示错误。 (2)浏览商品,实现用户可以在网络商店中随意浏览商品,商品按类别分类,方便用户查找不同类别的商品 (3)购物车管理,能实现添加商品、删除商品、更新商品的功能。 (4)生成订单,查看购物车后单击下一步则生成订单信息表,一旦提交订单,则购物车就不能被改变。 2、管理员部分:

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

编译原理实验报告语法分 析程序的设计 Last updated on the afternoon of January 3, 2021

实验5语法分析程序的设计(2)一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中算法优先分析方法。 二、实验内容 设计一个文法的算法优先分析程序,判断特定表达式的正确性。 三、实验要求 1、给出文法如下: G[E] E->T|E+T; T->F|T*F; F->i|(E); 可以构造算符优先表如下: + * ( ) i + * ( ) i 2 2)为优先关系建立优先函数,这里由学生自己选择一种方式; 1、给出算符优先分析算法如下: k:=1;S[k]:=‘#’; REPEAT 把下一个输入符号读进a中; IFS[k]∈V T THENj:=kELSEj:=k-1; WHILES[j]aDO BEGIN REPEAT Q:=S[j];

IFS[j-1]∈V T THENj:=j-1ELSEj:=j-2 UNTILS[j]Q 把S[j+1]…S[k]归约为某个N ; k:=j+1; S[k]:=N; ENDOFWHILE; IFS[j]aORS[j]aTHEN BEGIN k:=k+1;S[k]:=a END ELSEERROR UNTILa=‘#’ 1、 根据给出算法,利用适当的数据结构实现算符优先分析程序; 2、 利用算符优先分析程序完成下列功能: 1)手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结 束; 2)读入文本文件中的表达式; 3)调用实验2中的词法分析程序搜索单词; 4)把单词送入算法优先分析程序,判断表达式是否正确(是否是给出文法的 语言),若错误,应给出错误信息; 5)完成上述功能,有余力的同学可以对正确的表达式计算出结果。 四、实验环境 PC 微机 DOS 操作系统或Windows 操作系统 TurboC 程序集成环境或VisualC++程序集成环境 五、实验步骤 1、 分析文法中终结符号的优先关系; 2、 存放优先关系或构造优先函数; 3、利用算符优先分析的算法编写分析程序; 4、写测试程序,包括表达式的读入和结果的输出; 5、程序运行效果,测试数据可以参考下列给出的数据。 六、测试数据 输入数据: 编辑一个文本文文件,在文件中输入如下内容: 正确 结果: 10; 1+2; (1+2)*3+(5+6*7); ((1+2)*3+4; 1+2+3+(*4+5); (a+b)*(c+d); ((ab3+de4)**5)+1;

相关文档
相关文档 最新文档