当前位置:文档之家› 词法分析报告

词法分析报告

词法分析报告
词法分析报告

《编译原理》课程

实验报告

题目词法分析器的设计与实现

专业软件工程

班级20122012

学号2012201225

姓名杨帆

指导教师曹雪

哈尔滨工程大学软件学院

2015年5月

实验1:词法分析

图1 输入的字符不在定义中。

词法分析报告程序设计与实现

实验一词法分析程序设计与实现 一、实验目的及内容 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理(状态转换图) 1、C语言子集 (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为整型常数。 二、软件平台及工具 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++; }

词法与句法的互动

词法和句法之间的互动及其接口 -以“可怕/怕人”和“好吃/难吃”等词语为例- 〔关键词∶潜在动词和句法词、论元的背景化和前景化、语态变换的词法表现〕 0.问题的所在 现代汉语词法(morphology)体系和句法(syntax)体系之间过渡阶段上有一组很特殊的语法成分,有代表性的具体例子有“可怕、可气、…”和“怕人、气人、…”以及“好吃、好看、…”和“难吃、难看、…”等双音节词语。这些词语在构词法(morphology)、造词法(word formation)以及句法(syntax)上都有相当有意思的语法性质。这些词语从构词法的角度来看可以说归属于合成词(complex word),但从造词法的角度来看有些类似的例子可以超越“词(word)”的范畴,要扩展为“词组(phrase)”即“句法结构( syntactic structure)”;换言之,这类词语既属于词法平面也属于句法平面。这些词语的特殊性还比较突出地表现在句法平面上∶这些词语结构内部虽然都含有动词性语素,但是做为词语整体来看,它们已经丧失掉原来动词的性质而重新获得了新的语法性质,那就是词形和词性发生变化的同时还要引起“agent的背景化/theme的前景化”这样一个很重要的语法功能。这个功能所体现的一方面是词语内部论元结构(argument structure)的变化,另一方面也是句子里边语态变换(voice change)的词法表现。 我们认为,通过对这些词语的研究可以比较清楚地观察到现代汉语语法系统里边词法和句法二者之间互相促动并互相制约的动态情形以及二者之间的接口。本文准备从以下几个方面进行讨论∶ (Ⅰ) 词法特点∶造词成分的语法化以及语法功能的变化 (Ⅱ) 句法功能∶论元结构的变化以及语态变换的词法表现 (Ⅲ) 词法和句法之间的互动以及互制作用 1.句法词的构词类型 1.1∶结构特点 我们首先从构词法的角度来观察一下上面举的那些结构内部包含动词性语素的双音节成分。为了讨论的方便,本文把词语内部的动词性语素叫做“潜在动词”,记做V;比如说“可怕”和“怕人”里潜在的动词V是“怕”,“好吃”和“难吃”的潜在动词V是“吃”,余例类此。根据每个词语形式上的共性和个性,这些词语可以分为如下两个大类四个小类∶ (甲)A类“可V”型(以“可怕”为代表)和B类“V人”型(以“怕人”为代表)(乙)C类“好V”型(以“好吃”为代表)和D类“难V”型(以“难吃”为代表) 合成词一般可以分成两种,一种是复合词,还有一种是派生词。复合词是由两个或两个以上的词根合成的,如“朋友、庆祝、火车、照相机”等;派生词是词根加词缀(前缀和后缀)构成的,如“桌子、花儿、木头、阿姨”等。“可怕、怕人、好吃、难吃”等词语自然都可以分成“可+怕”“怕+人”“好+吃”“难+吃”等前后两个单位的组合,不过如果要再进一步进行分析的话,我们就得面临一个困境,即很难判断它们是属于复合词还是属于派生词∶除去V以后剩下来的“可”字、“好”字和“难”字既有词根(助动词)的性质,同

词法分析小结

