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

编译原理词法分析实验报告实验名称:词法分析器的设计与实现一、实验目的:1.熟悉编译原理中词法分析的基本概念和原理;2.掌握正则表达式的使用方法;3.实现一个简单的词法分析器。
二、实验内容:1.设计一个简单的编程语言,包含如下几种类型的词法单元:关键字、标识符、常量、运算符和界符。
2.使用正则表达式定义每种词法单元的模式。
3.设计一个词法分析器,将源代码中的每个词法单元识别出来并输出。
三、实验步骤:1. 确定编程语言的词法单元类型和正则表达式模式,定义相应的单词类型(如 TokenType)和模式(如 regex)。
2. 实现一个词法分析器的类 Lexer,包含以下方法:(1)一个构造方法,用于初始化词法分析器的输入源代码。
(2) 一个getNextToken方法,用于获取源代码中的下一个词法单元。
3. 在getNextToken方法中,使用正则表达式逐个识别源代码中的词法单元,并返回相应的Token对象。
4. 设计一个Token类,包含以下属性:词法单元类型、词法单元的值和位置信息等。
5.在主程序中使用词法分析器,将源代码中的每个词法单元识别出来并输出。
四、实验结果:1.设计一个简单的编程语言,包含如下词法单元类型(示例):(1) 关键字:if、else、while、for等;(2)标识符:变量名等;(3)常量:整数、浮点数、字符串等;(4)运算符:+、-、*、/、=等;(5)界符:(、)、{、}、;等。
2. 实现一个词法分析器,识别出源代码中的每个词法单元,并输出相应的Token对象。
五、实验总结:通过本次实验,我熟悉了编译原理中词法分析的基本概念和原理,并掌握了正则表达式的使用方法。
我成功完成了一个简单的词法分析器的设计与实现,实现了源代码中每个词法单元的识别与输出。
这次实验对我深化了对编译原理中词法分析的理解,并提高了我的编程能力。
编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
编译原理实验报告-词法分析

词法分析实验报告一、实验目的1.编制一个词法分析程序。
2.加深对词法分析原理的理解。
二、实验要求1.待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。
(2)运算符和界符: = + - * / < <= <> > >= = ; ( ) .(3)其他单词是标识符(IDENT)和整型常数(NUMBER),通过以下正规式定义:IDENT = letter (letter | digit)*NUMBER = digit digit*(4)空格有空白、制表符和换行符组成。
空格一般用来分隔IDENT、NUMBER、运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的类别值:表各种单词符号对应的类别码3.词法分析程序的功能:输入:所给文法的源程序字符串,以“.”结束。
输出:二元组(sym,token或number)构成的序列。
其中:sym为单词种别码;token为存放的单词自身字符串;number为整型常数。
例如:对源程序begin x:=9;if x<10 then x:=(x+10)*2 end.的源文件,经过词法分析后输出如下序列:(17,begin)(1,x)(16,:=)(2,9)(15,;)……4.词法分析程序的设计词法分析采用状态转换图方法:三、实验设计方法从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序示意图:⑴关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。
如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
关键字表为一个字符串数组,其描述如下:图3-11.主要技术难点a)设计各种单词符号对应的符号表b)实现输入字符数字和单词符号及其对应单词种别码的正确输出。
编译原理实验报告

编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。
词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。
二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。
2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。
词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。
3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。
测试用例应包含各种情况下的源程序代码。
4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。
重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。
三、实验结果我们设计了一个简单的词法分析器,并进行了测试。
测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。
经过测试,词法分析器能够正确处理所有的测试用例。
词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。
通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。
四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。
词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。
在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。
通过测试和修正,我掌握了调试和错误修复的技巧。
本次实验的经验对我今后的编程工作有很大帮助。
编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。
我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。
编译原理词法分析实验报告

