词法分析报告

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

《编译原理》课程

实验报告

题目词法分析

专业软件工程

班级06065501

学号0606550118

姓名刘永超

申请成绩 C

指导教师曹雪

南京理工大学计算机学院

2009年5月

实验1:词法分析

词法分析小结

词法分析小结 词法分析是编译器工作的第一阶段,它的工作就是从输入(源代码)中取得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)来描述,因为用它来描述非常直观且很容易。

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

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

英汉翻译中的增词法和减词法

英汉翻译中的增词法和减词法 英汉两种语言,由于表达方式不尽相同,翻译时既可能要将词类加以转换,又可能要在词量上加以增减。 标签:翻译;增词法;减词法 英汉两种语言,由于表达方式不尽相同,翻译时既可能要将词类加以转换,又可能要在词量上加以增减。增补法就是在翻译时按意义上和句法上的需要增加一些词来更忠实通顺地表达原文的思想内容。减词法也可以称之为省略法。省略是指原文中有些词在译文中不译出来,因为其在译文中是不言而喻的。但省略并不是把原文的某些思想内容删去。 一、增词法 (一)词汇加词,也就是说,由于词汇方面的原因而引起的加词现象 1.加动词 由于英语的词汇当中,名词居多;而汉语则不管有多少动词都可以并排使用。因此,许多英语的名词翻译成汉语时都要加上一些动词,否则,意思则很不完整,例如: The cities utilize these funds for education,police and fire departments,public works and municipal buildings.市政府将这些资金用于兴办教育事业,加强治安消防,投资公共建筑和市政工程。 2.加名词 在汉语中,及物和不及物动词的区别不是很明显;而英语对及物动词和不及物动词的区别很明显,特别是一些不及物动词必须带上后面的宾语句子意思才完整。因此,我们在翻译时往往需要增词。例如: According to scientists,it takes nature 500years to create an inch of topaoil. 根据科学家们的看法,自然界要用500年的时间才能形成一英寸厚的表面土壤。 3.加形容词 With what enthusiasm the Chinese people are building socialism. 中国人民正在以多么高的热情建设社会主义啊!

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

昆明理工大学信息工程与自动化学院学生实验报告 (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<

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

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“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所示

增词法减词法补充,课后看

通过英译汉中的增词法减词法复习汉译英增词法减词法 I. What is Omission Omission: Amplification to leave out some unnecessary words. One of the differences in syntax between English and Chinese is the disparity in wording. What is regarded as a natural or indispensable element in one language may be regarded as superfluous or even “a stumbling block”in the other. For the sake of succinctness, functional words in English such as the article, the preposition are usually omitted in translation. The time-keeping devices of electronic watches are much more accurate than those of mechanical ones. 电子表比机械表准确得多。 He took off his coat and shoes. Then he put on his slippers,went to the sofa and began to watch TV. After a moment, he asked his wife to bring him a cup of tea. 他脱了大衣和鞋子,然后穿上拖鞋,走到沙发前,开始看电视。过了一会儿,他叫妻子给他端杯茶来。 3) A difference arose between the neighbors over the height of the fence. 邻居之间为了篱笆的高度惹起了一场争论。 邻居为篱笆的高低有过争论。(思果,《译道探微》,中国对外翻译出版公司,2002) II. Omission of pronoun 1. 在英语中,代词充当主语的情况相当多。为了使译文前后的句子意思紧凑,避免重复 用词,汉语习惯采用无主句,其主语就是前面的代词。 He was thin and haggard and he looked miserable. 他消瘦而憔悴,看上去痛苦不堪的样子(一副可怜相) He was well-favoured, bright, a good dancer, a fair shot and a fine tennis player. He was an asset at any party. He was lavish with flowers and expensive boxes of chocolate, and though he entertained little, when he did it was with an originality that pleased. 他很聪明,舞跳得不错,枪打得也可以,网球也打得挺好,深得(女孩子)喜爱。他是宴会中的宝贝儿,任意购买鲜花和高价巧克力送人。尽管他不大请客,请起来也别有一番创意,让人开心不已。 2.英语中的泛指人称代词作主语时,常常可以省略,翻译成无主句。 As you come into the room, you’ll notice a piano. 一进房间门,就会看见一台钢琴。 One can never be too careful in one’s work. 工作越仔细越好。 Fight when you can win; move away when you cannot win. 打得赢就打,打不赢就走。 We have 7 days a week and 24 hours a day. 一周有七天,一天有24小时。 1) The significance of a man is not in what he attains but rather in what he longs to attain. 人生的意义不在于已获取的,而在于渴望获得什么样的东西。

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对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);

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