词法分析小结 词法分析是编译器工作的第一阶段,它的工作就是从输入(源代码)中取得token,以作为parser(语法分析)的输入,一般在词法分析阶段都会把一些无用的空白字符(whitespace,即空格、tab和换行)以及注释剔除,以降低下一步分析的复杂度,词法分析器一般会提供一个gettoken()这样的方法,parser可以在做语法分析时调用词法分析器的这个方法来得到下一个token,所以词法分析器并不是一次性遍历所有源代码,而是采取这种on-demand的方式:只在parser需要时才工作,并且每次只取一个token。 token和lexeme 首先,token不等于lexeme。token和lexeme的关系就类似于面向对象语言中“类”和“实例”(或“对象”)之间的关系,这个用中文不知该如何解释才好,比如语言中的变量a和b,它们都属于同一种token:identifier,而a的lexeme是”a”,b则是”b”,而每个关键字都是一种token。token可以附带有一个值属性,例如变量a,当调用词法分析器的gettoken()时,会返回一个identifier类型的token,这个token带有一个属性“a”,属性可以是多样的,例如表示数字的token

可以带有一个表示数字值的属性,它是整型的。 如下代码: intage=23; intcount=50; 可以依次提取出8个token:int(值为”int”),id(值为”age”),assign(值为”=”),number(值为整型数值23),int(值为”int”),id(值为”count”),assign(值为”=”),number(值为50) 正则表达式 正则表达式可以用来描述字符串模式,例如我们可以用digit+来表示number的token,其中digit表示单个数字(这里说正则表达式并不完全和实现的正则引擎所识别的正则表达式等价,这里只是为了描述问题而已)。 然而像c语言的的多行注释,用正则表达式来描述就比较麻烦,此时更倾向于直接用有穷自动机(finiteautomaton)来描述,因为用它来描述非常直观且很容易。

编译原理词法分析报告

1、实验目的 1、为初等函数运算语言构造词法分析器。 2、掌握生成词法分析器的方法,加深对词法分析原理的理解。 3、掌握设计、编制并调试词法分析程序的思想和方法 2、实验内容 一、根据下面的要求设计初等函数运算语言的词法模式,并用正则式表达出来 1、初等函数运算语言的常量为实数类型,其定义方式为实数的最一般书写方式,如: 123.321。具体要求:不支持整数部分大于。时首数字为0;不支持小数点后结尾为 0;不支持科学记数法;不支持仅为整数时有小数点;支持负数符号,不支持正数 符号。 2、初等函数运算语言的变量采用与C语言的标识符定义一样的方式:首字符为字母或 下划线;其他的为字母、数字及下划线的混合串;区分大小写;变量长度不超过32 个字符。 3、初等函数运算语言需要处理的函数仅为表一中所列举的内容。函数的格式及参数内 容也如表一所示。 4、初等函数运算语言支持四则运算,其计算的符号与C语言相同,为:+-*/。 5、初等函数运算语言的合法的分隔符包括:空格、制表符、、分行符圆括号(左、右)、 分号。其中空格、制表符、分行符可以出现在任何两个不同的单词中间;圆括号(左、右)用于表达式中,用于改变运算的优先级,以及标识函数的参数;分号用于标识一个语句的结束。 6、初等函数运算语言支持的常量还包括:PI,Eo其中,PI为圆周率,E为自然常数。 二、将正则式转化为最小DFA,给出该DFA的形式化表示和图形表示。 三、根据DFA给出状态转换表。 四、给出初等函数运算语言的记号表,即词法分析中,语言中的记号将分为多少类,每一类型的编码、类型、属性等内容是什么。 五、编写词法分析器,将输入的字符串转化成为记号流,便于后续的语法分析工作。要求词法分析器中能够识别词法错误。

编译原理 简单样本语言的词法分析器

昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第 1 学期) 课程名称:编译原理开课实验室:信自楼44 年月日 一、实验目的及内容 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) W INDOWS下的VISUAL C++6.0; 四、实验方法、步骤(或:程序代码或操作过程) #include #include using namespace std;

