文档库 最新最全的文档下载
当前位置:文档库 › Tiny语言的词法分析器C版课程设计报告

Tiny语言的词法分析器C版课程设计报告

Tiny语言的词法分析器C版课程设计报告
Tiny语言的词法分析器C版课程设计报告

实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周

#include

#include

#include

using namespace std;

static int rowCounter = 1;//静态变量,用于存储行数

static bool bracketExist = false;//判断注释存在与否,false为不存在class Lex

{

public:

ofstream output;

string line = "";

Lex(string inputLine)

{

line = inputLine;

scan(Trim(line));

rowCounter++;

}

string Trim(string &str)//函数用于去除每行前后空格

{

int s = str.find_first_not_of(" \t");

int e = str.find_last_not_of(" \t");

str = str.substr(s, e - s + 1);

str += "\0";

return str;

}

void scan(string inputLine)

{

ofstream output;

output.open("SampleOutput.txt", ios::app);

string line = inputLine;

int i = 0;

string str = "";

int temp;

string token = "";

output << rowCounter << ": " << line << endl;//输出每行

while (line[i] != '\0')//根据DFA扫描并判断

{

if (line[i] == '{')//注释

{

bracketExist = true;

}

if (bracketExist == true)

{

output << "\t" << rowCounter << ": ";

while (line[i] != '}')

{

output << line[i];//不处理,直接输出

if (line[i + 1] != NULL)

{

i++;

}

else

break;

}

if (line[i] == '}')//注释结束

{

output << line[i]<

bracketExist = false;

}

}

if (bracketExist == false)

{

//数字

while (isdigit(line[i]))

{

temp = temp * 10 + line[i];

if (!isdigit(line[i + 1]))

{

output << "\t" << rowCounter << ": " << "NUM, val= " << temp - '0' << endl;

}

if (line[i + 1] != NULL&&isdigit(line[i + 1]))

i++;

else

break;

}

temp = 0;

//符号

while (!(isdigit(line[i]) || (line[i] >= 'a'&&line[i] <= 'z') ||

(line[i] >= 'A'&&line[i] <= 'Z') || line[i] == ' ' || line[i] == '{' || line[i] == '}')) {

token = token + line[i];

if (isdigit(line[i + 1]) || (line[i + 1] >= 'a'&&line[i + 1] <= 'z') || (line[i + 1] >= 'A'&&line[i + 1] <= 'Z') || line[i + 1] == ' ' || line[i + 1] == '{' || line[i + 1] == '}' || line[i + 1] == NULL)

{

if (isToken(token))

{

output << "\t" << rowCounter << ": " << token << endl;

}

else

{

int j = 0;

while (token[j] != '\0')

{

output << "\t" << rowCounter << ": " << token[j] << endl;

j++;

}

}

}

else

{

i++;

continue;

}

if (line[i + 1] != NULL)

i++;

else

break;

}

token = "";

//字母

while ((line[i] >= 'a'&&line[i] <= 'z') || (line[i] >= 'A'&&line[i] <= 'Z'))

{

str = str + line[i];

if (!((line[i + 1] >= 'a'&&line[i + 1] <= 'z') || (line[i + 1] >= 'A'&&line[i + 1] <= 'Z')))

{

if (isResearvedWord(str)) //判断是否是保留字

{

output << "\t" << rowCounter << ": " << "Reversed Word: " << str << endl;

break;

}

else

{

output << "\t" << rowCounter << ": " << "ID, name= " << str << endl;

break;

}

}

if (line[i + 1] != NULL)

i++;

}

str = "";

if (line[i + 1] != NULL)

{

i++;

}

else

break;

}

if (line[i + 1] == NULL)

{

if (line[i] == ';')

output << "\t" << rowCounter << ": " << line[i];

break;

}

}

//清空,以备下一行读取

line = "";

str = "";

temp = 0;

token = "";

output << endl;

output.close();

}

bool isResearvedWord(string s)//存储保留字,并判断

{

string reservedWord[8] = { "if", "then", "else", "end", "repeat", "until", "read", "write" };

bool judge = false;

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

{

if (s == reservedWord[i])

{

judge = true;

break;

}

}

return judge;

}

bool isToken(string s)//存储符号,并判断

{

string token[10] = { "+", "-", "*", "/", "=", "<", "(", ")", ";", ":=" };

bool judge = false;

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

{

if (s == token[i])

{

judge = true;

break;

}

}

return judge;

}

};

