当前位置:文档之家› 预测分析法(编译原理)

预测分析法(编译原理)

预测分析法(编译原理)
预测分析法(编译原理)

实验二基于预测方法的语法分析程序的设计

一、实验目的

了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法,掌握预测语法分析程序的手工构造方法。

二、实验内容

1、了解编译程序的基于预测方法的语法分析过程。

2、根据预测分析原理设计一个基于预测方法的语法分析程序。

三、实验要求

对给定文法G[S]:

S->AT A->BU T->+AT|$ U->*BU|$ B->(S)|m

其中,$表示空串。

1、判断上述文法G[S]是否LL(1)文法,若不是,将其转变为LL(1)文法;

2、对转变后的LL(1)文法建立预测分析表;

3、根据清华大学出版编译原理教材教材第五章P94的图5.11手工构造预测分析程序;

4、用预测分析程序对任意给定的键盘输入串m+m*m#进行语法分析,并根据栈的变化状态输出给定串的具体分析过程。

四、运行结果

从任意给定的键盘输入串:

m+m*m#;

输出:

本实验重点有两个:一是如何用适当的数据结构实现预测分析表存储和使用;二是如何实现各规则右部串的逆序入栈处理。

建议:使用结构体数组。

六、分析与讨论

1、若输入串不是指定文法的句子,会出现什么情况?

2、总结预测语法分析程序的设计和实现的一般方法。

代码:

#include

#include

#include

#include

struct stack1

{

char stack[10];

}sta[][7]=

{

"\0","+","*","(",")","m","#",

"S","\0","\0","AT","\0","AT","\0",

"A","\0","\0","BU","\0","BU","\0",

"T","+AT","\0","\0","$","\0","$",

"B","\0","\0","(S)","\0","m","\0",

"U","$","*BU","\0","$","\0","$"

};

//struct stack *head;

char stack_1[10]={'\0'},stack_2[10]={'\0'},stack_3[10]={'\0'}; int i,j,k,len_1,len_2,len_3,mark=0;

void main()

{

// void c_stack();

void analyze_stack();

void surplus_str();

int rules();

// printf("%s\t",sta[0][1].stack);

// printf("\n");

while(1)

{

// system("cls");

mark=0;

printf("请输入串:\n");

gets(stack_3);

if(stack_3[0]=='0')

break;

stack_1[0]='S';

len_3=strlen(stack_3);

if(stack_3[len_3-1]!='#')

{

printf("字符串输入错误,字符串不以#号结束!\n");

continue;

}

printf("分析栈\t\t剩余串\t\t\t\t\t\t规则\n");

for(i=0;i<=100;i++)

{

analyze_stack();

surplus_str();

rules();

if(mark==1)

break;

if(stack_1[0]=='\0'&&stack_3[0]=='#')

{

printf("#\t\t#\t\t\t\t\t\t成功接受\n");

break;

}

}

}

}

void analyze_stack()//分析栈

{

printf("#%-15s",stack_1);

len_1=strlen(stack_1);

}

void surplus_str()//剩余串//注意拼写的正确性,写成surlpus_str()报错,unresolved sxternal symbol_surplus_str;

{

printf("%-48s",stack_3);

}

int rules()//所用规则