#define MAX 22 char ch =' '; string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i; for(i=0;i='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } void analyse(FILE *fpin){ string arr=""; while((ch=fgetc(fpin))!=EOF) { arr=""; if(ch==' '||ch=='\t'||ch=='\n'){} else if(IsLetter(ch)){ while(IsLetter(ch)||IsDigit(ch)) { if((ch<='Z')&&(ch>='A')) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); if (Iskey(arr)){cout<

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 功能描述: 1、待分析的简单语言的词法 (1)关键字: begin if then while do end (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 图 1

程序结构描述: 图 2 四、实验结果 输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图3所示:

图3 输入private x:=9;if x>0 then x:=2*x+1/3; end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图4所示: 图4 显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义private关键字的种别码,所以把private当成了标示符。 输入private x:=9;if x>0 then x:=2*x+1/3; @ end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图5所示

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

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

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

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ 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);

词法分析实验报告

词法分析器 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验要求 如源程序为C语言。输入如下一段:Array main() { int a,b; a = 10; b = a + 20; }# 要求输出如右图。 要求: 1、将单词分为五种 识别关键字:main、if、int、for、while、do、return、break、continue; 单词种别码为1。 标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括:+、-、*、/、=、>、<、>=、<=、!= ; 单词种别码为4。 分隔符包括:,、;、{、}、(、);单词种别码为5。 2、使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 1、功能描述 改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。 2、程序结构描述 int IsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。 int IsAlpha(char c) 查看是否为字母,若是,返回值为1,否则为0。 int IsNum(char c) 查看是否为数字,若是,返回值为1,否则为0。 void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、 数字,是否是关键字,并输出。 fseek(fp,-1,1)回退一个字符。 fgetc(fp)从数据流中区下一个字符。 fopen 文件打开函数,返回指向文件第一个字符的指针 四、实验结果 测试内容为 main() {

现代汉语的词法和句法——常识

现代汉语的词法和句法 现代汉语有一个系统而复杂的语法体系,学习起来会令人感到枯燥乏味,故人们往往疏而远之。甚至有人说,语法没什么实际用处,不懂语法照样能写好文章。诚然,写文章不必一味拘泥于语法的限制,但不等于写文章可以不懂基本的语法知识。只要我们仔细地阅读在各类媒体上发表的文章,就不难发现有明显语法错误的病句比比皆是。因此,要想在作文时能准确而规范地使用我们祖国的语言文字,不学一点基本的语法知识,是不能如愿以偿的。现代汉语语法的基本内容包括汉字的特点,字词句的区别、联系及其使用规则,以及字词句在具体语言环境中的变化规律等等。囿于篇幅和笔者的水平,本讲只能着重而简略地讲一讲现代汉语中通用的词法和句法这两大问题。(上篇讲词法,下篇讲句法。) (一)词法 词法,即运用词语必须遵循的一般语法规则。所谓“一般语法规则”,即人们约定俗成并为人们广泛认可和应用的语言文字的规范。在《词语的运用》一讲中我们已经进过,词语是具有实在意义并能独立运用的最小的语言单位。因此,我们学习任何一种语言,都必须从学习词语开始,首先应该学一点词法的基本知识。接下来,我想择其要讲两个问题:词语的构词方式,词类和词的兼类。 〔1〕词语的构词方式现代汉语中的词汇绝大多数是由两个有具体意义的字构成的双音节合成词(古代汉语单音节词居多)。联合式和偏正式是双音合成词的两种主要的构词方式。例如“考试”和“考场”这两个合成词,“考”和“试”的意思相近,合为一个词表示一个意思。这两个字是并列的联合关系,它们的意义没有主次之分。而“考场”则不同,“场”是场所、场地的意思,“考”说明做什么用的场所、场地。其中的“场”是主体,“考”是附加的,起限制、区别的作用。两个字的意思有主次之分。由此可知,如“考试”这类由两个意义并列,不分主次的字构成的合成词,叫联合式合成词。如“考场”这类由两个有主次之分,意义有从属关系的字构成的合成词,叫偏正式合成词。 联合式合成词又可分为两种情况:(A)由意义相同或相近的两个字并列构成。例如“土地、城市、房屋、戏剧、海洋”等等。(B)由意义相反或相对的两个字并列构成。例如“收发、开关、买卖、出纳(词中两个字意义相反);方圆、左右、始终、尺寸(词中两个字意义相对)”等等。这里要注意的是,两字意义相反的合成词的意义,代表事物的全面和整体。两字意义相对的合成词的意义,表示一种不确定的抽象意义。此外,还要注意的是,联合式合成词的两个字,有的可以颠倒,意思不变。如“互相”也可写成“相互”。有的则不能颠倒,否则意思就不同了。如“生产”不能写成“产生”。而汉语中的联合式合成词的两个字,绝大多数是不能颠倒的。 偏正式合成词的构词方式也有两种情况:(A)後一字词是主体,前一个字起修饰限制作用。如“火热、热爱、粉碎、微笑(修饰作用);铁矿、马路、汽车、布鞋(限制作用)”等等。(B)后一个字对前一个字起补充说明作用,表示动作的结果和趋向。如“说明、提高、扩大、改善、抓紧”等等。 以上所说是合成词的两种主要构词方式,此外还有其他几种构词方式:(A)前一个字表示动作,后一个字表示相关的事物,构成表示动作行为或人和事物名称的词。例如“动员、带头、出席(表示动作行为);司令、领队、导游(表示人和事物名称)”等等。(B)后一个字说明前一个字的情状。如“地震、心疼、性急”等等。(C)前一个字表示事物名称,后一个字表示事物的单位,这类合成词多半成为一种“类”名。例如“布匹、纸张、车辆、船只、诗篇”等等。 (2)词类和词的兼类——汉语里的每个词都有不同的意义和用法。我们把用法相同的词归为一类,即为语法上的“词类”,也称“词性”。汉语里所有的词按其性质和功能的不同,可分为两大类:实词和虚词。“实词”,即具有实在和明显意义的词。它有两个特点:第一,正因为实词都有具体实在的意义,所以它们只要按一定的规则和顺序组合起来,就可以成为

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