int main()

{

ifstream input;

input.open("SampleInput.tny");

string line[50];

int i = 0;

while (getline(input, line[i]))

{

//cout << line[i] << endl;

i++;

}

input.close();

cout << endl << endl << "Reading source file completed!!" << endl;

int j = 0;

remove("SampleOutput.txt");

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

{

Lex lex(line[j]);

}

cout << endl << endl << "Writing file completed!!" << endl << endl << endl;

return 0;

}

四、重要数据结构

string line[]:用于存储每一行的字符,并逐个读取分析。

string token[]:用于存储TINY语言的符号,并调用遍历进行判断。

string reservedWord[]:用于存储TINY语言的保留字,遍历进行判断,若为真,则输出Reserved word。

static int rowCounter:静态变量,存储行号,每创建一个类的实例便加一。int temp:用于存储数字,并输出。

static int bracketExist:静态变量,标记注释是否存在。

string token, str分别用于临时存储读取的符号的字母串。

编译原理词法分析器语法分析课程设计

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 姓名林苾湲 西南交通大学信息科学与技术学院 2013年 12月

目录 课程设计1 词法分析器 (2) 1.1 设计题目 (2) 1.2 设计内容 (2) 1.3 设计目的 (2) 1.4 设计环境 (2) 1.5 需求分析 (2) 1.6 概要设计 (2) 1.7 详细设计 (4) 1.8 编程调试 (5) 1.9 测试 (11) 1.10 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 2.1 设计题目 (14) 2.2 设计内容 (14) 2.3 设计目的 (14) 2.4 设计环境 (14) 2.5 需求分析 (15) 2.6 概要设计 (16) 2.7 详细设计 (16) 2.8 编程调试 (24) 2.9 测试 (24) 2.10 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。 二、设计内容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: 4.1.硬件 (1)Intel Core Duo CPU P8700 (2)内存4G 4.2.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 4.3.编程语言 C#语言 五、需求分析 5.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 5.4.可选择性地将结果保存到文件中。 六、概要设计 6.1.数据类型 6.1.1.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:

实验一 词法分析器的设计

实验一词法分析器的设计 (2) 1.1 词法分析器的结构和主要任务 (2) 1.1.1 输入输出接口 (2) 1.1.2 条件限制 (2) 1.2 词法分析程序的总体设计 (3) 1.3 词法分析程序的详细设计 (4) 1.4实验步骤 (5) 1.5输入数据 (15) 1.6结果输出 (15)

实验一词法分析器的设计 实验目的:掌握词法分析的概念,设计方法,熟悉高级语言中词法的定义,词法分析程序的编写。 实验要求:在8学时内实现SAMPLE语言的词法分析器,要求用VC窗口界面实现。 实验内容:分为4次实验完成。 1.1 词法分析器的结构和主要任务 1.1.1 输入输出接口 图1-1词法分析器的输入输出界面 词法分析程序的主要任务是从左到右扫描每行源程序,拼成单词,换成统一的内部表示(token)输出,送给语法分析器。具体包括: 1.组织源程序的输入; 2.按规则拼单词,并转换成二元形式; 3.滤掉空白符,跳过注释、换行符及一些无用的符号(如字符常数的引号) 4.进行行列计数,用于指出出错的行列号,并复制出错部分; 5.列表打印源程序; 6.发现并定位词法错误; 7.生成符号表。 token文件和符号表用作语法分析的输入部分。 1.1.2 条件限制 本实验可以作如下假定: (1) 假定SAMPLE语言采用自由格式书写; (2) 可以使用注解,用/*……*/或者{……}标识,但注解不能插在单词内部,注解要在一行内结束,若一行结束,没有遇到注释后面的结束标记,自动认为注释也结束; (3) 一行可以有多个语句,一个语句也可以分布在多行中,单词之间和语句之间可以插入任意空格,单词中间不能有空白符号,单词中间也不能有回车换行符,即单词不能跨行书写; (4) 关键字都是保留字。

词法分析课程设计

《词法分析》设计说明书 学生姓名 学 号 5011110122 5011110133 5011110128 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机15-1班 信息工程学院 《编译原理及实践》结课大作 业

摘要 编译,简单的说,就是把源程序转换为可执行程序。从hellow worl说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对于编译的内部实现,也就是编译的原理。 这篇论文主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。 编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。 可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。有了C做中间层,A和B才能正常交流。C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、),然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。 程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。 这篇论文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。 关键词:单片机;词法分析