{

int p,q,h;

char temp;

// printf("%d",len_1);

if(stack_1[len_1-1]==stack_3[0])

{

printf("%c匹配\n",stack_3[0]);

stack_1[len_1-1]='\0';

for(h=1;h<=len_3-1;h++)

stack_3[h-1]=stack_3[h];

stack_3[len_3-1]='\0';

}

else if(stack_1[len_1-1]<'A'||stack_1[len_1-1]>'Z') {

printf("报错\n");

mark=1;

return 0;

}

else if(stack_1[len_1-1]>='A'&&stack_1[len_1-1]<='Z') {

for(j=1;j<=5;j++)

{

if(stack_1[len_1-1]==sta[j][0].stack[0])

{

p=j;

break;

}

}

if(j>=6)

{

printf("报错\n");

mark=1;

return 0;

}

for(k=1;k<=6;k++)

{

if(stack_3[0]==sta[0][k].stack[0])

{

q=k;

break;

}

}

if(k>=7)

{

printf("报错\n");

mark=1;

return 0;

}

if(sta[p][q].stack[0]=='\0')

{

printf("报错\n");

mark=1;

return 0;

}

strcpy(stack_2,sta[p][q].stack);

len_2=strlen(stack_2);

printf("%c->%s\n",stack_1[len_1-1],stack_2); stack_1[len_1-1]='\0';

if(stack_2[0]=='$')

{

}

else

{

for(h=0;h

{

temp=stack_2[h];

stack_2[h]=stack_2[len_2-1-h];

stack_2[len_2-1-h]=temp;

}

strcat(stack_1,stack_2);

}

}

return 0;

}

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

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级: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.实践部分

c语言编译原理预测分析法实验报告

编译原理 实 验 报 告 目的要求 1.构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法 分析。 2.加深对预测分析LL(1)分析法的理解和掌握。 实验内容 对文法G进行语法分析,文法G如下所示: *0. S→a */ *1. S→^ *2. S→(T) *3. T→SW * *4. W→,SW *5. W→ε; 并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。 程序输入/输出示例: 输入:一个以 # 结束的符号串:例如:(a,a)# 输出: 步数分析栈输入串所用规则 (1) #S (a,a))# 2

源程序: //LL(1)预测分析控制程序 #include #include #include char str[100]; //存储待分析的句子 const char T[ ] = "a^(),#"; //终结符,分析表的列符const char NT[ ] = "STW"; //非终结符,分析表的行符/*指向产生式右部符号串*/ const char *p[] = { /*0. S→a */ "a", /*1. S→^ */ "^", /*2. S→(T) */ "(T)", /*3. T→SW */ "SW", /*4. W→,SW */ ",SW", /*5. W→ε; */ "" }; //设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。const int M[][6] = { /* a ^ ( ) , # */ /*S*/ { 0, 1, 2, -1, -1, -1 }, /*T*/ { 3, 3, 3, -1, -1, -1 }, /*W*/ { -1, -1,-1, 5, 4, -1 } }; void init()//输入待分析的句子 { printf("请输入待分析的句子(以$结束):\n"); scanf("%s",str); } int lin(char c);//非终结符转换为行号 int col(char c);//终结转换为列号 bool isNT(char c);//isNT判断是否是非终结符 bool isT(char c);//isT判断是否是终结符。 void main(void) { int i,j=0; int flag=1,flag2=0; char A; //设置指示句子的当前字符 char stack[20]= {'#','S'}; //栈赋初值 int top = 1 ; //设置栈顶指针 char X = ' ' ; //存储栈顶字符 init(); A=str[0];

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

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

1.实验目的:掌握LL(1)分析法的基本原理,掌握LL(1)分析表的构造方法,掌握LL(1) 驱动程序的构造方法。 2.实验要求:实现LR分析法(P147,例)或预测分析法(P121,例)。 3.实验环境:一台配置为1G的XP操作系统的PC机;Visual C++. 4.实验原理:编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语 法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该 语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单 位。编译程序的语法规则可用上下文无关文法来刻画。 语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法 的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想 是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生 式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。 自顶向下带递归语法分析:1、首先对所以的生成式消除左递归、提取公共左因子 2、在源程序里建立一个字符串数组,将所有的生成式都存在这个数组中。 3、给每个非终结符写一个带递归的匹配函数,其中起始符的函数写在main函数里。 这些函数对生成式右边从左向右扫描,若是终结符直接进行匹配,匹配失败,则调用出错函 数。如果是非终结符则调用相应的非终结符函数。 4、对输入的符号串进行扫描,从起始符的生成式开始。如果匹配成功某个非终结符 生成式右边的首个终结符,则将这个生成式输出。匹配过程中,应该出现的非终结符没有出 现,则出错处理。 5.软件设计与编程:对应源程序代码: #include <> #include <> #include using namespace std; struct Node1 { char vn; char vt; char s[10]; }MAP[20]; n==vn && MAP[i].vt==vt) {return MAP[i].s;} } return "error";} char * Analyse(char * word) { char p,action[10],output[10]; int i=1,j,l=strlen(word),k=0,l_act,m; while(!()) {();} ('#'); (start); printf("___________________________________________________________\n"); printf("\n 对符号串%s的分析过程\n",word); printf(" -----------------------------------------------------------------------\n

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

编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:

一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 …< >?为非终结符。 …::=? 该符号的左部由右部定义,可读作“定义为”。 …|? 表示…或?,为左部可由多个右部定义。 …{ }? 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 …[ ]? 表示方括号内的成分为任选项。 …( )? 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号…?括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析

编译原理 语法分析器 (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;

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

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码: 表各种单词符号对应的种别码 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(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所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 图3-1 (2)程序中需要用到的主要变量为syn,token和sum 扫描子程序的算法思想: 首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn 用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。

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

信息工程学院实验报告(2010 ~2011 学年度第一学期) 姓名:柳冠天 学号:2081908318 班级:083

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 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 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(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 主程序示意图:

编译原理 第八章符号表

第八章符号表 编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征等有关信息。这些信息通常记录在一张或几张符号表中。符号表的每一项包含两部分,一部分是名字(标识符),另一部分是此名字的有关信息。每个名字的有关信息一般指种属(如简单变量、数组、过程等)、类型(如整、实、布尔等)等等。这些信息将使用于语义检查、产生中间代码以及最终生成目标代码等不同阶段。 编译过程中,每当扫描器识别出一个单词后,编译程序就查阅符号表,看它是否已在其中。如果它是一个新名就将它填进表里。它的有关信息将在词法分析和语法-语义分析过程中陆续填入。 符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否相一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。 本章重点:符号表的一般组织和使用方法。 第一节符号表的组织和使用 信息栏通常包含许多子栏和标志位,用来记录相应名字的种种不同属性。由于查填符号表一般都是通过匹配名字来实现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。 虽然原则上说,使用一张统一的符号表也就够了,但是,许多编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。这是因为,不同种属名字的相应信息往往不同,并且信息栏的长度也各有差异的缘故。因而,按不同种属建立不同的符号表在处理上常常是比较方便的。 对于编译程序的符号表来说,它所涉及的基本操作大致可归纳为五类: 1、对给定名字,确定此名是否在有中; 2、填入新名; 3、对给定名字,访问它的有关信息; 4、对给字名字,填写或更新它的某些信息; 5、删除一个或一组无用的项。 不同种类的表格所涉及的操作往往也是不同的。上述五方面只是一些基本的共同操作。 符号表最简单的组织方式是让各项各栏所占的存储单元的长度都是固定的。这种项栏长度固定的表格易于组织、填写和查找。对于这种表格,每一栏的内容可直接填写在有关的区段里。例如,有些语言规定标识符的长度不得超过8个字符,于是,我们就可以用两个机器字作为主栏(假定每个机器字可容四个字符)每个名字直接填写在主栏中。若标识长度不到8个字符,则用空白符补足。这种直接填写式的表格形式如下: 但是,有许多语言对标识符的长度几乎不加限制,或者说,标识符的长度范围甚宽。譬如说,

编译原理实验报告LL(1)分析法

河南工业大学实验报告 课程编译原理实验名称实验二 LL(1)分析法 实验目的 1.掌握LL(1)分析法的基本原理; 2.掌握LL(1)分析表的构造方法; 3.掌握LL(1)驱动程序的构造方法。 一.实验内容及要求 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i 程序输入一以#结束的符号串(包括+*()i#),如:i+i*i#。输出过程如下: 步骤分析栈剩余输入串所用产生式 1E i+i*i#E->TG ............ 二.实验过程及结果 代码如下: #include #include "edge.h" using namespace std; edge::edge() { cin>>left>>right; rlen=right.length(); if(NODE.find(left)>NODE.length()) NODE+=left; }

string edge::getlf() { return left; } string edge::getrg() { return right; } string edge::getfirst() { return first; } string edge::getfollow() { return follow; } string edge::getselect() { return select; } string edge::getro() { string str; str+=right[0]; return str; } int edge::getrlen() { return right.length(); } void edge::newfirst(string w) { int i; for(i=0;ifirst.length()) first+=w[i]; }

编译原理实验(词法分析)

编译原理实验报告 实验一 实验题目:词法分析 指导老师:任姚鹏 专业班级:计算机科学与技术系网络工程方向1002班姓名:xxxx

2013年 4月13日 实验类型__验证性__ 实验室_软件实验室三__ 一、实验项目的目的和任务: 了解和掌握词法分析的方法,编程实现给定源语言程序的词法分析器,并利用该分析器扫描源语言程序的字符串,按照给定的词法规则,识别出单词符号作为输出,发现其中的词法错误。 二、实验内容: 1.设计一个简单的程序设计语言(语言中有若干运算符和分界符;有若干关健字;若干标识符及若干常数) 2.确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。 3.把词法分析器设计成一个独立的过程。 三、实验要求: 1.从键盘上输入源程序; 2.处理各单词,计算个单词的值和类型; 3.输出个单词名、单词的值和类型。 四、实验代码 #include #include char file[1024]; int length=0; int index; char keywords[][10]={"auto","short","int","long","float", "double","char","struct","union","enum", "typedef","const","unsigned","signed","extern", "register","static","volatile","void","default", "if","else","switch","case","for", "do","while","goto","continue","break", "sizeof","return"}; char limits[]={'(',')','[',']','{','}',',',';'}; char operators[]={'+', '-', '*', '/', '%', '>','<','&','|','^', '~','!','='}; //13 int IsChar(char ch) //是否是字符 { if ( (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')) return 1; return 0;}

编译原理练习三

编译原理练习三 一、填空题 1.编译过程中,每当扫描器识别出一个名字后,编译程序就查阅,看该名字是否在其中。如果该名字是一个新名字就将它添进。 2.在语义分析阶段,符号表所登记的信息将用于和;在目标代码生成阶段,符号表是的依据。 3.过程信息表中必须包括、和。 4.编译程序使用区别标识符的作用域。 5.编译程序在其工作过程中使用最多的数据结构是。它记录着源程序中的各种信息,以便查询和修改。在这些中,尤以最为重要,它的生存期最长,使用也最频繁。 6.过程与过程引用中信息交换的方法是和。 7.PASCAL语言中局部变量的作用域为。 8.将过程的每次执行和过程的相对应就解决了过程递归调用所引起的问题。 9.形式参数和实在参数之间的对应关系通常按来确定。 10.对于某个压缩了的上下文无关文法,当把每个文法符号联系于一组属性,且让该文法的规则附加以时,称该文法为属性文法。 11.文法符号的属性有两种,一种称为,另一种称为。 12.一个文法符号的继承属性是通过语法树中它的结点的相应文法符号的属性来计算的,而综合属性是通过语法树中它的结点的属性之值来计算的。 13.语法制导的编译程序能同时进行分析和分析。 14.在PASCAL中,由于允许用户动态申请与释放内存空间,所以必须采用存储分配技术。 15.静态区的分配对象是。静态区分配的特点是。

二、选择题(单项和多项) 1.在编译过程中,符号表的主要作用是。 a.帮助错误处理 b.辅助语法错误的检查 c.辅助语义的(即上下文有关的)正确性检查 d.辅助代码生成 e.辅助对目标代码的优化 2.PASCAL中过程说明的局部量地址分配在。 a.调用者的数据区中 b.被调用者的数据区中 c.主程序的数据区中 d.公共数据区中 3.与PASCAL语言存储分配方式相似的语言是。 a.C语言 b.BASIC语言 c.FORTRAN-77 4.运行阶段的存储组织与管理的目的是。 a.提高编译程序的运行速度 b.提高目标程序的运行速度 c.为运行阶段的存储分配作准备 5.动态存储分配时,可以采用的分配方法有:。 a.以过程为单位的栈式动态存储分配 b.堆存储分配 c.最佳分配方法 6.过程调用时,参数的传递方法通常有。 a.传值 b.传地址 c.传结果 d.传名 7.过程调用的参数传递中,将出现的任一形蚕都代之以相应的实参的为,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问的为,像使用局部变量一样使用形式单元的为。 a.传值 b. 传名 c.传地址 d.传结果 8.FORTRAN编译中存储分配是。 a.静态存储分配 b. 动态存储分配 9.在编译方法中,动态存储分配的含义是什么? a.在运行阶段对源程序中的量进行分配 b.在编译阶段对源程序中的量进行分配 c.在编译阶段对源程序中的量进行分配,在运行时这些量的地址可以根据需要 改变 d.以上都不正确

编译原理-预测分析法(附源码)

预测分析法实验报告 一、实验项目名称 预测分析法 二、实验目的 根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。 三、实验环境 Windows 10 Microsoft Visual Studio 2015 四、实验内容 本次实验的LL(1)文法为表达式文法: E→E+T | T T→T*F | F F→i | (E) 编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示 五、源程序清单、测试数据、结果 #include #include using namespace std; const int NUM = 20;//初始化的栈的大小 //非终结符数组集 char Var[5] = { 'E','R','T','M','F' }; //终结符数组集 char Ter[6] = { 'i','+','*','(',')','#' }; string pred[5][6] = { { "TR","","","TR","","" },{ "","+TR","","","@","@" },{ "FM","","","FM","","" },{ ""," @","*FM","","@","@" },{ "i","","","(E)","","" } }; typedef struct { char *top; char *base; int stacksize; int num; }Stack;// 栈结构体 void init(Stack *ss) {//初始化栈 ss->base = (char *)malloc(NUM * sizeof(char)); if (!ss->base) exit(1); ss->top = ss->base; ss->stacksize = NUM; ss->num = 0; }

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

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

YY *p=0~9*p=0~9 NN 无符号数无符号数 P++P++ continuecontinue GOTO 2: GOTO 2 *p=Econtinue Y 无符号数 P++ continue 三、源程序代码部分 #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

编译原理课程设计

河海大学 编译原理课程设计 学生姓名: 学号: 班级: 专业:--------- 指导教师:

编译原理 课程设计指导书

题目一基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start → list eof list → expr;list |ε expr → expr + term { print(‘+’) } | expr –term { print(‘-’) } | term term → term * factor { print(‘*’) } | term / factor { print(‘/’) } | term div factor { print(‘DIV’) } | term mod factor { print(‘MOD’) } factor → ( expr ) | id { print( https://www.doczj.com/doc/4e2921572.html, ) } | num { print( num.value ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。

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

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的: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]);

编译原理实验-词法分析器的设计与实现.docx

南华大学 计算机科学与技术学院实验报告 (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

预测分析法(编译原理)

实验二基于预测方法的语法分析程序的设计 一、实验目的 了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法,掌握预测语法分析程序的手工构造方法。 二、实验内容 1、了解编译程序的基于预测方法的语法分析过程。 2、根据预测分析原理设计一个基于预测方法的语法分析程序。 三、实验要求 对给定文法G[S]: S->AT A->BU T->+AT|$ U->*BU|$ B->(S)|m 其中,$表示空串。 1、判断上述文法G[S]是否LL(1)文法,若不是,将其转变为LL(1)文法; 2、对转变后的LL(1)文法建立预测分析表; 3、根据清华大学出版编译原理教材教材第五章P94的图5.11手工构造预测分析程序; 4、用预测分析程序对任意给定的键盘输入串m+m*m#进行语法分析,并根据栈的变化状态输出给定串的具体分析过程。 四、运行结果 从任意给定的键盘输入串: m+m*m#; 输出: 本实验重点有两个:一是如何用适当的数据结构实现预测分析表存储和使用;二是如何实现各规则右部串的逆序入栈处理。 建议:使用结构体数组。 六、分析与讨论 1、若输入串不是指定文法的句子,会出现什么情况? 2、总结预测语法分析程序的设计和实现的一般方法。

代码: #include #include #include #include struct stack1 { char stack[10]; }sta[][7]= { "\0","+","*","(",")","m","#", "S","\0","\0","AT","\0","AT","\0", "A","\0","\0","BU","\0","BU","\0", "T","+AT","\0","\0","$","\0","$", "B","\0","\0","(S)","\0","m","\0", "U","$","*BU","\0","$","\0","$" }; //struct stack *head; char stack_1[10]={'\0'},stack_2[10]={'\0'},stack_3[10]={'\0'}; int i,j,k,len_1,len_2,len_3,mark=0; void main() { // void c_stack(); void analyze_stack(); void surplus_str(); int rules(); // printf("%s\t",sta[0][1].stack); // printf("\n"); while(1) { // system("cls"); mark=0; printf("请输入串:\n"); gets(stack_3); if(stack_3[0]=='0') break; stack_1[0]='S'; len_3=strlen(stack_3); if(stack_3[len_3-1]!='#')

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

专题 1_ 词法分析程序构造原理与实现 李若森 13281132计科1301 一、程序功能描述 [功能]: 完成下述正则文法所描述的C语言子集单词符号的词法分析程序。 [要求]: (1)给出各单词符号的类别编码。 (2)能发现输入串的错误。 (3)将分析所得二元序列输出到中间文件中。 [文法]: <标识符>→c|c<余留标识符> <余留标识符>→d|c <无符号数>→d<余留无符号数>|.<小数部分>|d <余留无符号数>→d<余留无符号数>|.<十进小数>|(E|e)<指数部分>|.|d <十进小数>→(E|e)<指数部分>|d<十进小数>|d <小数部分>→d<十进小数>|d <指数部分>→d<余留指数>|(+|-)<整指数>|d <整指数>→d<余留整指数>|d <余留整指数>→d<余留整指数>|d <算数运算符>→+|-|*|/|++|-- <关系运算符>→>|<|==|>=|<=|!= <逻辑运算符>→!|&&|\|\| <位操作运算符>→>>|<< <赋值运算符>→=|+=|-=|*=|/=|%= <特殊运算符>→,|\(|\)|{|} <分隔符>→; 保留字: void int float double if else for do while [说明]: (1)该语言对大小写不敏感 (2)c代表字母a-z&&A-Z,d代表数字0-9。 (3)?/*..*/?以及?//?为程序注释部分。 (4)文法中‘\’为转义字符

二、主要数据结构描述 pair: 用pair来存储单个二元组。其中第一个元素为类型号,第二个为 元素的值。当类型号小于40时代表程序分界符,第二个元素不存储有效信息,用 ?-?代替;类型号为40时是标识符,第二个元素存储标识符字符串;类型号为41 时代表实数,第二个元素存储的是该实数的二进制值。 vector<>: vector是C++中的动态数组,用来存储每一行的二元组。 三、程序结构描述 设计方法: 状态转换图:(DFA M)

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