理工大学信息工程与自动化学院学生实验报告 (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. 实验内容 用C++语言实现对C++语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。 3. 实验原理 本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。 待分析的简单的词法 (1)关键字: "asm","auto","bool","break","case","catch","char","class","

const","const_cast"等 (2)界符(查表) ";",",","(",")","[","]","{","}" (3)运算符 "*","/","%","+","-","<<","=",">>","&","^","|","++","--"," +=","-=","*=","/=","%=","&=","^=","|=" relop: (4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

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

编译原理实验报告

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

简单词法分析器

简单词法分析器 1、将源文件中的单词识别出来,以用'$'为首的标识符标记识别出的单词 2、单词符号及内部表示如表: 单词符号种别编码助记符内码值 DIM 1 $DOM — IF 2 $IF — DO 3 $DO — STOP 4 $STOP — END 5 $END — 标识符 6 $ID 内部字符串 常数7 $INT 标准二进制形式= 8 $ASSIGN — + 9 $PLUS — * 10 $STAR — ** 11 $POWER — ; 12 $SEMICOLON — { 13 $LBRACE — } 14 $RBRACE — /* * 词法分析:将源文件中的单词符号一一识别 * 并将其与助记符保存到文本文件 */ #include "iostream" #include "string" using namespace std; //reserve保留字 string reserve[5] = {"DIM","IF","DO","STOP","END"}; //结构体数组,保存已识别的单词 struct table { string str; string name; }table[400]; int count = 0; //判断是否为保留字

bool Reserve(string str) { bool flag = false; for(int i=0; i>filename; if((fp = fopen(filename,"r")) == NULL) { cout<<"file not found"<

英语词法和句法

英语词法和句法 根据词的形式、意义及其在句中的功用将词分为若干类,叫做词类。一个句子由各个功用不同的部分所构成,这些部分叫做句子成分。学一个词,要学它的发音、拼法、意义,也要记它的词类;更重要的是要了解它和其他词的关系,及其在句中作什么句子成分。如China is in East Asia(中国位于东亚)一句中的China这个单词所属的词类是名词,在句子中作主语。 ●词类:英语的词通常分为十大类: 1.名词(noun,缩写为n.)表示人、事物、地点、现象及其他抽象概念的词。如Girl(女 孩)、book(书)、Tokyo(东京)、war(战争)、Goodness(善良) 2.代词(pronoun,缩写为pron.)用来代替名词并起名次作用的词如we(我们),his(他 的),all(全部)。 3.形容词(adjective,缩写为adj.)用来修饰名词和代词,起描述名词和代词的性质。 如great(伟大的),honest(诚实的),difficult(困难的)。 4.副词(adverb,缩写为。adv.)是修饰动词、形容词和副词的词,有时修饰全句。如 quickly(快),often(经常),very(很)。 5.动词(verb,缩写为v)表示动作和状态,如write(写),walk(行走),think(想)。 6.数词(numeral,缩写为num.)是表示“多少”和“顺序先后”的词,如four(四), eighteen(十八),first(第一),eighth(十八),hundred(一百)。 7.冠词(article,缩写为art.)本身不能单独使用,也没有词义,它用在名词的前 面,帮助指明名词的含义,表示的名词数量或者特征。如a,an(一个),the(这,那)。 8.介词(preposition,缩写为prep.)是一种用来表示词与词、词与句之间的关系的 虚词,在句中不能单独作句子成分。如from(从),in(在…内),between(在…之间)。9.连词(conjunction,缩写为conj.)是连接词、短语、从句和句子的词,如and(和), because(因为),if(假如)。 10.感叹词(interjection,缩写为int.)表示喜怒哀乐等感情的词。如,oh(噢),aha(啊 哈),hush(嘘)。 注意点一:属于前六类(名、代、形、数、动、副等词)的词都有实义,叫做实词(notional word)。属于后四类(冠、介、连、感等词)的词没有实义,叫做虚词(form word)。注意点二:不少词可以属于几个词类,如work(工作;动词和名词),fast(快;形容词和副词),since(自从;连词和介词)等。 ●句法 1.句子:是由词和词组构成的、能够表达完整的意思的语言单位。 2.句子成分:指构成句子的各组成部分,即词和短语在句子中的各种语法意义。英语 的句子由主语部分与谓语部分组成。具体地讲,主要有下列六种句子成分:

词法分析课程设计

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

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

编译原理词法分析器

一、实验目的 了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA 编写通用的词法分析程序。 二、实验内容及要求 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 2.编写DFA模拟程序 算法如下: DFA(S=S0,MOVE[][],F[],ALPHABET[]) /*S为状态,初值为DFA的初态,MOVE[][]为状态转换矩阵,F[] 为终态集,ALPHABET[] 为字母表,其中的字母顺序与MOVE[][] 中列标题的字母顺序一致。*/ { Char Wordbuffer[10]=“”//单词缓冲区置空 Nextchar=getchar();//读 i=0; while(nextchar!=NULL)//NULL代表此类单词 { if (nextcha r!∈ALPHABET[]){ERROR(“非法字符”),return(“非法字符”);} S=MOVE[S][nextchar] //下一状态 if(S=NULL)return(“不接受”);//下一状态为空,不能识别,单词错误 wordbuffer[i]=nextchar ;//保存单词符号 i++; nextchar=getchar(); } Wordbuffer[i]=‘\0’;

词法分析

词法分析器的实现 开篇 编译,简单的说,就是把源程序转换为可执行程序。从hello world 说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对底层该兴趣的我,自然的,也就迫切想搞清楚编译的内部实现,也就是编译的原理。 这篇文章主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。 介绍 编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。 可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。有了C做中间层,A和B才能正常交流。C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。 编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、) 然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。 程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。 这篇博文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。 词法分析 定义: 词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等 (1) 关键字是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,en d,if,while都是保留字。这些字通常不用作一般标识符。 (2) 标识符用来表示各种名字,如变量名,数组名,过程名等等。 (3) 常数常数的类型一般有整型、实型、布尔型、文字型等。 (4) 运算符如+、-、*、/等等。 (5) 界符如逗号、分号、括号、等等。 输出:

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