c语言语法分析器详解

#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); for(i=0;;i++) { if(p[i]==c) return(1); /*若在,返回1*/ if(i==strlen(p)) return(0); /*若不在,返回0*/ } } /******************************************* 得到一个不是非终结符的符号 ********************************************/

词法分析器的实现与设计

题目:词法分析器的设计与实现 一、引言................................ 错误!未定义书签。 二、词法分析器的设计 (3) 2.1词的内部定义 (3) 2.2词法分析器的任务及功能 (3) 3 2.2.2 功能: (4) 2.3单词符号对应的种别码: (4) 三、词法分析器的实现 (5) 3.1主程序示意图: (5) 3.2函数定义说明 (6) 3.3程序设计实现及功能说明 (6) 错误!未定义书签。 7 7 四、词法分析程序的C语言源代码: (7) 五、结果分析: (12) 摘要:词法分析是中文信息处理中的一项基础性工作。词法分析结果的好坏将直接影响中文信息处理上层应用的效果。通过权威的评测和实际应用表明,IRLAS是一个高精度、高质量的、高可靠性的词法分析系统。众所周知,切分歧义和未登录词识别是中文分词中的两大难点。理解词法分析在编译程序中的作用,加深对有穷自动机模型的理解,掌握词法分析程序的实

现方法和技术,用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。Abstract:lexical analysis is a basic task in Chinese information processing. The results of lexical analysis will directly affect the effectiveness of the application of Chinese information processing. The evaluation and practical application show that IRLAS is a high precision, high quality and high reliability lexical analysis system. It is well known that segmentation ambiguity and unknown word recognition are the two major difficulties in Chinese word segmentation. The understanding of lexical analyse the program at compile, deepen of finite automata model for understanding, master lexical analysis program implementation method and technology, using C language subset of a simple language compilation of a scanned again compiler, to deepen to compile the principle solution, master compiler implementation method and technology. 关键词:词法分析器?扫描器?单词符号?预处理 Keywords: lexical analyzer word symbol pretreatment scanner 一、引言 运用C语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual?Studio环境下,使用C语言作为开发工具。基于实验任务

编译原理课程设计(词法分析,语法分析,语义分析,代码生成)

编译原理课程设计(词法分析,语法分析,语义分析,代码 生成) #include #include #include #include #include #include using namespace std; /************************************************/ struct token// token { int code;// int num;// token *next; }; token *token_head,*token_tail;//token struct str// string { int num;// string word;// str *next; }; str *string_head,*string_tail;//string struct ivan// {

char left;// string right;// int len;// }; ivan css[20];// 20 struct pank// action { char sr;// int state;// }; pank action[46][18];//action int go_to[46][11];// go_to struct ike// { ike *pre; int num;// int word;// ike *next; }; ike *stack_head,*stack_tail;// struct L// { int k; string op;// string op1;// string op2;// string result;// L *next;// L *Ltrue;//true L *Lfalse;//false };

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

集美大学计算机工程学院实验报告 课程名称:编译原理班级: 指导教师:: 实验项目编号:实验一学号: 实验项目名称:词法分析器的设计实验成绩: 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 二、实验容 编写一个词法分析器,从输入的源程序(编写的语言为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"))

词法分析器课程设计

软件类课程设计报告 设计题目:词法分析器 学生学号: 专业班级:计算机科学与技术 学生姓名: 学生成绩: 指导教师(职称): 课题工作时间:至

信息工程学院软件类课程设计任务书 指导教师: 日期:年月日

成绩评定表学生姓名:学号:专业/班级:

目录 目录.................................................................................................................................................................. I 第一章概述.. (2) 1.1词法分析器概述 (2) 1.2课程设计内容 (2) 第二章词法分析器课程设计 (3) 2.1课程设计内容 (3) 2.2课程设计思想 (3) 2.3设计目的及说明 (3) 2.3.1程序设计范畴 (3) 2.3.2程序设计说明 (3) 第三章程序详细设计 (4) 3.1主要算法的设计 (4) 3.2算法的实现 (4) 3.2.1数据类型 (4) 3.2.2函数模块功能 (4) 3.3程序设计流程图 (4) 3.3.1设计流程图 (5) 3.3.2状态转换图 (5) 第四章运行结果及分析 (6) 4.1运行结果 (6) 4.2结果分析 (6) 4.3设计总结 (6) 结束语 (8) 参考文献 (8) 附录源程序 (9)

第一章概述 1.1词法分析器概述 词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换称长度统一的标准形式——属性字(TOKEN)。而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、)然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。词法分析器的功能就是把输入的符号串整理成特定的词素。 1.2课程设计内容 运用c++语言设计词法分析器,由指定文件读入预分析的源程序,经过词法分析器的分析,将结果写入指定文件。本程序是在Visual Studio环境下,使用c++语言作为开发工具。基于实验任务的内容及目的,实现初步的需求分析,具备词法分析器的基本功能和整体构架。逐步细化其功能,做到相应模块的具体化。画出未成熟的流程图,确定整体设计的走向,在一定范围内约束编程活动,确保没有大的问题及缺陷存在,然后通过将来的具体的编程设计完善流程图。