编译原理词法分析实验报告实验一词法分析一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
二、实验内容(1)功能描述:该程序是实现一个词法分析器,词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是将单词分为五种的方法。
识别关键字:main、if、int、for、while、do、return、break、continue;单词种别码为1。
标识符:单词种别码为2。
常数:为无符号整形数;单词种别码为3。
运算符:包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。
分隔符:包括:,、;、{、}、(、);单词种别码为5。
(2)程序结构描述:输入:从控制台输入一段源程序代码,对输入的代码进行词法分析,处理:分离出关键字、标识符、数值、运算符和界符。
输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。
其中,编码是自定义的,一种类型对应一个编码。
词法分析结果显示在控制台上。
(3)程序设计思路1、定义编码表,用ArrayList集合存放单词,如:关键字、运算符、分界符。
这三种单词是固定的,标示符和数字这两种单词不存放在集合中。
编码表是固定的,只需要初始化一次就够了,所以将集合定义为static类型,使其在类加载时,进行一次初始化。
2、static char allstr[] = new char[100000];该数组用于存储用户从控制台输入的所有字符。
3、//从键盘获取一个一个的字符public char Getchar() {try {ch = (char) System.in.read();} catch (Exception e) {e.printStackTrace();}return ch;}4、用while循环遍历allstr数组中存放的字符,判断分离出关键字、标示符、数字、运算符、标示符。
编译原理实验报告++词法分析器实验报告