词法分析器实验报告 一、实验目的 选择一种编程语言实现简单的词法分析程序,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 待分析的简单的词法 (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所示。

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

理工大学信息工程与自动化学院学生实验报告 (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++)

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

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

简单词法分析器

简单词法分析器 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"<

实验一词法分析

实验一词法分析 1.实验要求 (1)从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出。 (2)掌握词法分析的实现方法。 (3)实验时间4学时。 (4)实验完成后,要提交实验报告(包括源程序清单)。 2.实验内容 2.1主程序设计考虑: 主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。 id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。 主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。 2.2词法分析过程考虑 该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id 中,将 三:主流程图如下:

四:实验思路 (1)我首先把这个单词的种类分成了五类,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别 (2)对于关键字、算符、界符。因为这些单词的个数有限。所以我单独给每个单词一个种别编码。能够做到每个单词的种别编码是不一样的。而对于常数和标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。 (3)然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp 二维数组中。然后用这个临时的二维数组去确定这个单词是何种类别 五:实验代码 using System; using System.Collections.Generic;

词法分析课程设计

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

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

编译原理词法分析和语法分析报告+代码(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所示。

词法分析

实验二:词法分析 一、实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词, 即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及 Error”,然后跳过错误部分继续显示) 二、估计实验时间:1.课余准备15小时;2.上机二次4小时;3.完成实验报告5小时。 三、实验过程和指导: (一)准备:1.阅读课本有关章节,花一周时间明确语言的语法,写出基本保留字、标识符、 常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。 (二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求:Array程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。 要求: 识别保留字:if、int、for、while、do、return、break、 其他的都识别为标识符;

常数为无符号整形数; 运算符包括:+、-、*、/、=、>、<、>=、<=、!= 分隔符包括:,、;、{、}、(、) 程序思路(仅供参考): 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白(可选,看着办)。 4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 5.显示结果。 (四)练习该实验的目的和思路: 程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。程序规模大概为200行。本实验和以后的实验相关。通过练习,掌握对字符进行灵活处理的方法。 (五)为了能设计好程序,主意以下事情: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 四、上交: 1.程序源代码;

翻译技巧:加词法和减词法

翻译技巧(二):加词法和减词法 加(增)词法 英汉两种语言,由于表达方法不尽相同,有些词在英语中可以省略而不会影响全句意思的完整表达,但译成汉语后就可能出现意思不够明确的语言现象;还有些词虽然在原文中意义明确而完整,但译成汉语后文字却不甚通顺流畅。在这种情况下,就需要使用增词译法。增词法就是在翻译时按照意义、修辞或句法上的需要,在原文的基础上添加必要的单词、词组、分句或完整句,从而使得译文在语法、语言形式上符合译文习惯和在文化背景、词语联想方面与原文一致,使得译文与原文在内容、形式和精神等三方面都对等起来,更忠实通顺地表达原文的思想内容。 S y n t a c t i c a l A m p l i f i c a t i o n(从句法结构上考虑的增词) This kind of amplification includes: amplification by supplying such kinds of words as verbs, nouns, adjectives, adverbs, numerals, category words, generalization words, and the plural forms of nouns. (1) 增加量词(classifier) 英语中数词与可数名词往往可以直接连用,不用加量词。而汉语往往要加量词。 It was a nova! 这是一颗新星! The sun rose thinly from the sea. 一轮红日从海边淡淡升起。 A stream was winding its ways through the valley into the river. 一弯溪水蜿蜒流过山谷,汇到江里去了。 (2) 增加表达复数的词(convey the concept of plurality)

词法分析

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

增词法和减词法 translation

Amplification & Omission增词法和减词法 翻译的标准首先是忠实于原文。那么,忠实是否就意味着我们在翻译过程中不能增加词也不能减少词呢?实际上并非如此。美国著名翻译学家奈达曾经说过“Translation is translating meaning”,在翻译过程中主要是准确表达出原文的意思,而不必拘泥于原文用词的形式。英汉两种语言不论在词汇上还是在句法上都存在着显著的差异,一味拘泥于原文的形式,有时会令人费解、语句罗嗦或偏离原文的意思。适当地增加一些词或者省略一些词,恰恰是为了达到忠实于原文或者通顺流畅表达的目的。下面分别举例介绍一下英汉翻译过程中常见的增词和减词的用法。 1.增词法 增词法并不是说译者可以随心所欲地增加任何词。一般说来,增加的词尽管没有出现在原文字面上,但实际上其意思都隐含在原文中。经常使用的增词法有以下几种情况: (1)增加表示时态和复数的词 英语具有某些综合形语言的特征,可以通过名词、动词的词形变化来表现时态和复数。而汉语则是典型的分析形语言,词形本身没有变化,要表示时态和复数需要通

过增加相应的时间副词或表示复数的词。所以一定要注意在汉语译文中添加这些词,如: 例1:His father was a fisherman. He was as poor as we are. 译文:他父亲过去是个渔夫。那时候他和我们现在一样穷。 例2:The agreement will come into force next spring. 译文:协议将于明年生效。 例3:Lion is the king of animals. 译文:狮子是百兽之王。 例4:As is known to all, air is a mixture of gases. 译文:众所周知,空气是许多种气体的混合物。 (2)增加语义表达中需要的词 增加语义表达中需要的词,是指为了使译文表达通顺流畅而根据汉语的表达习惯增加的一些词。经常增加的语义表达中需要的词有动词、名词、形容词、副词和量词。 1) 增加动词 汉语句子中动词占优势,使用的频率很高。因此英汉翻译中经常需要根据上下文的意思添加一些动词,使译文表达更加清楚、通顺,如: 例5:He dismissed the meeting without a closing speech.

相关文档
最新文档