词法分析器,C语言写的,很不错

我自己写的个词法分析程序可以完成一个非常非常基本的C语言词法分析.自己鼓励下自己 :-) #include #include #include #include #include #include #include using namespace std; //用来存储目标文件名 string file_name; //提取文本文件中的信息。 string GetText(); //获得一个单词符号,从位置i开始查找。 //并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。 string GetWord(string str,int i,int& j); //这个函数用来除去字符串中连续的空格和换行 //第一个参数为目标字符串,第二个参数为开始位置 //返回值为连续的空格和换行后的第一个有效字符在字符串的位置 int DeleteNull(string str,int i); //判断i当前所指的字符是否为一个分界符,是的话返回真,反之假 bool IsBoundary(string str,int i); //判断i当前所指的字符是否为一个运算符,是的话返回真,反之假 bool IsOperation(string str,int i); //此函数将一个pair数组输出到一个文件中 void OutFile(vector > v); //此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组 vector > analyst(vector vec); //此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假 bool IsKey(string str); int main() {

C++实现词法分析器

#include #include using namespace std; char inchar[80], token[8]; char character; int zbbm, p, m = 0, n, row, sum = 0; char *blz[6] = { "while", "if", "else", "switch", "case" }; void input() { for (n = 0; n<8; n++) token[n] = NULL; character = inchar[p++]; while (character == ' ') { character = inchar[p]; p++; } if ((character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { m = 0; while ((character >= '0'&&character <= '9') || (character >= 'a'&&character <= 'z') || (character >= 'A'&&character <= 'Z')) { token[m++] = character; character = inchar[p++]; } token[m++] = '\0'; p--; zbbm = 6; for (n = 0; n<5; n++) if (strcmp(token, blz[n]) == 0) { zbbm = n + 1; break; } } else if ((character >= '0'&&character <= '9')) { { sum = 0; while ((character >= '0'&&character <= '9')) { sum = sum * 10 + character - '0'; character = inchar[p++]; } } p--; zbbm = 7; if (sum>32767) zbbm = -1; } else switch (character) { case'<':m = 0; token[m++] = character; character = inchar[p++]; if (character == '=') { zbbm = 11; token[m++] = character; }

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告 课题名称:编译原理课程设计 C-语言词法与语法分析器的实现

C-词法与语法分析器的实现 1.课程设计目标 (1)题目实用性 C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。 小写和大写字母是有区别的。 ④空格由空白、换行符和制表符组成。空格通常被忽略。 ⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标 能够对一个程序正确的进行词法及语法分析。 2.分析与设计 (1)设计思想 a.词法分析 词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析 语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 (2)程序流程图 程序主流程图: 词法分析: 语法分析:

实验一、词法分析器(含源代码)

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图 、程序 流程图: 开始 输入源文件路径 路径是否有 效 是初始化文件指针 否 将字符加入字符数 组Word[] 是空格,空白或换 行吗 是字母吗是数字吗否否是界符吗否打开源文件 跳过该字符 是是 文件结束? 否 将字符加入字符数 组Word[] 否 将字符加入字符数组Word[] 是 指向下一字符识别指针内容 指向下一字符 是字母惑数字 吗 是 将word 与关键字表key 进行匹 配 否匹配?是输出word 为关键字 输出word 为普通标示符 否将字符加入字符数组Word[] 指向下一字符输出word 为常数 识别指针内容 回退 是数字吗 是 否输出word 为界符 指向下一字符 结束 是输出Word 内容为不可识别 将字符加入字符数组Word[]