编译原理实验报告词法分析器制作与应用设计思想()程序主体结构部分:说明部分规则部分辅助程序部分()主体结构地说明在这里说明部分告诉我们使用地, (标识符,通常定义为字母开头地字母数字串)和(字符串常量,通常定义为双引号括起来地一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用来使用标准地头文件和前向说明( ,).这些代码应该再标记"{"和"}"之间;规则部分;可以包括任何你想用来分析地代码;我们这里包括了忽略所有注释中字符地功能,传送名称和字符串常量内容到主调函数和函数地功能.个人收集整理勿做商业用途()实现原理程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同地单词符号给出不同编码形式地编码,用以区分之.个人收集整理勿做商业用途语言地表示<常量定义>::<标识符><无符号整数>;<标识符>::<字母>{<字母><数字>};<加法运算符><乘法运算符>*<关系运算符><<>><字母>…<数字>…三:设计过程.关键字:,,,,,,,,,,,并为小写. 个人收集整理勿做商业用途."”;””;”*”;””;”“;”:”;”<“;”<“;”>“;”>“;”<>“;”“;”(“;”)”;”;”;””为运算符.个人收集整理勿做商业用途.其他标记如字符串,表示以字母开头地标识符..空格符跳过..各符号对应种别码关键字分别对应运算符分别对应,.字符串对应常量对应结束符四:举例说明目标:实现对常量地判别代码:[][][\[]({}[])({}{}[])*个人收集整理勿做商业用途{({}{}{})}{}[ \\] """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" {()("\");}个人收集整理勿做商业用途\"([])*\" {("\");}个人收集整理勿做商业用途?{}[.]{}?([][]?{})? {("\");}个人收集整理勿做商业用途""?{} {("\");} ","";""("")""{""}""[""]"">"".""!""""""""*"""""""""""""">""<"">""<""""""""^""""""""""""*"""""">> ""<<""""^""""" {("\");}个人收集整理勿做商业用途{} {("\");}{}({}) {("\");}个人收集整理勿做商业用途<>( * ){;(<){[]([]);}}(){;}五:六:数据测试七:心得体会其实匹配并不困难,主要是知识要求相对较高,只要把握住指针就好了.附源程序:<><><><>;* !*个人收集整理勿做商业用途;[] {" "};[];( []){*[] {"","","","","","",个人收集整理勿做商业用途"","","","","","",""};;;;[];* ** *(( > '') ( < '' )){(( > '') ( < '' )){[];[];};[] '\';( ; < ; )( ([]) )(){:{;;;}:{;;;}:{;;;}:{;;;}:{;;;}:{;;;} :{;;;} :{;;;} :{;;;} :{;;;} :{;;;}:{;;;}:{;;;}}( ){;}}* *(( > '') ( < '')){;(( > '' ) ( < '' )){*('');[];};;}* *(){'':{( '')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}'>':{( '>')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}'<':{( '<')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}'!':{( '!')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}'':{( '')[] ;[] '\';[];( ''){[] ;[] '\';;}( ''){[] ;[] '\';;}{;;};}'':{( '')[] ;[] '\';[];( ''){[] ;[] '\';;}( ''){[] ;[] '\';;{;;};}'*':{( '*')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}'':{( '')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}[] ; [] '\';; ;}'(':{[] ; [] '\';; ;}')':{[] ; [] '\';; ;}'[':{[] ; [] '\';; ;}']':{[] ; [] '\';; ;}'{':{[] ; [] '\';; ;}'}':{[] ; [] '\';; ;}':':{[] ;[] '\';;;}'"':{[] ;[] '\';;;}'':{( '')[] ;[] '\';[];( ''){[] ;[] '\';;}{;;};}',':{[] ;[] '\';;;}'':{[] ;[] '\';;;}'':{[] '';;;个人收集整理-ZQ}:{;;}};}(){;(" ");{();[] ;}( '');;{();( ){("()");}( ){("()");}{("()");}} ( );("");}11 / 11。
词法分析器的实验报告

词法分析器的实验报告词法分析器的实验报告引言:词法分析器是编译原理中的重要组成部分,它负责将源代码中的字符序列转换为有意义的词法单元,为后续的语法分析提供基础。
本实验旨在设计和实现一个简单的词法分析器,并对其进行测试和评估。
实验设计:1. 词法规则设计:在开始实验之前,我们首先需要设计词法规则,即定义源代码中的合法词法单元。
例如,对于一门类C的语言,我们可以定义关键字(如if、while、int等)、标识符、运算符(如+、-、*等)、分隔符(如()、{}等)等。
2. 有限自动机(DFA)的设计:基于词法规则,我们可以设计一个有限自动机,用于识别和分析源代码中的词法单元。
有限自动机是一个状态转换图,其中每个状态代表一种词法单元,而边表示输入字符的转换关系。
3. 实现代码:根据有限自动机的设计,我们可以使用编程语言(如Python、C++等)实现词法分析器的代码。
代码的主要功能包括读取源代码文件、逐个字符进行词法分析、识别和输出词法单元。
实验过程:1. 词法规则设计:我们以一门简单的算术表达式语言为例,设计了以下词法规则:- 数字:由0-9组成的整数或浮点数。
- 运算符:包括+、-、*、/等。
- 分隔符:包括括号()和逗号,。
- 标识符:以字母开头,由字母和数字组成的字符串。
2. 有限自动机(DFA)的设计:我们基于词法规则,设计了一个简单的有限自动机。
该自动机包含以下状态:- 初始状态:用于读取和识别源代码中的字符。
- 数字状态:用于识别和输出数字。
- 运算符状态:用于识别和输出运算符。
- 分隔符状态:用于识别和输出分隔符。
- 标识符状态:用于识别和输出标识符。
3. 实现代码:我们使用Python编程语言实现了词法分析器的代码。
代码主要包括以下功能:- 读取源代码文件。
- 逐个字符进行词法分析,根据有限自动机的设计进行状态转换。
- 识别和输出词法单元。
实验结果:我们对几个测试样例进行了词法分析,并对结果进行了评估。
编译原理词法分析器实验报告

一、实验目的设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的明白得。
二、实验要求一、该个词法分析器要求至少能够识别以下几类单词:(1)关键字:else if int return void while共6个,所有的关键字都是保留字,而且必需是小写;(2)标识符:识别与C语言词法规定相一致的标识符,通过以下正那么表达式概念:ID = letter (letter | digit)*;(3)常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等;(4)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */;二、分析器的输入为由上述几类单词组成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变成其对应的机内符,常数利用二进制形式,标识符利用相应的标识符表指针表示。
3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。
三、实验环境实验环境为win7系统、vs2005。
四、实验内容1、词法分析程序的功能:输入:所给文法的源程序字符串。
输出:二元组(syn,token)或(sum或fsum,对应二进制)组成的序列。
其中:syn为单词类别码;token为寄存的单词自身字符串;sum为整型常数;fsum为浮点型常数。
二、各类单词符号类别码如下表:五、要紧函数说明一、程序全局变量char inputstr[300],token[8];//别离寄存程序段、组成单词符号的字符串char ch;//输入字符int syn;//单词字符的类别码int p;//缓冲区inputstr的指针int sum;//整型常量float fsum;//浮点型常量char *rwtab[6]={"else","if","int","return","void","while"};//关键字数组二、语法分析函数void scaner()该函数完成所有的语法分析,关于输入的程序片段,第一去掉空格和换行,然后逐字符分析,找出各个单词(存入token[8]),判别它们的类型(确信syn 值,若是是整数那么是sum值,若是是浮点数那么是fsum)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告词法分析器制作与应用设计思想(1)程序主体结构部分:说明部分%%规则部分%%辅助程序部分(2)主体结构的说明在这里说明部分告诉我们使用的LETTER,DIGIT, IDENT(标识符,通常定义为字母开头的字母数字串)和STR(字符串常量,通常定义为双引号括起来的一串字符)是什么意思.这部分也可以包含一些初始化代码.例如用#include来使用标准的头文件和前向说明(forward ,references).这些代码应该再标记"%{"和"%}"之间;规则部分>可以包括任何你想用来分析的代码;我们这里包括了忽略所有注释中字符的功能,传送ID名称和字符串常量内容到主调函数和main函数的功能.(3)实现原理程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。
PL/0语言的EBNF表示<常量定义>::=<标识符>=<无符号整数>;<标识符>::=<字母>={<字母>|<数字>};<加法运算符>::=+|-<乘法运算符>::=*|/<关系运算符>::==|#|<|<=|>|>=<字母>::=a|b|…|X|Y|Z<数字>::=0|1|2|…|8|9三:设计过程1.关键字:void,main,if,then,break,int,Char,float,include,for,while,printfscanf 并为小写。
2."+”;”-”;”*”;”/”;”:=“;”:”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”为运算符。
3.其他标记如字符串,表示以字母开头的标识符。
4.空格符跳过。
5.各符号对应种别码关键字分别对应1-13运算符分别对应401-418,501-513。
字符串对应100常量对应200结束符#四:举例说明目标:实现对常量的判别代码:digit [0-9]letter [A-Za-z]other_char [!-@\[-~]id ({letter}|[_])({letter}|{digit}|[_])*string {({letter}|{digit}|{other_char})+}int_num {digit}+%%[ |\t|\n]+ "auto"|"double"|"int"|"struct"|"break"|"else"|"long"|"switch"|"case"|"enum"|"register"|"typedef"|"ch ar"|"extern"|"return"|"union"|"const"|"float"|"short"|"unsigned"|"continue"|"for"|"signed"|"void"|"d efault"|"goto"|"sizeof"|"do"|"if"|"static"|"while"|"main"{Upper(yytext,yyleng);printf("%s,NULL\n",yytext);}\"([!-~])*\" {printf("CONST_string,%s\n",yytext);}-?{int_num}[.]{int_num}?([E][+|-]?{int_num})? {printf("CONST_real,%s\n",yytext);} "0x"?{int_num} {printf("CONST_int,%s\n",yytext);} ","|";"|"("|")"|"{"|"}"|"["|"]"|"->"|"."|"!"|"~"|"++"|"--"|"*"|"&"|"sizeof"|"/"|"%"|"+"|"-"|">"|"<"|">="|" <="|"=="|"!="|"&"|"^"|"|"|"&"|"||"|"+="|"-="|"*="|"/="|"%="|">>="|"<<="|"&="|"^="|"|="|"=" {printf("%s,NULL\n",yytext);}{id} {printf("ID,%s\n",yytext);}{digit}({letter})+ {printf("error1:%s\n",yytext);}%%#include <ctype.h>Upper(char *s,int l){int i;for(i=0;i<l;i++){s[i]=toupper(s[i]);}}yywrap(){return 1;}五:DFA六:数据测试七:心得体会其实匹配并不困难,主要是C++知识要求相对较高,只要把握住指针就好了。
附源程序:#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<string.h>int i,j,k,flag,number,status;/*status which is use to judge the string is keywords or not!*/char ch;char words[10] = {" "};char program[500];int Scan(char program[]){char *keywords[13] = {"void","main","if","then","break","int", "char","float","include","for","while","printf","scanf"};number = 0;status = 0;j = 0;ch = program[i++];/* To handle the lettle space ands tab*//*handle letters*/if ((ch >= 'a') && (ch <= 'z' )){while ((ch >= 'a') && (ch <= 'z' )){words[j++]=ch;ch=program[i++];}i--;words[j++] = '\0';for (k = 0; k < 13; k++)if (strcmp (words,keywords[k]) == 0)switch(k){case 0:{flag = 1;status = 1;break;}case 1:{flag = 2;status = 1;break;}case 2:{ flag = 3; status = 1; break;}case 3:{ flag = 4; status = 1; break;}case 4:{ flag = 5; status = 1; break;}case 5:{ flag = 6; status = 1; break;} case 6:{ flag = 7; status = 1; break;} case 7:{ flag = 8; status = 1; break;} case 8:{ flag = 9; status = 1; break;} case 9:{ flag = 10; status = 1; break;} case 10:{ flag = 11; status = 1; break;}case 11:{flag = 12;status = 1;break;}case 12:{flag = 13;status = 1;break;}}if (status == 0){flag = 100;}}/*handle digits*/else if ((ch >= '0') && (ch <= '9')) {number = 0;while ((ch >= '0' ) && (ch <= '9' )) {number = number*10+(ch-'0');ch = program[i++];}flag = 200;i--;}/*opereation and edge handle*/ else switch (ch){case '=':{if (ch == '=')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 401;}else{i--;flag = 402;}break;}case'>':{if (ch == '>')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 403;}else{i--;flag = 404;}break;}case'<':{if (ch == '<')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 405;}else{i--;flag = 406;}break;}case'!':{if (ch == '!')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 407;}else{i--;flag = 408;}break;}case'+':{if (ch == '+')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 409;}else if (ch == '+'){words[j++] = ch;words[j] = '\0';flag = 410;}else{i--;flag = 411;}break;}case'-':{if (ch == '-')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 412;}else if( ch == '-'){words[j++] = ch;words[j] = '\0';flag = 413;}else{i--;flag = 414;}break;}case'*':{if (ch == '*')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 415;}else{i--;flag = 416;}break;}case'/':{if (ch == '/')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 417;}else{i--;flag = 418;}break;}case';':{words[j] = ch; words[j+1] = '\0';flag = 501; break;}case'(':{words[j] = ch; words[j+1] = '\0';flag = 502; break;}case')':{words[j] = ch; words[j+1] = '\0';flag = 503; break;}case'[':{words[j] = ch; words[j+1] = '\0';flag = 504; break;}case']':{words[j] = ch; words[j+1] = '\0';flag = 505; break;}case'{':{words[j] = ch;words[j+1] = '\0';flag = 506;break;}case'}':{words[j] = ch;words[j+1] = '\0';flag = 507;break;}case':':{words[j] = ch;words[j+1] = '\0';flag = 508;break;}case'"':{words[j] = ch;words[j+1] = '\0';flag = 509;break;}case'%':{if (ch == '%')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 510;}else{i--;flag = 511;}break;}case',':{words[j] = ch;words[j+1] = '\0';flag = 512;break;}case'#':{words[j] = ch;words[j+1] = '\0';flag = 513;break;}case'@':{words[j] = '#';flag = 0;break;}default:{flag = -1;break;}}return flag;}main(){i=0;printf("please input a program end with @"); do{ch = getchar();program[i++] = ch;}while(ch != '@');i = 0;do{flag = Scan(program);if (flag == 200){printf("(%2d,%4d)",flag,number);}else if (flag == -1){printf("(%d,error)",flag);}else{printf("(%2d,%4s)",flag,words);}}while (flag != 0);system("pause");}编译原理》实验教学大纲部门:实验中心发布人:崔诣时间:2006-7-4课程编号:27140001 大纲执笔人:马知行课程名称:编译原理大纲审批人:曹启君英文名称:Compilers Principles课程学时:54 实验学时:36实验室名称:计算机技术实验室实验课性质:非独立设课适用专业:计算机科学与技术一、本课程实验教学目的与要求通过对词法分析、语法分析和代码生成程序的设计和编制,使学生掌握编译程序的基本构造、基本原理和主要实现技巧。