汇编语言词法分析(新)
程序编译的四个步骤
![程序编译的四个步骤](https://img.taocdn.com/s3/m/bdd0e08b88eb172ded630b1c59eef8c75ebf9517.png)
程序编译的四个步骤程序编译是将高级语言编写的程序翻译成机器语言的过程。
编译器是用来进行编译的工具,它可以将源代码转换为可执行的机器码,从而能够被计算机直接执行。
程序编译通常包括四个主要步骤:词法分析、语法分析、语义分析和代码生成。
1.词法分析词法分析是程序编译的第一步,也是一个很关键的步骤。
在词法分析中,编译器会将源代码分解为一个个的词法单元。
词法单元是程序的最小语法单位,可以是关键字、标识符、运算符、常量等等。
编译器会根据事先定义好的语法规则,将源代码中的字符序列解析成词法单元序列,并且给每个词法单元加上相应的标记,以便后面的步骤进行处理。
2.语法分析语法分析是程序编译的第二步。
在语法分析中,编译器会根据词法分析得到的词法单元序列,构建语法树或抽象语法树。
语法树是一个树状的数据结构,它表示程序的语法结构。
编译器会根据文法规则和词法单元的组合规则,对词法单元序列进行检查,并将其组织成语法树或抽象语法树。
语法树或抽象语法树是编译器进行后续处理的基础,它描述了程序的语法结构,方便后续步骤对程序进行分析和优化。
3.语义分析语义分析是程序编译的第三步。
在语义分析中,编译器会对语法树或抽象语法树进行分析,进行语义检查和语义推导。
语义是指程序中传达的意义和规则,它描述了程序如何运行和产生结果。
编译器会根据语义规则检查程序是否存在语义错误,并进行类型检查和类型推导。
如果程序存在语义错误,则编译器会输出错误信息,提示开发人员进行修正。
另外,编译器还会进行一些语义转换和优化,例如将高级语言中的循环结构转换为汇编语言中的跳转指令。
4.代码生成代码生成是程序编译的最后一步。
在代码生成中,编译器会根据语义分析得到的语法树或抽象语法树,生成目标代码或机器代码。
目标代码是特定平台上的中间代码表示,它与具体的机器相关性较低。
机器代码是目标机器上可以直接执行的二进制代码。
编译器会将目标代码或机器代码生成为对应的输出文件,例如可执行文件、动态链接库或静态链接库。
(完整版)编译原理名词解释
![(完整版)编译原理名词解释](https://img.taocdn.com/s3/m/9b2b8a5c777f5acfa1c7aa00b52acfc789eb9f01.png)
(完整版)编译原理名词解释1.源语⾔:书写源程序所使⽤的语⾔2.源程序:⽤程序设计语⾔书写的程序3.⽬标语⾔:计算机的机器指令。
⽬标语⾔可以是机器语⾔,也可以是汇编语⾔,或者是其他中间语⾔,但最终结果必是机器语⾔。
4.⽬标程序:由机器指令构成的程序。
⽬标程序是经过翻译程序加⼯后⽤⽬标语⾔表⽰的程序。
5.翻译程序:能够把某⼀种语⾔程序(源程序)改造成另⼀种语⾔程序(⽬标程序)将源程序译成逻辑上等价的⽬标程序的程序。
翻译程序有两种⼯作⽅式:编译和解释。
6.编译程序:也称翻译程序7.解释程序:有些翻译程序在翻译过程中并不产⽣完整的⽬标程序,⽽是翻译⼀句,解释执⾏⼀句,这样的称为解释程序。
8.汇编程序:由汇编语⾔写成的程序9.词法分析:执⾏词法分析的程序成为词法分析器,词法分析依据的是语⾔构词规则。
词法分析器从⽂件读⼊源程序,由字符拼接单词。
每当识别出⼀个单词,词法分析器就输出这个单词的内部码。
10.语法分析:执⾏语法分析的程序叫做语法分析器。
语法分析的任务就是根据语⾔的规则,将词法分析器所提供的单词种别分成各类语法范畴。
11.中间代码⽣成:中间代码产⽣有时称为语义分析,执⾏中间代码产⽣的程序称为中间代码⽣成器。
他的任务时按照语法分析器所识别出的语法范畴产⽣相应的中间代码,并建⽴符号表、常数表,等各种表格。
12.⽬标代码⽣成:执⾏⽬标代码⽣成的程序称为⽬标代码⽣成器。
他的任务是根据中间代码和表格信息,确定各类数据在内存中的位置,选择合适的指令代码,将中间代码翻译成汇编语⾔或机器指令,这部分⼯作与计算机硬件有关。
13.符号表:⽤于记录源程序中出现的标识符,⼀个标识符往往具有⼀系列的语义值,她包括标识符的名称、种属、类型、值存放的地址等等。
14.常数表:⽤于记录在源程序中出现的常数。
15.编译程序前端:是由词法分析器、语法分析器和中间代码产⽣器组成的。
她的特点是依赖于被编译的源程序,输出结果⽤中间代码描述,和⽬标机器⽆关。
什么是编译器
![什么是编译器](https://img.taocdn.com/s3/m/b23a233577c66137ee06eff9aef8941ea66e4b52.png)
什么是编译器?编译器是一种将高级语言代码转换成机器语言的软件工具。
它是计算机科学中的一个重要概念,用于将人类可读的代码转换为计算机可执行的指令。
编译器的主要功能是将源代码(如C、C++、Java等高级语言)转换为目标代码(如汇编语言或机器语言)。
这个转换过程被称为编译。
编译器分为多个阶段,每个阶段都完成了特定的任务,最终生成可执行的目标文件。
编译器的工作流程通常包括以下几个步骤:1. 词法分析(Lexical Analysis):将源代码分解为一个个词法单元(Token),如关键字、标识符、运算符等。
词法分析器扫描源代码,识别和分类各个词法单元。
2. 语法分析(Syntax Analysis):将词法分析得到的词法单元组织成语法树(Parse Tree)或抽象语法树(Abstract Syntax Tree)。
语法分析器根据语法规则检查源代码的语法正确性,并生成中间表示。
3. 语义分析(Semantic Analysis):对中间表示进行语义检查,确保源代码的语义正确性。
语义分析器会检查变量的声明和使用、类型匹配、函数调用等语义相关的问题。
4. 中间代码生成(Intermediate Code Generation):将语法分析和语义分析得到的中间表示转化为一种中间代码,如三地址码或虚拟机代码。
中间代码是一种抽象的表示形式,比源代码更接近于机器语言。
5. 代码优化(Code Optimization):对中间代码进行优化,以提高程序的性能和效率。
代码优化器尝试通过改变代码结构、减少计算和存储等方式来减少程序的执行时间和空间消耗。
6. 目标代码生成(Code Generation):将优化后的中间代码转换为机器语言或特定硬件平台的汇编语言。
目标代码生成器会根据目标机器的架构和指令集生成相应的机器代码。
7. 符号表管理(Symbol Table Management):编译器会维护一个符号表,用于存储变量、函数和其他标识符的信息。
清华大学编译原理第二版课后习答案
![清华大学编译原理第二版课后习答案](https://img.taocdn.com/s3/m/2776177fa26925c52cc5bfc9.png)
Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
电子科技大学编译原理--B答案--网络教育
![电子科技大学编译原理--B答案--网络教育](https://img.taocdn.com/s3/m/811f8a78e2bd960591c6774c.png)
《计算机编译原理》试卷B参考答案一、单项选择题(每小题1分,共25分)1、有文法G:E→E*T|TT→T+i|i句子1+2*8+6按该文法G归约,其值为___B___。
A、23B、42C、30D、172、规范归约指___B___。
A、最左推导的逆过程B、最右推导的逆过程C、规范推导D、最左归约的逆过程3、词法分析所依据的是___B___。
A、语义规则B、构词规则C、语法规则D、等价变换规则4、词法分析器的输出结果是___C___。
A、单词的种别编码B、单词在符号表中的位置C、单词的种别编码和自身值D、单词自身值5、正规式M1和M2等价是指___C___。
A、M1和M2的状态数相等B、M1和M2的有向弧条数相等C、M1和M2所识别的语言集相等D、M1和M2状态数和有向弧条数相等6、下面的状态转换图接受的字集为___D___。
A、以0开头的二进制数组成的集合B、以0结尾的二进制数组成的集合C、含奇数个0的二进制数组成的集合D、含偶数个0的二进制数组成的集合7、词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此,___B___。
A、词法分析器应作为独立的一遍B、词法分析器作为子程序较好C、词法分析器分解为多个过程,由语法分析器选择使用D、词法分析器并不作为一个独立的阶段8、若a为终结符,则A→α·aβ为___B___项目A、归约B、移进C、接受D、待约9、若项目集I k含有A→α·,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A→α·”动作的一定是___D___。
A、LALR文法B、LR(0)文法C、LR(1)文法D、SLR(1)文法10、就文法的描述能力来说,有___C___。
A、SLR(1)⊂LR(0)B、LR(1)⊂LR(0)C、SLR(1)⊂LR(1)D、无二义文法⊂LR(1)11、在LR(0)的ACTION子表中,如果某一行中存在标记“r j”的栏,则___A___。
18秋地大《编译原理(新)》在线作业二满分答案
![18秋地大《编译原理(新)》在线作业二满分答案](https://img.taocdn.com/s3/m/02020b2f7cd184254b353533.png)
地大《编译原理(新)》在线作业二在LR分析法中,分析栈中存放的状态是识别规范句型()的DFA状态。
A.句柄B.前缀C.活前缀D.LR(0)项目正确答案:C词法分析器的输出是()。
A.字符串B.二元式C.三元式D.四元式正确答案:A有文法G[S]:S→aA|a|bC A→aS|bB B→aC|bA|b C→aB|bS则()为L(G)中的句子。
A.a100b50ab100B.a1000b500abaC.a500b50aab2aD.a100b40ab10aa正确答案:C()阶段检查程序的语义正确性,以保证程序各部分能有意义地结合在一起,并为以后的代码生成阶段收集类型信息。
A.语法分析B.词法分析C.语义分析D.中间代码生成正确答案:C编译程序中语法分析器接收以()为单位的输入。
A.单词B.表达式C.产生式D.句子正确答案:A把一个高级语言程序翻译成机器可执行的目标程序的工作由下列程序之一完成()。
A.汇编程序B.解释程序C.编译程序D.预处理程序正确答案:C最常用的中间代码形式是()。
A.二元式B.三元式C.四元式D.树形表示正确答案:C在语法分析处理中,FIRST集合、FOLLOW集合、SELECT集合均是()。
A.非终极符集B.终极符集C.字母表D.状态集正确答案:B以()定义给定的语言称为生成的观点。
A.文法B.语法图C.状态转换图D.自动机正确答案:A设有文法G[S]:S?S1|S0|Sa|Sc|a|b|c,下列符号串中是该文法的句子有()。
A.ab0B.a0c01C.aaaD.bc10。
请简要描述编译的各个阶段的功能及输入输出。
![请简要描述编译的各个阶段的功能及输入输出。](https://img.taocdn.com/s3/m/b5b4f947a55177232f60ddccda38376baf1fe09f.png)
请简要描述编译的各个阶段的功能及输入输出。
编译是将高级语言代码转换成机器语言的过程。
它分为多个阶段,每个阶段都有不同的功能和输入输出。
1. 词法分析阶段:输入为源代码,输出为词法单元序列。
该阶段将源代码转换成词法单元序列,每个词法单元代表一个单词或符号。
2. 语法分析阶段:输入为词法单元序列,输出为语法树。
该阶段将词法单元序列转换成语法树,检查语法是否正确。
3. 语义分析阶段:输入为语法树,输出为带有语义信息的语法树。
该阶段对语法树进行语义分析,检查变量和函数是否定义,类型是否匹配等。
4. 中间代码生成阶段:输入为带有语义信息的语法树,输出为中间代码。
该阶段将语法树转换成中间代码,可以是三地址码、虚拟机指令等。
5. 代码优化阶段:输入为中间代码,输出为优化后的中间代码。
该阶段对中间代码进行优化,去除冗余代码,减少执行时间和空间消耗等。
6. 目标代码生成阶段:输入为优化后的中间代码,输出为目标机器代码。
该阶段将中间代码转换成目标机器代码,可以是汇编语言或二进制机器码。
7. 目标代码优化阶段:输入为目标机器代码,输出为优化后的目标机器代码。
该阶段对目标机器代码进行优化,提高执行效率和
减小目标文件大小。
总之,编译的各个阶段都有特定的功能和输入输出,它们共同协作完成将高级语言代码转换成目标机器代码的过程。
编译技术(新)
![编译技术(新)](https://img.taocdn.com/s3/m/424fdf35e97101f69e3143323968011ca300f76c.png)
一、多选(共计25分,每题2.5分,每题答案完全一样得满分,少选、多选、错选均不得分。
)错误:【A;B;D】2、对于文法G【E】:⑴E→E+T ⑵E→T ⑶T→T*F ⑷T→F ⑸F→(E) ⑹F→a句型a错误:【A;D】错误:【B;D】错误:【B;D】5、通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标错误:【C;D】错误:【A;D】错误:【A;D】错误:【A;B;C】错误:【A;B;C】10、在词法分析中,能识别出_____。
错误:【A;B;D】二、判断(共计25分,每题2.5分)错误:【A】错误:【A】错误:【B】14、紧跟在条件转移语句后面的语句是基本块的入口语句。
错误:【A】错误:【B】错误:【A】17、对于在一个基本块内后边不再被引用的变量所占用的寄存器应尽早释放,以提高寄存错误:【A】错误:【B】错误:【B】错误:【A】三、单选(共计50分,每题2.5分)错误:【C】22、在编译过程中,如果遇到错误应该_____。
A. 把错误理解成局部的错误B. 对错误在局部范围内进行纠正,继续向下分析错误:【C】错误:【B】错误:【C】错误:【A】错误:【D】27、不能被如下状态转换图识别的句子是____。
错误:【D】28、自底向上语法分析法的原理是____。
A. “移进——推导法”B. “最左推导法”错误:【C】29、已知属性文法G【S】:则若输入“xxxxyzz”,文法将输出____。
错误:【B】错误:【D】31、如果文法G是无二义的,则它的任何句子α_____。
A. 最左推导和最右推导对应的语法树必定相同B. 最左推导和最右推导对应的语法树可能不同错误:【A】错误:【A】错误:【C】错误:【D】错误:【B】错误:【A】错误:【C】38、文法G 所描述的语言是____的集合。
错误:【C】错误:【B】40、有文法G及其语法制导翻译的属性文法如下所示(语义规则中的*和+分别是常规意义下的算术运算符):错误:【C】一、多选(共计25分,每题2.5分,每题答案完全一样得满分,少选、多选、错选均不得分。
编译原理(第2版)课后习题答案详解
![编译原理(第2版)课后习题答案详解](https://img.taocdn.com/s3/m/dfa88a86b9d528ea81c779e0.png)
第1 章引论第1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
编译器前端常用算法
![编译器前端常用算法](https://img.taocdn.com/s3/m/85869acaf605cc1755270722192e453610665bdd.png)
编译器前端常用算法编译器前端是计算机科学中重要的领域之一,其中算法是编译器前端实现的核心。
本文将介绍编译器前端常用的算法,以及它们的作用和实现方式,帮助读者深入了解编译器前端的运行机制,同时提高编译器前端算法的应用能力。
1. 词法分析词法分析是编译器前端的第一阶段,用来将输入的源代码解析成词法单元(Token)。
词法单元是编译器的基本组成单元,包括关键字、标识符、运算符等。
其中最常用的算法是正则表达式和有限自动机。
正则表达式是一种用来描述字符串模式的表达式,它的基本组成单元包括文本字符、元字符和转义字符。
正则表达式可以用于匹配字符串,从而识别出词法单元。
有限自动机是一种用来处理有限集合和字符串的计算机模型,它能够对输入的字符串进行匹配、分割和转化等操作,是词法分析算法的重要基础。
2. 语法分析语法分析是编译器前端的第二阶段,用来将词法单元转化成抽象语法树(AST,Abstract Syntax Tree)。
抽象语法树是一种用来表示程序语法结构的树形结构,它能够帮助编译器进行语法分析和语义分析。
语法分析通常使用自上而下(Top-Down)和自下而上(Bottom-Up)两种算法。
自上而下的算法包括递归下降法和LL算法,它们从源代码的起始符号开始,通过递归调用函数来构建语法树。
自下而上的算法包括LR算法和LALR算法,它们从词法单元向语法树构建,并且能够处理更加复杂的语法结构。
3. 语义分析语义分析是编译器前端的第三阶段,用来对抽象语法树进行语义分析和错误检测。
语义分析主要包括类型检查、作用域分析、常量折叠和表达式求值等功能。
类型检查是语义分析的核心部分,它主要用来检查类型的一致性和正确性。
作用域分析用来检查变量和函数的定义和引用,常量折叠用来通过计算常量表达式来优化程序。
表达式求值则是将程序中的表达式转化为机器指令的过程,是编译器前端中最为复杂的部分。
4. 中间代码生成中间代码生成是编译器前端的第四阶段,用来将抽象语法树转化成中间代码表示,中间代码是一种类似于汇编语言的低级中间表示,它能够简化后续编译器优化和目标代码生成的流程。
编译原理课后习题答案
![编译原理课后习题答案](https://img.taocdn.com/s3/m/c116c0fcafaad1f34693daef5ef7ba0d4a736d86.png)
编译原理课后习题答案编译原理习题答案习题11.1翻译程序:把⽤某种程序设计语⾔(源语⾔)编写的程序(源程序)翻译成与之等价的另⼀种语⾔(⽬标语⾔)的程序(⽬标程序)。
编译程序:⼀种翻译程序,将⾼级语⾔编写的源程序翻译成等价的机器语⾔或汇编语⾔的⽬标程序。
1.2词法分析、语法分析、语义分析和中间代码⽣成、代码优化、⽬标代码⽣成1.3词法分析:根据语⾔的词法规则对构成源程序的符号进⾏扫描和分解,识别出⼀个个的单词。
语法分析:根据语⾔的语法规则,把单词符号串分解成各类语法单位。
语义分析及中间代码⽣成:对语法分析识别出的语法单位分析其含义,并进⾏初步翻译。
代码优化:对中间代码进⾏加⼯变换,以产⽣更⾼效的⽬标代码。
⽬标代码⽣成:将中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或会变指令代码。
以上5个阶段依次执⾏。
习题22.1 (1)有穷⾮空的符号集合(2)利⽤产⽣是规则A->v将A替换为v时与A的上下⽂⽆关。
(3)略(4)推导是把句型中的⾮终结符⽤⼀个产⽣是规则的右部开替代的过程;直接推导是将⾮终结符的替代结果只⽤了⼀次产⽣式规则。
(5)略(6)⼀个句型的最左直接短语(7)如果⼀个⽂法存在某个句⼦对应两棵不同的语法树或有两个不同的最左(右)推导,则称这个⽂法是⼆义的。
2.2(1)VN ={Z,A,B} VT ={a,b,c,d,e}(2)abbcde,abbbcde是,acde不是。
2.3 (1)L[G]={d|n≥1,m≥0}(2)2.4 (1) A=>B=>c=>fAg=>fBg=>fCg=>feg(2)A=>AaB=>AaC=>Aae=>Bae=>BcCae=>Bceae=>Cceae=>eceae(3)A=>B=>BcC=>BcfAg=>BcfAaBg=>BcfAaCg=>BcfAaeg=>BcfBaeg =>BcfCaeg=>Bcfeaeg=>Ccfeaeg=>ecfeaeg(3)中题⽬有错应为C fCg|e2.5L[G]={a?b?c?|aab,n≥2}2.6 (1)Z→AB A→Aa|ε B→Bb|ε(2)Z→aZb|ab(3)Z→aAb A→aAb|b(4)Z→AB A→aAb|ab B→cB|ε(5)Z→aaAb|ab Z→aaBb|bb A→aaAb|ab B→aaBb|bb2.7 ⼀位数:Z→2|4|6|8两位数:Z→AB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8三位以上:Z→ACB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8 C→CDD→0|1|2|3|4|5|6|7|8|92.8证明:E=>E+T=>E+T*F短语:T*F E+T*F 直接短语:T*F 句柄:T*F2.9 语法树: E 短语:E*T , (E*T) , F↑(E*T) ,F ,E* F↑(E*T)E *F 直接短语:E*T , FT ↑ F 句柄:FF ( E )E * T2.10(1)语法树(2)直接短语:a , ZZ 句柄:Z( L )L , ZZ ( L )Za2.11最左推导:Z=>ZaB=>BaB=>B+AaB=>A+AaB=>(+)Z*aB=>(+)ZaB*aB =>(+)+aB*aB=>(+)+aA*aB=>(+)+a(*aB=>(+)+a(*aA=>(+)+a(*a(直接短语:(,+句柄:(2.12(1) S=>iSeS=>iiSeS=>iiIeS=>iiIeIS=>iS=>iiSeS=>iiIeS=>iiIeI(2) S=>SaS=>cSaS=>cfaS=>cfafS=>cS=>cSaS=>cfaS=>cfaf(3) E=>EOE=>EOEOE=>iOEOE=>i+EOE=>i+iOE=>i+i-E=>i+i-iE=>EOE=>iOE=>i+E=>i+EOE=>i+iOE=>i+i-E=>i+i-i2.13 Z→aABZ|cCACdA→bAB|aZA|cCCB→bAB|CzbC→cZ|c习题33.1(1)确定的有限⾃动机(2)不确定的有限⾃动机(3)正规集是⼀类特殊的单词集合,正规式是正规集的描述⼯具 3.2 (1) (1|2|3|4|5|6|7|8|9|0)*(1|3|5|7|9) (2) 11(0|1)*00 3.3 证明:b *(a|b)+={a,b,ab,ba,aa,bb …} (a|b)+={a,b,ab,ba,aa,bb …} 3.4 (1)(2)DDDD3.5(1) (2)(3)3.6(1) (01|10) *(01|10)(2) (0(1|00)*)|003.7(1) Z →1AB (2)Z →ABA →(0|1)A A →0A|εA →0|1B →(0|1)B|ε B →0B B →ε3.8 r=a(a|b )*bb3.9 Z →1BB →0Z|0 Z →0Z|ε3.10 3.11DDD习题44.1 (1)若⽂法G[Z]满⾜①⽂法不含左递归②③(2)4.2(1) First(S)={a,d} First(B)={a,d,c,ε}First(A)={a,d,e,c} First(D)={a,d,ε}Follow(S)={#,a,b,d,e} Follow(B)={a,d}Follow(A)={b} Follow(D)={e,a,d,b}(2) 不是4.3 (1) 证明: First(Z)={a,b,c} Follow(S)={#,a,b,c,d} First(A)={a,b,c,d} Follow(A)={ #,a,b,c,d }First(B)={a,d,c} Follow(B)={ a,b,c,d } 是LL(1)⽂法。
编译原理词法分析习题集带答案
![编译原理词法分析习题集带答案](https://img.taocdn.com/s3/m/63c83a1b680203d8ce2f24c4.png)
《编译原理》习题(一)——词法分析一、就是非题(请在括号内,正确的划√,错误的划×)1.编译程序就是对高级语言程序的解释执行。
(× )2.一个有限状态自动机中,有且仅有一个唯一的终态。
(×)9.两个正规集相等的必要条件就是她们对应的正规式等价。
(× )二、选择题1.词法分析器的输出结果就是_____。
A.( ) 记号B.( ) 相应条目在符号表中的位置C.( ) 记号与属性二元组D.( ) 属性值2. 正规式M 1 与M 2 等价就是指_____。
A.( ) M1与M2的状态数相等B.( ) M1与M2的有向边条数相等C.( ) M1与M2所识别的语言集相等D.( ) M1与M2状态数与有向边条数相等3.语言就是A.句子的集合B.产生式的集合C.符号串的集合D.句型的集合4.编译程序前三个阶段完成的工作就是A.词法分析、语法分析与代码优化B.代码生成、代码优化与词法分析C.词法分析、语法分析、语义分析与中间代码生成D.词法分析、语法分析与代码优化5.扫描器所完成的任务就是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即A. 字符B.单词C.句子D.句型6.构造编译程序应掌握______。
A.( )源程序B.( ) 目标语言C.( ) 编译方法D.( ) 以上三项都就是7.词法分析的任务就是A.识别单词B.分析句子的含义C.识别句子D.生成目标代码三、填空题1.计算机执行用高级语言编写的程序主要有两种途径:___解释__与__编译___。
3、编译过程可分为( 词法分析) ,(语法分析),(语义分析与中间代码生成),(优化)与(目标代码生成)五个阶段。
6、扫描器的任务就是从( 源程序中)中识别出一个个( 单词符号)。
17、一张转换图只包含有限个状态,其中有一个被认为就是(初)态;而且实际上至少要有一个(终)态。
1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。
编译原理与汇编语言的概念区别
![编译原理与汇编语言的概念区别](https://img.taocdn.com/s3/m/61fbebdb50e79b89680203d8ce2f0066f533649e.png)
编译原理与汇编语言的概念区别编译原理和汇编语言是计算机科学领域中的重要概念,它们在软件开发和计算机编程中发挥着关键作用。
尽管它们都与计算机编程相关,但它们在概念上存在明显的区别。
本文将对编译原理和汇编语言进行比较,以帮助读者更好地理解它们之间的差异。
一、编译原理编译原理是研究将高级程序语言转化为低级机器语言的原理和方法的学科。
它主要涉及编译器的设计和实现,以及语言翻译过程中的各个环节。
编译原理的关键目标是将高级程序语言翻译成等效的机器语言代码,使计算机能够理解和执行这些代码。
编译原理的过程通常包括以下几个步骤:1. 词法分析:将输入的代码根据语法规则分解成各个独立的单词或标记。
2. 语法分析:根据语法规则构建语法分析树,将代码进行结构化的组织。
3. 语义分析:对代码的语义进行分析和验证,确保代码的正确性和合法性。
4. 代码生成:根据语义分析结果生成等效的机器语言代码。
编译原理的优势在于能够将高级程序语言转化成与硬件平台无关的机器语言,使得程序能够在不同的计算机系统上运行,提高了程序的可移植性和灵活性。
二、汇编语言汇编语言是一种低级的编程语言,通常与特定的计算机体系结构直接相关。
它使用助记符和指令来表示底层机器指令,使程序员能够直接操作计算机硬件。
与高级程序语言相比,汇编语言更接近计算机的底层结构,可以更精确地控制计算机的硬件资源。
汇编语言程序需要通过汇编器进行转换,生成机器可读的二进制机器代码。
汇编语言的编码过程相对简单,但由于其对底层硬件的直接控制,程序的开发和维护过程可能会更加冗长和复杂。
汇编语言因其对系统底层硬件的直接控制能力,通常在性能要求非常高的应用场景中使用,如嵌入式系统和驱动程序开发。
三、编译原理与汇编语言的区别1. 抽象级别:编译原理处理高级程序语言,而汇编语言处理底层机器指令。
2. 设计目标:编译原理的主要目标是将高级程序语言转化为等效的机器语言,从而使计算机能够理解和执行这些代码。
汇编器原理
![汇编器原理](https://img.taocdn.com/s3/m/30fc9a0a66ec102de2bd960590c69ec3d5bbdbb1.png)
汇编器原理一、引言汇编器是计算机系统中的重要组成部分,它负责将汇编语言转换为机器语言,以便计算机能够执行指令。
本文将介绍汇编器的原理及其工作流程,以帮助读者更好地理解和应用汇编器。
二、汇编器工作原理汇编器的工作原理可以简单概括为以下几个步骤:词法分析、语法分析、符号解析、代码生成和优化。
1. 词法分析词法分析是汇编器的第一步,它将源代码分解成一个个的词法单元,例如指令、操作数和符号等。
这些词法单元将被用来构建语法树和符号表。
2. 语法分析语法分析是汇编器的第二步,它将词法单元组织成语法树,以表示源代码的结构和关系。
语法分析器会检查语法错误,并生成相应的错误信息。
如果源代码符合语法规则,语法分析器将继续进行下一步。
3. 符号解析符号解析是汇编器的第三步,它将识别和处理源代码中的符号。
符号可以是变量、标签或常量等。
符号解析器会将符号与其对应的地址关联起来,并将结果存储在符号表中,以供后续的代码生成使用。
4. 代码生成代码生成是汇编器的第四步,它将根据语法树和符号表生成机器语言代码。
代码生成器会根据指令集架构的规范,将汇编语言指令转换为对应的机器指令。
同时,代码生成器还会处理相应的指令格式、寻址模式和操作数约束等。
5. 优化优化是汇编器的最后一步,它可以根据特定的优化算法对生成的机器代码进行优化。
优化算法可以提高代码的执行效率,减少指令的数量,或者优化内存访问模式等。
优化过程可以根据具体的需求和目标进行定制。
三、汇编器的应用汇编器在计算机系统中有广泛的应用。
它可以用于开发操作系统、驱动程序、嵌入式系统和高性能计算等领域。
汇编器可以直接操作底层硬件,提供更高的灵活性和性能。
1. 操作系统开发在操作系统开发中,汇编器可以将汇编语言代码转换为机器语言,以便操作系统能够与硬件进行交互。
汇编器可以处理中断、系统调用和内存管理等关键操作。
2. 驱动程序开发驱动程序是用于控制硬件设备的软件模块。
汇编器可以将驱动程序的汇编语言代码转换为硬件可以理解的机器语言代码。
编译原理词法分析习题集带答案
![编译原理词法分析习题集带答案](https://img.taocdn.com/s3/m/db10db9b690203d8ce2f0066f5335a8103d26658.png)
编译原理词法分析习题集带答案《编译原理》习题(⼀)——词法分析⼀、就是⾮题(请在括号内,正确得划√,错误得划×)1.编译程序就是对⾼级语⾔程序得解释执⾏。
(× )2.⼀个有限状态⾃动机中,有且仅有⼀个唯⼀得终态。
(×)9.两个正规集相等得必要条件就是她们对应得正规式等价。
(× )⼆、选择题1.词法分析器得输出结果就是_____。
A.( ) 记号B.( ) 相应条⽬在符号表中得位置C.( ) 记号与属性⼆元组D.( ) 属性值2. 正规式M 1 与M 2 等价就是指_____。
A.( ) M1与M2得状态数相等B.( ) M1与M2得有向边条数相等C.( ) M1与M2所识别得语⾔集相等D.( ) M1与M2状态数与有向边条数相等3.语⾔就是A.句⼦得集合B.产⽣式得集合C.符号串得集合D.句型得集合4.编译程序前三个阶段完成得⼯作就是A.词法分析、语法分析与代码优化B.代码⽣成、代码优化与词法分析C.词法分析、语法分析、语义分析与中间代码⽣成D.词法分析、语法分析与代码优化5.扫描器所完成得任务就是从字符串形式得源程序中识别出⼀个个具有独⽴含义得最⼩语法单位即A. 字符B.单词C.句⼦D.句型6.构造编译程序应掌握______。
A.( )源程序B.( ) ⽬标语⾔C.( ) 编译⽅法D.( ) 以上三项都就是7.词法分析得任务就是A.识别单词B.分析句⼦得含义C.识别句⼦D.⽣成⽬标代码三、填空题1.计算机执⾏⽤⾼级语⾔编写得程序主要有两种途径:___解释__与__编译___。
3、编译过程可分为( 词法分析) ,(语法分析),(语义分析与中间代码⽣成),(优化)与(⽬标代码⽣成)五个阶段。
6、扫描器得任务就是从( 源程序中)中识别出⼀个个( 单词符号)。
17、⼀张转换图只包含有限个状态,其中有⼀个被认为就是(初)态;⽽且实际上⾄少要有⼀个(终)态。
1.编译程序⾸先要识别出源程序中每个(单词),然后再分析每个(句⼦)并翻译其意义。
编译原理试题及答案
![编译原理试题及答案](https://img.taocdn.com/s3/m/d0b7408ec77da26925c5b0a4.png)
B.把高级语言翻译成机器语言
C.把中间代码变换成依赖具体机器的目标代码
D.把汇编语言翻译成机器语言
二、填空题(本大题共5小题,每小题2分,共10分)
1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)
并翻译其意义。 2.编译器常用的语法分析方法有(自底向上)和(自顶向下)两种。 3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和 语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的 生成则是对源程序的(综合)。 4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要 分为两大类,即(静态存储分配)方案和(动态存储分配)方案。 5.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。
B.1型语言
C.2型语言
D.3型语言
5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有
独立含义的最小语法单位即
A. 字符 B.单词 C.句子 D.句型
6.对应Chomsky四种文法的四种语言之间的关系是
A.L0L1L2L3
B.L3L2L1L0
C.L3=L2L1L0
D.L0L1L2=L3
7.词法分析的任务是
文法G所描述的语言用L(G)表示,它由文法G所产生的全部句子组 成,即
L(G)={x| S*x,其中S为文法开始符号,且 } 简单的说,文法描述的语言是该文法一切句子的集合。
四、简答题(共4小题,每小题5分,共20分)
1.编译程序和高级语言有什么区别?
用汇编语言或高级语言编写的程序,必须先送入计算机,经过转换成 用机器 语言表示的目标程序(这个过程即编译),才能由计算机执行。执行转 换过程 的程序叫编译程序。汇编程序是指没有编译过的汇编语言源文件。编译 程序转 换过的叫目标程序,也就是机器语言。
编译原理 第五章 词法分析
![编译原理 第五章 词法分析](https://img.taocdn.com/s3/m/b7ba5273f242336c1eb95e97.png)
三、LEX编译程序的工作过程:
1.根据每条识别规则Pi {ACTION i}构造相应的非确 定有限自动机NFA,分别画出它们的状态转换图; 2.将所有的状态转换图连接成一个完整的状态转换图; 3.由状态转换图构造状态转换矩阵; 4.将状态转换矩阵确定化; 5.根据DFA,构造词法分析器;
预处理 子程序 扫描器 单词符号
输入 列表 输入缓冲区
扫描缓冲区
词法分析器的结构
三、设置缓冲器的必要性
之所以要设置缓冲器,是因为对于许多源程序而言,有 时词法分析器为了得到某个单词符号的确切性质,只从该符 号本身所含有的字符不能作出判定,还需要超前扫描若干字 符之后,才能作出确切的分析。 例如:有合法的Fortran语句: DO99K=1,10 和 DO99K=1.10 前者是循环语句,后者是赋值语句,两者的区别在于等 号后的第一个界符不同,前者是逗号,后者是句号,因此为 了识别前者中的关键字‘“DO”,必须超前扫描若干字符之 后,才能作出确切的判定。
3、词法分析器和语法分析器作为协同程序 如果两个或两个以上的程序,他们之间交叉执行,这些程序称为协同程 序。词法分析器和语法分析器也可协工作的方式安排在同一遍中,以生产 者和消费者的关系同步运行。
1.词法分析单独作为一遍
S.P.(字符串)
第一 遍 词法分析 单词 串 S.P.(符号串) 第二 遍 语法分析
例如:
%{ int wordCount = 0; int noCount = 0; %} chars [A-za-z] numbers ([0-9])+ words {chars}+ 注意:凡是对已经定义的正则表达式的名字的引用,都必须用花括 号将它们括起来。在LEX源程序中,起标识作用的符号%%,%{以及%}都 必须处在所在行的最左字符位置。
编译原理(高起本)题及答案
![编译原理(高起本)题及答案](https://img.taocdn.com/s3/m/17ef343a102de2bd970588b5.png)
课程:编译原理(高起本)总时长:120分钟1. (单选题) 语言是( )(本题2.0分)A、句子的集合B、产生式的集合C、符号串的集合D、句型的集合学生答案: A标准答案:A解析:得分: 22. (单选题) 编译程序前三个阶段完成的工作是( )(本题2.0分)A、词法分析、语法分析和代码优化B、代码生成、代码优化和词法分析C、词法分析、语法分析、语义分析和中间代码生成D、词法分析、语法分析和代码优化学生答案: C标准答案:C解析:得分: 23. (单选题) 一个句型中称为句柄的是该句型的最左( )(本题2.0分)A、非终结符号B、短语C、句子D、直接短语学生答案: D标准答案:D解析:得分: 24. (单选题) 下推自动机识别的语言是( )(本题2.0分)A、0型语言B、1型语言C、2型语言D、3型语言学生答案: C标准答案:C解析:得分: 25. (单选题) 扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即( )(本题2.0分)A、字符B、单词C、句子D、句型学生答案: B标准答案:B解析:得分: 26. (单选题) 对应Chomsky四种文法的四种语言之间的关系是( )(本题2.0分)A、L0L1L2L3B、L3L2L1L0C、L3=L2L1L0D、L0L1L2=L3学生答案: B标准答案:B解析:得分: 27. (单选题) 词法分析的任务是( )(本题2.0分)A、识别单词B、分析句子的含义C、识别句子D、生成目标代码学生答案: A标准答案:A解析:得分: 28. (单选题) 常用的中间代码形式不含( )(本题2.0分)A、三元式B、四元式C、逆波兰式D、语法树学生答案: D标准答案:D解析:得分: 29. (单选题) 代码优化的目的是( )(本题2.0分)A、节省时间B、节省空间C、节省时间和空间D、把编译程序进行等价交换学生答案: C标准答案:C解析:得分: 210. (单选题) 代码生成阶段的主要任务是( )(本题2.0分)A、把高级语言翻译成汇编语言B、把高级语言翻译成机器语言C、把中间代码变换成依赖具体机器的目标代码D、把汇编语言翻译成机器语言学生答案: C标准答案:C解析:得分: 211. (单选题) 将高级语言程序翻译为计算机可执行的目标程序有哪些途径()。
最新编译原理-第1-5章习题课答案精品课件
![最新编译原理-第1-5章习题课答案精品课件](https://img.taocdn.com/s3/m/98159170680203d8cf2f24ee.png)
编译原理
chapter2
chapter1~5习题
1.写出C语言(yǔyán)和Java语言(yǔyán)的输入字母表。
C语言:0~9数字,大小写英文字母,键盘上可见(kějiàn)的字符
Java语言:Unicode可以包括(bāokuò)的所有字符。
6.文法G6为:
N →D|ND
Π:{2,3,a4,5} {0b,1}
b
{2,3,4,50}a={0,1,3,25} b 3 a
分属两区,所以(suǒyǐ)分a为{2,4} {3,5}
{0,1}a={1} {0,1}b={2,4}
所以(suǒyǐ) 0,1等价
{2,4}a={0,1} {2,4}b={3,5}
所以2,4等价
ri0ri1...ri9 P(0,1,2...,9)
(6)最多有一個重複出現的數字的數字符號串的全體
∑i ∑ri0ri1...ri9 i (0,1,2...,9) ri0ri1...ri9 P(0,1,2...,9)
(7)不包含字串abb的由a和b組成的符號串的全體 b*(a*|(ba)*)*
第十九页,共75页。
①.状态(zhuàngtài)转换图
a
1(0|1)*101
g
chapter1~5习题
a
1
(0|1)* b
d 101 g
0
1
ε
ε
a
b
c
1
1
d
0 e
f
1
g
第十二页,共75页。
编译原理
②.状态转换(zhuǎnhuàn)矩阵
a 1
b
ε
0 c
ε
1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与信息工程学院《编译原理》实验报告一实验名称:词法分析实验室:6202班级:09计算机3班姓名:沈春晖学号:0929210062词法分析器的设计一、实验目的通过完成词法分析程序,了解词法分析的过程。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
二、实验环境操作系统:window xp编写环境:visual c++ 、c-free、turbo c编写语言:c语言分析语言:PL/0三、实验内容对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下:(1)关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write(2)标识符:用来表示各种名字,必须以字母开头小于10位字符组成(3)数字:以0-9组成小于14位的数字(4)运算符:+,-,*,/,:=,<,<=,>,>=(5)界符:,,.,;,#表1 各种单词符号对应类型表单词符号类型+ plus- minus* times/ slash( lparen) rparen= eql, comma. perio# neq; semicolonbegin beginsymcall callsymconst constsymdo dosymend endsymififsym oddoddsym procedureproceduresym readreadsym thenthensym var varsym whilewhilesym write writesymN NYY开始调用GETSYM 取单词 输入要分析的文件文件是否存在文件是否结束结束打印分析结果图1 主流程图Y N N NNN YYY YGETSYM滤空CH=空?GETCH CH 是字母? K:=0 K<10?K:=K+1A[K]:=CH GETCHCH 是字母或数字?ID:=A ID 是否是保留字? SYM:=IDENT 相应保留字类别送SYM返回CH 是数字?拼数,将拼数后的值送NUM SYM:=SYM把该字符转换成对应单词,或拼复合单词,将其类别送SYM 中图2 GETSYM 流程图NYGETSYM 函数功能:(1) 滤空格 空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,所以必须过滤(2) 识别保留字 主程序定义了一个以字符为元素的一维数组WORD ,称保留字表。
对字母开头的字母、数字字符串要查此表。
若查着则识别为保留字,将对应的类别放在SYM 中。
如IF 的对应值IFSYM ,THEN 的对应值为THENSYM 。
若查不着,则认为是用户定义的标识符(3) 识别保留字 对用户定义的标识符将IDENT 放在SYM 中,标识符本身的值放在ID 中(4) 拼数 当扫描到数字串时,将字符串形式的十进制数转换为二进制数,然后把数的类别NUMBER 放在SYM 中,数值本身的值放在NUM 中(5) 拼合复合词 对两个字符组成的算符,如:>=、:=、<=等单词,识别后将类别送SYM 中(6) 输出源程序 为边读入字符边输出(可输出在文件中)N NGETCH缓冲区是否还有字符?源程序文件是否结束?打印出错信息 停止编译读入一行源程序放入在LINE 中并输出,置CC:=0 CC:=CC+1CH:=LINE[CC]返回Y Y图3 GETCH 流程图四、实验结果要分析的内容如下:const a=35;var c,d;procedure p;beginvar g;g:=465494366466564444;write(g);end;beginread(c,d);if c<=d then c:=a;write(c,d);call p;end.图4 实验结果图五、实验小结(心得体会)刚开始的时候运行中报错,原因是函数的调用顺序出现错误,后经调试改正了。
通过本实验的完成,更了解了此法分析的基本任务是从字符串表示的原程序中识别出具有独立意义的单词符号,其基本意思是根据少苗到单词符号的第一个字符的种类,拼出相应的单词符号。
附录:源代码#include<stdio.h>#include"string.h"#define al 10 /*符号的最大长度*/#define norw 13 /*关键字个数*/#define namx 14 /*数字允许的最长位数*/FILE *fin;FILE *fout;char fname[al],fwname[al],a[al+1]/*a[50]*/,id[al+1],sym[20];static char sword[11]={'+','-','*','/','(',')','=',',','.','#',';'};static charssym[11][al]={"plus","minus","times","slash","lparen","rparen","eql","comma","period","neq", "semicolon"};static charword[13][al]={"begin","call","const","do","end","if","odd","procedure","read","then","var"," while","write"};//保留关键字static charwsym[13][al]={"beginsym","callsym","constsym","dosym","endsym","ifsym","oddsym","procsym","r eadsym","thensym","varsym","whilesym","writesym"};//关键字类型int cc,ll,cx,linecount,num;char line[81];char ch;void main(){int getsym();printf("**********编译原理实验PL/0语言词法分析**********\n");printf("请输入进行词法分析的文件名:");scanf("%s",fname);fin=fopen(fname,"r");printf("请输入分析结果保存的文件名:");scanf("%s",fwname);fout=fopen(fwname,"w");linecount=0;//记录文件的行数cc=ll=0;ch=' ';if(fin){printf("\n-----开始词法分析-----\n");fprintf(fout,"-----开始词法分析-----\n");printf("单词自身的值单词种别\n");fprintf(fout,"单词自身的值单词种别\n");while( getsym()!=-1 ){printf("%-20s",a);fprintf(fout,"%-20s",a);printf("%s",sym);//输出单词种别fprintf(fout,"%s",sym);printf("\n");fprintf(fout,"\n");}printf("%-20s",a);fprintf(fout,"%-20s",a);printf("%s",sym);//输出单词种别fprintf(fout,"%s",sym);printf("\n程序分析完毕");fprintf(fout,"\n程序分析完毕");}else{printf("你输入的文件不存在");fprintf(fout,"你输入的文件不存在");}}void error(int rowcount,int wordcount){printf("!第%d行第%d个位置数字越界\n",rowcount,wordcount);fprintf(fout,"!第%d行第%d个位置数字越界\n",rowcount,wordcount); }int getch(){if(cc==ll){//缓冲是否被读取完毕if(feof(fin)){return -1;}ll=0;cc=0;ch=' ';while(ch!=10){if(EOF==fscanf(fin,"%c",&ch)){line[ll]=0;break;}line[ll]=ch;ll++;}linecount++;printf("开始分析程序的第%d行\n",linecount);fprintf(fout,"开始分析程序的第%d行\n",linecount);}ch=line[cc];cc++;return 0;}int getsym(){int i,j,k;while(ch==' ' || ch==10 || ch==9 )/*判断字符是否为空,空跳过取下一个字符*/ {if(-1==getch()){return -1;}}if(ch>='a' && ch<='z'){//如果是字符或以字符开头int b=0;k=0;do{if(k<al){a[k]=ch;k++;}if(-1==getch()){a[k]=0;b=1;break;}}while(ch>='a' && ch<='z' || ch>='0' && ch<='9');a[k]=0;strcpy(id,a);i=0;j=norw-1;do{k=(i+j)/2;if(strcmp(id,word[k])<=0){j=k-1;}if(strcmp(id,word[k])>=0){i=k+1;}}while(i<=j);if(i-1>j){strcpy(sym,wsym[k]);}else{strcpy(sym,"ident");}if(b==1) return -1;}else{if(ch>='0' && ch<='9'){//如果非字符开头k=0;num=0;strcpy(sym,"number");do{a[k]=ch;num=10*num+ch-'0';//转换为对应的数字k++;if(-1==getch()){a[k]=0;return -1;}}while(ch>='0' && ch<='9');a[k]=0;k--;if(k>namx){error(linecount,cc);//错误处理,数字越界}}else{//如果是计算、比较符号a[0]=ch;if(ch==':'){if(-1==getch()){a[1]=0;return -1;};if(ch=='='){strcpy(sym,"becomes");a[1]=ch;a[2]=0;if(-1==getch()) return -1;}else{a[1]=0;strcpy(sym,"nul");//不可识别符号}}else{if(ch=='<'){if(-1==getch()) {a[1]=0;return -1;};if(ch=='='){a[1]=ch;a[2]=0;strcpy(sym,"leq");//小于等于if(-1==getch()) return -1;}else{a[1]=0;strcpy(sym,"lss");//小于}}else{if(ch=='>'){if(-1==getch()) {a[1]=0;return -1;};if(ch=='='){a[1]=ch;a[2]=0;strcpy(sym,"geq");if(-1==getch()) return -1;}else{a[1]=0;strcpy(sym,"gtr");}}else{//单字符符号处理i=0;a[1]=0;while(i<11 && ch!=sword[i]){i++;}if(i<11){strcpy(sym,ssym[i]);if( strcmp(sym,"period")!=0 ){if(-1==getch()) return -1;}else{return -1;}}else{printf("不可识别的字符\n");}}}//非字符开头处理结束}}}return 0;}。