编译原理设计c语言的词法分析器

编译原理课程设计报告 题目: 学院: 教师: 姓名: 学号: 班级: 评分: 签字:

编译原理课程设计一:设计c语言的词法分析器 一、实验目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。 二、实验要求 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 三、实验设计 3.1.单词分类及表示 3.1.1 C语言的子集分类 (1)标识符:以字母开头的字母数字串 (2)整数或浮点型。 (3)保留字:for,while,do,else,if,static,int,sizeof,break,continue (4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||; (5)界符:"(",")",",",":",";","{","}" 3.1.2单词二元组(单词分类号、单词自身值)

3.2 词法分析器的设计 3.2.1算法设计 3.2.1.1概要设计 从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。

3.2.1.2状态图设计 3.2.2输入输出设计 输入:通过文件指针从文件中一个一个读取字符 输出:输出单词二元组至文件。格式为(种别码,值) 3.2.3主要函数 void Getchar(FILE *fp ) //读入一个字符 void GetBC(FILE *fp)//读入一个非空字符 void contacat()//连接字符 int letter()//判断是否为字母 int digit()//判断是否为字母 void retract(FILE *fp,char *c)//回退 int reserve (char **k)//处理保留字 int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置

Tiny语言的词法分析器C版课程设计报告

实验报告学号:姓名:专业:计算机科学与技术班级:2班第9周

#include #include #include using namespace std; static int rowCounter = 1;//静态变量,用于存储行数 static bool bracketExist = false;//判断注释存在与否,false为不存在class Lex { public: ofstream output; string line = ""; Lex(string inputLine) { line = inputLine; scan(Trim(line)); rowCounter++; } string Trim(string &str)//函数用于去除每行前后空格 { int s = str.find_first_not_of(" \t"); int e = str.find_last_not_of(" \t"); str = str.substr(s, e - s + 1); str += "\0"; return str; } void scan(string inputLine) { ofstream output; output.open("SampleOutput.txt", ios::app); string line = inputLine; int i = 0; string str = ""; int temp; string token = ""; output << rowCounter << ": " << line << endl;//输出每行 while (line[i] != '\0')//根据DFA扫描并判断 { if (line[i] == '{')//注释 { bracketExist = true; } if (bracketExist == true) { output << "\t" << rowCounter << ": "; while (line[i] != '}')

编译原理C语言词法分析器

编译原理 C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法和技术; 3、加深对有穷自动机模型的理解。 三、主要函数 四、设计 1. 主函数 void main ( )

2. 初始化函数 void load ( ) 3. 保留字及标识符判断函数 void char_search(char *word) 4. 整数类型判断函数 void inta_search(char *word) 5. 浮点类型判断函数 void intb_search(char *word)

6. 字符串常量判断函数 void cc_search(char *word) 7. 字符常量判断函数 void c_search(char *word) 同4、5函数图 8.主扫描函数 void scan ( ) 五、关键代码 #include <> #include <> #include <> char *key0[]={"

编译原理词法分析器语法分析课程设计范本

《 编译原理词法分析器语法分析课程设 计 -

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级级 学号 2723 姓名林苾湲 西南交通大学信息科学与技术学院 12月 目录 课程设计1 词法分析器 (2) 设计题目 (2) 设计内容 (2) 设计目的 (2)

设计环境 (2) 需求分析 (2) 概要设计 (2) 详细设计 (4) 编程调试 (5) 测试 (11) 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 设计题目 (14) 设计内容 (14) 设计目的 (14) 设计环境 (14) 需求分析 (15) 概要设计 (16) 详细设计 (16) 编程调试 (24) 测试 (24) 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(能够是c语言的子集)。 二、设计内容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: .硬件 (1)Intel Core Duo CPU P8700 (2)内存4G

.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 .编程语言 C#语言 五、需求分析 .源程序的预处理:源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 .单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号能够划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float 等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 .将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 .可选择性地将结果保存到文件中。

C-Minus词法分析和语法分析设计编译器编译原理课程设计

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想

设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法: ①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关 键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位 置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

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

编译原理实验报告

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

C语言词法分析器-内容说明注释完整-可运行代码知识分享

C语言词法分析器-内容说明注释完整-可运 行代码

1.实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 2.实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 3.实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组

*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字 流程图、程序 流程图:

程序:

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