山东理工大学编译原理词法分析实验报告
编译原理词法分析实验报告

编译原理词法分析实验报告实验名称:词法分析器的设计与实现一、实验目的: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对象。
五、实验总结:通过本次实验,我熟悉了编译原理中词法分析的基本概念和原理,并掌握了正则表达式的使用方法。
我成功完成了一个简单的词法分析器的设计与实现,实现了源代码中每个词法单元的识别与输出。
这次实验对我深化了对编译原理中词法分析的理解,并提高了我的编程能力。
编译原理词法分析实验报告

编译原理词法分析实验报告词法分析实习报告实习题目设计一个表达式的文法①表达式中的运算按运算符优先级由高到低依次有:+、-、*、/、↑其中+、-是左结合,*、/、↑右结合。
②表达式中的运算对象可以为标识符、无正负号常量。
设计的文法G[<表达式>]=(VN,VT,P,<表达式>)其中,VN={<表达式>,<无正负号常量>,<标志符>,<数字>,<字母>} VT={ a…z,A…Z,0…9}P={<表达式>→DE↑<表达式>∣DE;DE→ME/DE∣ME;ME→SE*ME∣SE;SE→SE-AE∣AE;AE→AE +<表达式>∣<表达式>∣<标识符>∣<无正负号常量>;〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉;〈无正负号常量〉→〈数字〉|〈无正负号常量〉〈数字〉;〈字母〉→a|b|…|x|y|z|A|B|…|X|Y|Z;〈数字〉→1│2│3│4│5│6│7│8│9│0}词法分析程序设计思路词法分析就是逐个读入源程序字符并按照构词规则切分成一系列单词.单词是语言中具有独立意义的最小单位,根据设计的文法可以判断出表达式中的单词种类有标识符,运算符,常量。
字母或数字识别各类单词符号的状态转换图所用数据结构FILE *fp;//用于存放原表达式文件FILE *outp;//用于存放单词输出结果char ch;//用于存储当前读取的字符char *operatornum[5]={"+","-","*","/","|"};//用于存放运算符源码#include#include#include#include#include#include#includeFILE *fp;//用于存放原表达式文件FILE *outp;//用于存放单词输出结果char ch;//用于存储当前读取的字符char *operatornum[5]={"+","-","*","/","|"};//用于存放运算符/////////////////////////////////////////////////////////////////// /////////////////////// bool search(char searchstr[])//匹配运算符{int i;for(i=0;i<=4;i++)if(strcmp(operatornum[i],searchstr)==0)return(true);return(false);}/////////////////////////////////////////////////////////////////// //////////////////////// char letterprocess (char ch)//字母处理函数{int i=-1;char letter[20];while (isalnum(ch)!=0){letter[++i]=ch;ch=fgetc(fp);}letter[i+1]='\0';printf("<标示符,%s>\n",letter);fputs("<标示符,",outp);fputs(">\n",outp);return(ch);}/////////////////////////////////////////////////////////////////// //////////////////////// char numberprocess(char ch)//数字处理程序{int i=-1;char num[20];while (isdigit(ch)!=0)//如果为数字{num[++i]=ch;ch=fgetc(fp);}if(isalpha(ch)!=0)//如果为字母{while(isspace(ch)==0)//如果为空格{num[++i]=ch;ch=fgetc(fp);}num[i+1]='\0';printf("错误!非法标识符:%s\n",num);return(ch);}num[i+1]='\0';printf("<常数,%s>\n",num);fputs("<常数,",outp);fputs(num,outp);return(ch);}/////////////////////////////////////////////////////////////////// /////////////////////////// char otherprocess(char ch)//其它符号(运算符和非法字符)的处理{int i=-1;char other[20];if (isspace(ch)!=0){ch=fgetc(fp);return(ch);}while ((isspace(ch)==0)&&(isalnum(ch)==0)){other[++i]=ch;ch=fgetc(fp);}other[i+1]='\0';if (search(other)){ printf("<运算符,%s>\n",other);fputs("<运算符,",outp);fputs(other,outp);fputs(">\n",outp);}elseprintf("错误!非法字符:%s\n",other);return (ch);}/////////////////////////////////////////////////////////////////////////////////////////////int main (){char str,c;printf("**********************************词法分析器************************************\n");outp=fopen("二元式表.txt","w");if ((fp=fopen("源程序.txt","r"))==NULL)printf("源程序无法打开!\n");else{str =fgetc(fp);while (str!=EOF){if (isalpha(str)!=0)str=letterprocess(str);else{if (isdigit(str)!=0)str=numberprocess(str);elsestr=otherprocess(str);}};printf("词法分析结束,谢谢使用!\n");printf("点任意键退出!\n");}c=getch();}输入从存放源文件的目录下的源程序.txt 中读取表达式输出从将结果存放到源文件的目录下的二元式表.txt 中问题分析词法分析相对而言较为简单,词法分析的目的就是识别出一个个的单词符号,为进一步进行语法分析打下坚实的基础。
编译原理词法分析实验报告

编译原理词法分析实验报告一,题目编制C语言子集的词法分析程序二,实验目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三,实验要求1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。
2.程序功能输入:字符串。
输出:二元式(种别编码,单词自身)构成的序列。
举例:输入:a=$;#输出:(6,a)(12,=)FOUND ERROR(13,;)四,步骤1.定义单词表2.完善词法分析器程序(1)定义变量、函数(2)增加程序的输入、输出3.程序验证词法分析程序的功能输入:所给文法的源程序字符串。
输出:二元组(syn,token)构成的序列。
其中:typenum为单词种别码;token为单词缓冲区;五,源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define _KEY_WORD_END "waiting fou your expanding"/*定义关键字的结束标志*/ typedef struct{int typenum; /*种别码*/char *word;}WORD;char input[255]; /*源程序缓字符冲区*/char token[255]=""; /*单词缓冲区*/int p_input; /*源程序字符指针*/int p_token; /*单词缓冲区指针*/char ch;char *rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END}; WORD *scaner(); /*词法扫描函数,获得一个单词*/void main(){int over=1;int count=0;WORD *oneword = new WORD;printf("Enter Your words(end with #):");scanf("%[^#]s",input); /*输入源程序字符串到缓冲区,以#结束*/p_input=0;printf("词法分析结果是:\n\n");while (over<1000 && over!= -1){oneword=scaner();if(oneword->word=="OVER")break;else if(oneword->typenum==-3)printf(oneword->word);else if(oneword->typenum <1000)printf("(%d,%s) ",oneword->typenum ,oneword->word );over=oneword->typenum ;count++;if(count%6==0) printf("\n");//每六行输出}}char m_getch() /*从输入源读一个字符到CH中*/{ch=input[p_input];p_input=p_input+1;return ch;}void getbc() /*去掉空白字符*/{while (ch == ' '|| ch== 10){ch = input[p_input];p_input=p_input+1;}}void concat() /*拼接单词*/{token[p_token]=ch;p_token=p_token+1;token[p_token]='\0';}int letter()/*判断是否是字母*/{if(ch>='a' && ch<='z'|| ch >='A'&& ch <='Z') return 1;else return 0;}int digit()/*判断是否是数字*/{if(ch>='0'&& ch<='9')return 1;else return 0;}int reserve()/*检索关键字表格*/{int i=0;while(strcmp(rwtab[i],_KEY_WORD_END)){if(!strcmp(rwtab[i],token)){return i+1;}i=i+1;}return 6;}void retract()/*回退一个字符*/{p_input=p_input-1;}char *dtb(){return NULL;}WORD *scaner()/*词法扫描程序*/{WORD *myword =new WORD;myword->typenum=10;myword->word=" ";p_token=0;m_getch();getbc();if(letter()){while(letter()||digit()){concat();m_getch();}retract();myword->typenum=reserve();myword->word=token;return myword;}else if(digit()){while(digit()){concat();m_getch();}retract();myword->typenum =11;myword->word =token;return myword;}else switch(ch){case'=' : m_getch();if(ch=='='){myword->typenum =11;myword->word ="==";return myword;}retract();myword->typenum =12;myword->word ="=";return myword;break;case'+':myword->typenum =8;myword->word ="+";return myword;break;case'-':myword->typenum =9;myword->word ="-";return myword;break;case'*':myword->typenum =10;myword->word ="*";return myword;break;case'/':myword->typenum =16;myword->word ="/";return myword;break;case'(':myword->typenum =27;myword->word ="(";return myword;break;case')':myword->typenum =28;myword->word =")";return myword;break;case'[':myword->typenum =30;myword->word ="[";return myword;break;case']':myword->typenum =31;myword->word ="]";return myword;break;case'{':myword->typenum =32;myword->word ="{";return myword;break;case'}':myword->typenum =33;myword->word ="}";return myword;break;case',':myword->typenum =34;myword->word =",";return myword;break;case':':if(input[p_input]=='='){myword->typenum =18;myword->word =":=";return myword;}elsemyword->typenum =17;myword->word =":";return myword;break;case';':myword->typenum =13;myword->word =";";return myword;break;case'>':m_getch();if(ch=='='){myword->typenum =24;myword->word =">=";return myword;}retract();myword->typenum =23;myword->word =">";return myword;break;case'<':m_getch();if(ch=='='){myword->typenum =11;myword->word ="<=";return myword;}retract();myword->typenum =20;myword->word ="<";return myword;break;case'!':m_getch();if(ch=='='){myword->typenum =40;myword->word ="!=";return myword;}retract();myword->typenum =-1;myword->word ="ERROR";return myword;break;case'\0':myword->typenum=100;myword->word="OVER";return myword;break;case'#':myword->typenum=-1;myword->word="FOUND ERROR";return myword;break;default:myword->typenum=-3 ;myword->word="FOUND ERROR";return myword;}}六,结果验证a)给定源程序a=s;#输出结果b)给定源程序x<=s;#输出结果。
编译原理实验词法分析实验报告

编译原理实验词法分析实验报告一、实验目的词法分析是编译过程的第一个阶段,其主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词符号。
本次实验的目的在于通过实践,深入理解词法分析的原理和方法,掌握如何使用程序设计语言实现词法分析器,提高对编译原理的综合应用能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____。
三、实验原理词法分析的基本原理是根据编程语言的词法规则,将输入的字符流转换为单词符号序列。
单词符号通常包括关键字、标识符、常量、运算符和界符等。
词法分析器的实现方法有多种,常见的有状态转换图法和正则表达式法。
在本次实验中,我们采用了状态转换图法。
状态转换图是一种有向图,其中节点表示状态,有向边表示在当前状态下输入字符的可能转移。
通过定义不同的状态和转移规则,可以实现对各种单词符号的识别。
四、实验步骤1、定义单词符号的类别和编码首先,确定实验中要识别的单词符号种类,如关键字(if、else、while 等)、标识符、整数常量、浮点数常量、运算符(+、、、/等)和界符(括号、逗号等)。
为每个单词符号类别分配一个唯一的编码,以便后续处理。
2、设计状态转换图根据单词符号的词法规则,绘制状态转换图。
例如,对于标识符的识别,起始状态为“起始状态”,当输入为字母时进入“标识符中间状态”,在“标识符中间状态”中,若输入为字母或数字则继续保持该状态,直到遇到非字母数字字符时结束识别,确定为一个标识符。
3、编写词法分析程序根据状态转换图,使用所选编程语言实现词法分析器。
在程序中,通过不断读取输入字符,根据当前状态进行转移,并在适当的时候输出识别到的单词符号。
4、测试词法分析程序准备一组包含各种单词符号的测试用例。
将测试用例输入到词法分析程序中,检查输出的单词符号是否正确。
五、实验代码以下是本次实验中实现词法分析器的核心代码部分:```include <stdioh>include <ctypeh>//单词符号类别定义typedef enum {KEYWORD,IDENTIFIER,INTEGER_CONSTANT,FLOAT_CONSTANT,OPERATOR,DELIMITER} TokenType;//关键字列表char keywords ={"if","else","while","for","int","float","void"};//状态定义typedef enum {START,IN_IDENTIFIER,IN_INTEGER,IN_FLOAT,IN_OPERATOR} State;//词法分析函数TokenType getToken(char token, int tokenLength) {State state = START;int i = 0;while (1) {char c = getchar();switch (state) {case START:if (isalpha(c)){state = IN_IDENTIFIER;tokeni++= c;} else if (isdigit(c)){state = IN_INTEGER;tokeni++= c;} else if (c =='+'|| c ==''|| c ==''|| c =='/'|| c =='('|| c ==')'|| c ==';'|| c ==','){state = IN_OPERATOR;tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else if (c == EOF) {tokeni ='\0';tokenLength = i;return -1;} else {tokeni ='\0';tokenLength = i;return -2;}break;case IN_IDENTIFIER:if (isalpha(c) || isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;//检查是否为关键字for (int j = 0; j < sizeof(keywords) / sizeof(keywords0); j++){if (strcmp(token, keywordsj) == 0) {return KEYWORD;}}return IDENTIFIER;}break;case IN_INTEGER:if (isdigit(c)){tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return INTEGER_CONSTANT;}break;case IN_FLOAT:if (isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return FLOAT_CONSTANT;}break;case IN_OPERATOR: tokeni ='\0';tokenLength = i;return OPERATOR; break;}}}int main(){char token100;int tokenLength;TokenType tokenType;while ((tokenType = getToken(token, &tokenLength))!=-1) {switch (tokenType) {case KEYWORD:printf("Keyword: %s\n", token);break;case IDENTIFIER:printf("Identifier: %s\n", token);break;case INTEGER_CONSTANT:printf("Integer Constant: %s\n", token);break;case FLOAT_CONSTANT:printf("Float Constant: %s\n", token);break;case OPERATOR:printf("Operator: %s\n", token);break;case DELIMITER:printf("Delimiter: %s\n", token);break;}}return 0;}```六、实验结果对准备的测试用例进行输入,得到的词法分析结果如下:测试用例 1:```int main(){int num = 10;float pi = 314;if (num > 5) {printf("Hello, World!\n");}}```词法分析结果:```Keyword: int Identifier: main Delimiter: (Delimiter: ){Identifier: num Operator: =Integer Constant: 10;Identifier: float Identifier: pi Operator: =Float Constant: 314;Keyword: ifDelimiter: (Identifier: numOperator: >Integer Constant: 5){Identifier: printfDelimiter: (String: "Hello, World!\n" Delimiter: );}```测试用例 2:```for (int i = 0; i < 10; i++){double result = i 25;```词法分析结果:```Keyword: for Delimiter: (Keyword: int Identifier: i Operator: =Integer Constant: 0;Identifier: i Operator: <Integer Constant: 10;Identifier: i Operator: ++)Identifier: doubleIdentifier: resultOperator: =Identifier: iOperator:Float Constant: 25;}```通过对多个测试用例的分析,词法分析器能够正确识别出各种单词符号,实验结果符合预期。
编译原理实验报告

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

编译原理词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求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 各种单词符号对应的种别码:2.3 词法分析程序的功能:输入:所给文法的源程序字符串。
输出:二元组(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)……三、词法分析程序的C语言程序源代码:#include <stdio.h>#include <string.h>char prog[80],token[8],ch;int syn,p,m,n,sum;char *rwtab[6]={"begin","if","then","while","do","end"};scaner();void scanner_example (FILE *fp);main(){FILE *fp;fp=fopen("D:\\1.txt","r");//打开文件scanner_example (fp);scaner();}void scanner_example (FILE *fp){do{ch=fgetc (fp);prog[p++]=ch;}while (ch!='#');p=0;do{scaner();switch(syn){case 11:printf("( %-10d%5d )\n",sum,syn);break;case -1:printf("you have input a wrong string\n");default: printf("( %-10s%5d )\n",token,syn);break;}}while(syn!=0);}scaner(){ sum=0;for(m=0;m<8;m++)token[m++]=NULL;ch=prog[p++];m=0;while((ch==' ')||(ch=='\n'))ch=prog[p++];if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))){ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch;ch=prog[p++];}p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){ syn=n+1;break;}}else if((ch>='0')&&(ch<='9')){ while((ch>='0')&&(ch<='9')){ sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;}else switch(ch){ case '<':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=22;token[m++]=ch;}else{ syn=20;p--;}break;case '>':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=24;token[m++]=ch;}else{ syn=23;p--;}break;case '+': token[m++]=ch;ch=prog[p++];if(ch=='+'){ syn=17;token[m++]=ch;}else{ syn=13;p--;}break;case '-':token[m++]=ch;ch=prog[p++];if(ch=='-'){ syn=29;token[m++]=ch;}else{ syn=14;p--;}break;case '!':ch=prog[p++];if(ch=='='){ syn=21;token[m++]=ch;}else{ syn=31;p--;}break;case '=':token[m++]=ch;ch=prog[p++];if(ch=='='){ syn=25;token[m++]=ch;}else{ syn=18;p--;}break;case '*': syn=15;token[m++]=ch;break;case '/': syn=16;token[m++]=ch;break;case '(': syn=27;token[m++]=ch;break;case ')': syn=28;token[m++]=ch;break;case '{': syn=5;token[m++]=ch;break;case '}': syn=6;token[m++]=ch;break;case ';': syn=26;token[m++]=ch;break;case '\"': syn=30;token[m++]=ch;break;case '#': syn=0;token[m++]=ch;break;case ':':syn=17;token[m++]=ch;break;default: syn=-1;break;}token[m++]='\0';}四、结果分析:输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图所示:五、总结:词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
2021年编译原理实验报告词法分析程序的设计

试验2 词法分析程序设计一、试验目掌握计算机语言词法分析程序开发方法。
二、试验内容编制一个能够分析三种整数、标识符、关键运算符和关键关键字词法分析程序。
三、试验要求1、依据以下正规式, 编制正规文法, 画出状态图;标识符<字母>(<字母>|<数字字符>)*十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+ - * / > < = ( ) ;关键字if then else while do2、依据状态图, 设计词法分析函数int scan( ), 完成以下功效:1)从文本文件中读入测试源代码, 依据状态转换图, 分析出一个单词,2)以二元式形式输出单词<单词种类, 单词属性>其中单词种类用整数表示:0: 标识符1: 十进制整数2: 八进制整数3: 十六进制整数运算符和界符, 关键字采取一字一符, 不编码其中单词属性表示以下:标识符, 整数因为采取一类一符, 属性用单词表示运算符和界符, 关键字采取一字一符, 属性为空3、编写测试程序, 反复调用函数scan( ), 输出单词种别和属性。
四、试验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、试验步骤1、依据正规式, 画出状态转换图;2、依据状态图, 设计词法分析算法;观察状态图, 其中状态2、4、7、10(右上角打了星号)需要回调一个字符。
申明部分变量和函数:ch: 字符变量, 存放最新读进源程序字符。
strToken: 字符串变量, 存放组成单词符号字符串。
编译原理—pl0实验报告

PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。
PL/0语言文法的EBNF表示EBNF表示的符号说明。
〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。
∷= :该符号的左部由右部定义,可读作'定义为'。
| :表示'或',为左部可由多个右部定义。
{ } :花括号表示其内的语法成分可以重复。
在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。
表示*重复3-8次。
如:{*}表示*重复任意次,{*}38[ ] :方括号表示其内的成分为任选项。
( ) :表示圆括号内的成分优先。
例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉 {,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}。
编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的一门重要课程,通过实验,旨在加深对编译原理相关理论知识的理解,提高实践动手能力和问题解决能力。
具体目标包括:1、熟悉编译程序的基本结构和工作流程。
2、掌握词法分析、语法分析、语义分析及中间代码生成等主要阶段的实现方法。
3、培养运用编程语言实现编译算法的能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____,操作系统为_____。
三、实验内容(一)词法分析词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个单词符号。
使用正则表达式和有限自动机的理论,设计并实现了词法分析器。
首先,定义了单词的类别,如标识符、关键字、运算符、常量等。
然后,根据不同单词类别的特征,编写了相应的正则表达式模式。
在实现过程中,通过对输入的源程序进行逐字符扫描,利用正则表达式匹配来识别单词,并将其分类存储。
(二)语法分析语法分析是编译过程的核心部分,其目的是确定输入的单词序列是否符合给定的语法规则。
采用了自顶向下的递归下降分析法和自底向上的算符优先分析法。
对于递归下降分析法,根据语法规则编写了相应的递归函数。
每个函数处理一种语法结构,通过递归调用实现对整个语法的分析。
算符优先分析法则通过定义算符的优先级和结合性,构建算符优先关系表,然后依据表进行语法分析。
(三)语义分析语义分析阶段主要检查语法正确的句子是否具有实际的意义,并进行类型检查、语义计算等操作。
在实现中,通过构建符号表来记录变量的信息,包括名称、类型、作用域等。
同时,在语法分析的过程中,根据语义规则进行相应的检查和计算。
(四)中间代码生成中间代码生成是将源程序转换为一种便于优化和目标代码生成的中间表示形式。
选择了三地址码作为中间代码。
在生成中间代码时,根据语法分析和语义分析的结果,按照一定的规则将源程序转换为三地址码的形式。
四、实验步骤1、需求分析仔细研究实验要求,明确各个阶段的任务和目标,确定所需的数据结构和算法。
1.词法分析实验报告(实验一)

编译原理词法分析实验报告一、实验内容二、实验目的三、实验预期四、程序规定五、实验原理六、测试用例七、输出结果八、实验心得一、实验内容:词法分析:1、识别简单语言的单词符号;2、识别关键字、标识符、数字、运算符等。
并扩展浮点识别功能。
二、实验目的调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。
三、实验预期结果:经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。
四、程序规定:1、关键字:"function","if","then","while","do","endfunc";2、算术运算符:”+”,”-”,”*”,”/”,”=”;3、关系运算符:"<" ">" "<=" ">=" "==" "!=";4、界符:"(" ")" ";" "#";5、标识符规定以字母开头,字母均为小写;6、空格和换行符跳过;7、单词对应编码:九、实验原理:输入串--------------------〉词法分析程序————————〉单词符号串输入:字符串以#结束。
输出:单词的二元组(syn,token/sum)程序流程图状态转换图六、程序代码: #include<stdio.h> #include<string.h> char prog[80],token[8]; char ch;int syn,p,m,n,sum;char * rwtab[6]={"function","if","then","while","do","endfunc"}; void scaner(); void main() { p=0;printf("\n please input string:\n");do开始{scanf("%c",&ch);prog[++p]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case 11:printf("\n(%d,%d)",syn,sum);break;case - 1:printf("\nerror");break;default:printf("\n(%d,%s)",syn,token);}}while(syn!=0);}///// main 函数结束void scaner(){for(n=0;n<8;n++)token[n]=NULL;////清空 token数组ch=prog[++p];while(ch=='\n' || ch==' ')ch=prog[++p];if(ch>='a'&&ch<='z'){m=0;while(ch>='a'&&ch<='z'){token[m++]=ch;ch=prog[++p];}token[m]='\0';ch=prog[--p];syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif(ch>='0'&&ch<='9'){sum=0;while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=prog[++p];}ch=prog[--p];syn=11;}elseswitch(ch){case '<':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=21;token[m+1]=ch;}else{syn=20;ch=prog[--p];}break;case '>':m=0;token[m++]=ch; ch=prog[++p];if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case '=':m=0;token[m++]=ch; ch=prog[++p];if(ch=='='){syn=25;token[m++]=ch;}else{syn=18;ch=prog[--p];}break;case '!':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m++]=ch;}elsesyn=-1;break;case '+':syn=13;token[0]=ch;break;case '-':syn=14;token[0]=ch;break;case '*':syn=15;token[0]=ch;break;case '/':syn=16;token[0]=ch;break;case ';':syn=26;token[0]=ch;break;case '(':syn=27;token[0]=ch;break;case ')':syn=28;token[0]=ch;break;case '#':syn=0;token[0]=ch;break;default:syn=-1;}}七、测试用例:九、实验心得通过编译原理实验一词法分析实验,使得自己对词法分析的流程有了更深刻的了解,虽然问题多多,但是还是学到了不少东西。
词法分析实验报告心得(3篇)

第1篇一、实验背景词法分析是编译原理中的一项基本任务,它将源程序中的字符序列转换成一系列具有独立意义的记号(Token)。
本次实验旨在通过词法分析实验,加深对词法分析过程的理解,掌握词法分析器的实现方法,并提高编程能力。
二、实验目的1. 理解词法分析的基本概念和过程。
2. 掌握词法分析器的实现方法。
3. 提高编程能力,为后续编译原理的学习打下基础。
三、实验内容本次实验采用Java语言编写词法分析器,实现了对C语言源程序的词法分析功能。
具体实验内容包括:1. 定义词法分析器类,包含状态转移表、符号表等数据结构。
2. 设计状态转移函数,实现字符序列到Token的转换。
3. 实现词法分析器的入口函数,接收源程序字符串,输出Token序列。
四、实验步骤1. 创建词法分析器类,定义状态转移表、符号表等数据结构。
2. 设计状态转移函数,根据输入字符和当前状态,输出下一个状态和对应的Token。
3. 实现词法分析器的入口函数,接收源程序字符串,初始化状态和位置指针,遍历源程序字符序列。
4. 在遍历过程中,根据状态转移函数输出Token,并更新状态和位置指针。
5. 当遇到输入字符串结束时,输出剩余的Token,并结束词法分析过程。
五、实验心得1. 词法分析是编译过程中的第一步,它将源程序中的字符序列转换成具有独立意义的Token,为后续的语法分析和语义分析提供基础。
2. 在实现词法分析器时,需要仔细分析源程序中的字符序列,确定状态转移表和符号表的内容。
这有助于提高词法分析器的准确性和效率。
3. 在编写状态转移函数时,要考虑各种可能的输入情况,确保能够正确处理各种字符序列。
同时,要注意状态转移函数的健壮性,避免出现错误。
4. 在实现词法分析器时,需要关注数据结构的组织方式。
合理的数据结构可以提高程序的可读性和可维护性。
5. 通过本次实验,我深刻体会到编程的乐趣和挑战。
在实现词法分析器过程中,我不断学习新的知识,提高了解决问题的能力。
编译原理词法分析器实验报告

编译原理词法分析器实验报告1. 引言编译原理是计算机科学中的重要概念,它涉及将高级语言程序转换为计算机可执行的低级指令。
词法分析是编译过程中的第一个阶段,它负责将源代码分解为词法单元,为后续的语法分析做准备。
本实验旨在设计和实现一个基本的词法分析器,以了解词法分析的原理和实际应用。
2. 实验目标本实验的主要目标是实现一个基本的词法分析器,能够识别并提取源代码中的各种词法单元。
具体而言,我们将设计一个针对某种编程语言的词法分析器,能够识别关键字、标识符、算术运算符、括号、常量等。
3. 实验环境为了完成本实验,我们需要使用以下工具和环境:•一种编程语言,例如Python、Java或C++•一个文本编辑器,例如Visual Studio Code或Sublime Text•一个命令行终端4. 实验步骤4.1 定义词法规则首先,我们需要定义词法分析器的词法规则。
这些规则描述了编程语言中各种词法单元的模式。
例如,关键字可以被定义为由特定字符组成的字符串,标识符可以被定义为以字母开头并由字母和数字组成的字符串。
4.2 实现词法分析器接下来,我们将根据定义的词法规则,使用编程语言实现一个词法分析器。
在实现过程中,我们可以使用正则表达式来匹配和提取各种词法单元。
4.3 编写测试用例完成词法分析器的实现后,我们需要编写一些测试用例来验证其正确性。
测试用例应该包含各种可能的输入情况,以确保词法分析器能够正确地识别和提取词法单元。
4.4 运行测试用例最后,我们将使用编写的测试用例来运行词法分析器,并检查输出是否符合预期。
如果测试通过,说明词法分析器能够正常工作;否则,我们需要检查代码并进行调试。
5. 实验结果经过实验,我们成功地设计并实现了一个基本的词法分析器。
该词法分析器能够按照预定义的词法规则,正确地识别和提取源代码中的各种词法单元。
在运行测试用例时,词法分析器能够产生符合预期的输出,表明其具有良好的准确性和可靠性。
编译原理实验词法分析实验报告

编译原理实验词法分析实验报告一、实验目的词法分析是编译过程中的第一个阶段,其主要任务是从输入的源程序中识别出具有独立意义的单词符号,并将其转换为内部编码形式。
本次实验的目的是通过设计和实现一个简单的词法分析程序,深入理解词法分析的基本原理和方法,提高对编程语言语法结构的认识和编程能力。
二、实验原理词法分析的基本原理是根据编程语言的词法规则,使用有限自动机或正则表达式等技术来识别单词符号。
在本次实验中,我们采用了状态转换图的方法来设计词法分析器。
状态转换图是一种用于描述有限自动机的图形表示方法,它由状态节点和有向边组成。
每个状态节点表示自动机的一个状态,有向边表示状态之间的转换条件。
当输入字符与当前状态的转换条件匹配时,自动机将从当前状态转换到下一个状态。
当到达一个终态时,表示识别出了一个单词符号。
三、实验环境本次实验使用了 Python 编程语言,并在 PyCharm 集成开发环境中进行开发和调试。
四、实验内容1、定义单词符号的种类和编码关键字:如`if`、`else`、`while` 等标识符:由字母、数字和下划线组成,且以字母或下划线开头常数:包括整数和浮点数运算符:如`+`、``、``、`/`等分隔符:如`(){},;`等2、设计状态转换图根据单词符号的定义,设计了相应的状态转换图,用于识别不同类型的单词符号。
例如,对于标识符的识别,从起始状态开始,当输入字符为字母或下划线时,进入标识符状态,继续输入字母、数字或下划线,直到遇到非标识符字符为止,此时到达终态,识别出一个标识符。
3、实现词法分析程序使用 Python 语言实现了基于状态转换图的词法分析程序。
程序首先读取输入的源程序文本,然后逐个字符进行处理,根据当前状态和输入字符进行状态转换,当到达终态时,输出识别出的单词符号及其编码。
4、进行测试编写了一些测试用例,包括包含各种单词符号的源程序代码。
运行词法分析程序对测试用例进行分析,检查输出结果是否正确。
编译原理词法分析与语法分析实验报告

实验三词法分析与语法分析程序设计实验日期: 2011 年11 月11日评分批阅教师签字一、实验目的基本掌握计算机语言的词法分析程序和语法分析程序的设计方法二、实验内容实验要求:1.根据以下的正规式,画出状态图;标识符:<字母>(<字母>|<数字字符>)*关键字:if then else while do十进制整数:0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*运算符和分隔符:+ - * / > < = ( ) ;2.根据状态图,设计词法分析函数int scan( ),从键盘读入数据,分析出一个单词。
3.对于只含有+、*运算的算术表达式的如下文法,编写相应的语法分析程序,要求用LL(1)分析表实现,并以id+id*id为例进行测试:E —>TE′E′—>+TE′|εT —>FT′T′—>*FT′|εF —>(E)| id实验步骤1 根据状态图,设计词法分析算法2 采用C++语言,实现该算法3 调试程序:输入一组单词,检查输出结果。
4 编制给定文法的非递归的预测分析程序,并加以测试。
三、实验环境计算机、Windows 操作系统、V isual C++ 程序集成环境。
四、实验原理(或程序框图)及步骤LL(1)中的第一个L表示从左到右扫描输入,第二个L表示产生最右推导,而‘1’则表示在每一步中只需要向前看一个输入符号来决定语法分析动作。
构造一个预测分析表如下:输入:文法G输出:预测分析表M方法:对于文法G的每个产生式A→α,进行如下处理:1):对于FIRST(α)中的每个终结符a,将A→α加入到M[A, α]中。
2):如果ε在FIRST(α)中,那么对于FOLLOW(A)中的每个终结符b,将A→α加入到M[A, α]中。
如果ε在FIRST(α)中,且$在FOLLOW(A)中,也将A→α加入到M[A, $]中。
完成上面操作之后,如果M[A, α]中没有产生式,那么将M[A, α]设置为error。
编译原理教程实验报告

一、实验目的本次实验旨在使学生通过编译原理的学习,了解编译程序的设计原理及实现技术,掌握编译程序的各个阶段,并能将所学知识应用于实际编程中。
二、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成三、实验步骤1. 词法分析(1)设计词法分析器,识别输入源代码中的各种词法单元;(2)使用C语言实现词法分析器,并进行测试。
2. 语法分析(1)根据文法规则设计语法分析器,识别输入源代码的语法结构;(2)使用C语言实现语法分析器,并进行测试。
3. 语义分析(1)设计语义分析器,检查语法分析后的语法树,确保语义正确;(2)使用C语言实现语义分析器,并进行测试。
4. 中间代码生成(1)设计中间代码生成器,将语义分析后的语法树转换为中间代码;(2)使用C语言实现中间代码生成器,并进行测试。
5. 代码优化(1)设计代码优化器,对中间代码进行优化,提高程序性能;(2)使用C语言实现代码优化器,并进行测试。
6. 目标代码生成(1)设计目标代码生成器,将优化后的中间代码转换为特定目标机的汇编语言;(2)使用C语言实现目标代码生成器,并进行测试。
四、实验结果与分析1. 词法分析实验结果:成功识别输入源代码中的各种词法单元,包括标识符、关键字、运算符、常量等。
2. 语法分析实验结果:成功识别输入源代码的语法结构,包括表达式、语句、程序等。
3. 语义分析实验结果:成功检查语法分析后的语法树,确保语义正确。
4. 中间代码生成实验结果:成功将语义分析后的语法树转换为中间代码,为后续优化和目标代码生成提供基础。
5. 代码优化实验结果:成功对中间代码进行优化,提高程序性能。
6. 目标代码生成实验结果:成功将优化后的中间代码转换为特定目标机的汇编语言,为程序在目标机上运行做准备。
五、实验心得1. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。
编译原理之词法分析实验

词法分析实验——编译原理实验报告实验任务:1.组织源程序的输入2.拼出单词并转换成机内表示形式,形成单词序列,符号表文件3.删除空格4.发现并定位词法错误实验要求:1.能对任何C语言源程序进行分析2.能检查出某些词法错误词法分析程序应给出错误信息,如非法字符,以数字开头的字母串以及标识符长度溢出。
数据结构:1.在程序中有一"源程序.txt"文件,在其中输入程序2.char*keyWords[13]={"program","var","procedure","begin","end","if","then","else","while","do","call ","integer","real"}; //保留字char *operatorChs[7]={"+","-","*","/","~","∧","∨"}; //运算符char *comparison[6]={"<","<=",">",">=","=","<>"}; //比较符char *interpunction[7]={":=",";",".",",","(",")",":"}; //标点符定义标识符结构体:struct Recode{char idName[8];int idAddr;}stringRecode[50];程序流程:main函数->读源代码->判断是否为字母数字或其他符号,分别执行char letterProcess(char ch) 字母处理函数,char numberProcess(char ch) ]数字处理函数,char otherProcess(char ch) 其它字符处理函数。
编译词法分析实验报告

一、实验目的1. 理解词法分析的基本概念和原理。
2. 掌握词法分析器的实现方法。
3. 熟悉C语言在词法分析中的应用。
4. 提高编程能力和问题解决能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C3. 开发环境:Visual Studio 2019三、实验内容1. 设计词法分析器,实现对源代码的词法分析。
2. 将源代码分解为单词序列。
3. 输出单词序列及对应的词法类型。
四、实验步骤1. 分析源代码中的词法单位,确定词法类型。
2. 设计词法分析器的状态转换表。
3. 编写词法分析器代码。
4. 测试词法分析器,验证其正确性。
五、实验过程1. 分析源代码中的词法单位在C语言中,词法单位包括标识符、关键字、运算符、分隔符、常量等。
本实验以C语言为例,分析源代码中的词法单位,确定词法类型。
2. 设计词法分析器的状态转换表根据词法单位,设计词法分析器的状态转换表。
状态转换表包括当前状态、输入字符、下一状态、输出词法类型和对应动作。
3. 编写词法分析器代码根据状态转换表,编写词法分析器代码。
以下为词法分析器的主要功能模块:(1)初始化:设置初始状态、词法类型和单词长度。
(2)读取字符:从源代码中读取字符,并判断字符类型。
(3)状态转换:根据状态转换表,更新当前状态、输出词法类型和单词长度。
(4)输出结果:将单词序列及对应的词法类型输出到屏幕。
4. 测试词法分析器编写测试用例,验证词法分析器的正确性。
测试用例包括以下几种情况:(1)包含各种词法单位的源代码。
(2)包含注释的源代码。
(3)包含错误标识符的源代码。
六、实验结果与分析1. 实验结果通过测试,词法分析器能够正确识别源代码中的各种词法单位,并将单词序列及对应的词法类型输出到屏幕。
以下为部分测试结果:```int a = 10; // 输出:int, 标识符if (a > 0) // 输出:if, 关键字{// 输出:{, 分隔符// ...// 输出:}, 分隔符}// 输出://, 注释开始注释内容// 输出://, 注释结束```2. 实验分析(1)实验过程中,通过对词法分析原理的学习,加深了对编译原理的理解。
编译原理熟悉实验报告

一、实验目的1. 理解编译原理的基本概念和流程;2. 掌握编译器的各个阶段及其实现方法;3. 熟悉编译器各个阶段中使用的算法和数据结构;4. 培养编程能力和问题解决能力。
二、实验内容1. 词法分析;2. 语法分析;3. 语义分析;4. 代码生成;5. 符号表;6. 中间代码生成。
三、实验步骤1. 词法分析(1)设计词法分析器:首先需要确定源程序中的词法单元,如标识符、关键字、运算符等。
然后,编写代码实现词法分析器,对源程序进行扫描,将词法单元转换成词法符号。
(2)实现词法分析器:使用C语言或Java等编程语言实现词法分析器,完成词法单元的识别和转换。
2. 语法分析(1)设计语法分析器:根据源程序的语言规范,设计语法分析器,实现语法规则的定义和匹配。
(2)实现语法分析器:使用递归下降分析法、LL(1)分析法、LR(1)分析法等实现语法分析器,对词法分析器输出的词法符号序列进行语法分析。
3. 语义分析(1)设计语义分析器:根据源程序的语言规范,设计语义分析器,实现语义规则的检查和类型检查。
(2)实现语义分析器:使用C语言或Java等编程语言实现语义分析器,完成语义规则的检查和类型检查。
4. 代码生成(1)设计代码生成器:根据源程序的语言规范,设计代码生成器,将抽象语法树转换成目标代码。
(2)实现代码生成器:使用C语言或Java等编程语言实现代码生成器,完成抽象语法树到目标代码的转换。
5. 符号表(1)设计符号表:在编译过程中,需要记录变量、函数等信息,设计符号表实现这些信息的存储和管理。
(2)实现符号表:使用C语言或Java等编程语言实现符号表,完成变量、函数等信息的存储和管理。
6. 中间代码生成(1)设计中间代码生成器:根据源程序的语言规范,设计中间代码生成器,将抽象语法树转换成中间代码。
(2)实现中间代码生成器:使用C语言或Java等编程语言实现中间代码生成器,完成抽象语法树到中间代码的转换。
四、实验结果与分析1. 词法分析器能够正确识别源程序中的词法单元,并将它们转换成词法符号。
编译原理实验报告 词法分析

编译原理实验一·词法分析一、实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。
同时增强编写和调试程序的能力。
二、实验内容及要求对某特定语言A ,构造其词法规则。
该语言的单词符号包括:保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。
功能要求如下所示:·按单词符号出现的顺序,返回二元组序列,并输出。
·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。
·如果出现词法错误,报出:错误类型,位置(行,列)。
·处理段注释(/* */),行注释(//)。
·有段注释时仍可以正确指出词法错误位置(行,列)。
三、实验过程1、词法形式化描述使用正则文法进行描述,则可以得到如下的正规式:其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。
A→(ID | NUM | RES | DEL | OPR) *ID→letter(letter | didit)*NUM→digit digit*letter→a | …| z | A | …| Zdigit→0 | …| 9RES→program | begin | end | var | int | and | or | not | if | then | else | while | doDEL→( | ) | . | ; | ,OPR→+ | * | := | > | < | = | >= | <= | <>如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。
空格由空白、制表符和换行符组成。
2、单词种别定义;3、状态转换图;语言A的词法分析的状态转换图如下所示:空格符,制表符或回车符字母或数字4、运行环境介绍;本次实验采用win-tc进行代码的编写和编译及运行程序的运行环境为windows5、关键算法的流程图及文字解释;程序中用到的函数列表:变量ch储存当前最新读进的字符的地址strToken存放当前字符串voidmain() //主函数struct binary *lexicalAnalyze(); //词法分析的主函数,返回一个二元组的指针void GetBC(); //检查ch指向的字符是否为空格、制表或回车符,如果是则调用GetChar()直至不是上述字符void GetChar(); //ch前移一个地址单元int ConCat(); //将ch指向的字符连接到strToken之后int isLetter(); //判断ch指向的字符是否字母int isDigit(); //判断ch指向的字符是否数字int insertId(); //向标识符表中插入当前strToken的字符串int insertConst(); //将strToken的常数插入常数表中int Reserved(); //检测当前strToken中的字符串是否保留字,若是,则返回编码,否则返回0int isId(); //检测当前strToken中的字符串是否在标识符表中已存在,若是,则返回其编号,否则返回0int isConst(); //检测当前strToken中的字符串是否在常数表中已存在,若是,则返回其编号,否则返回0void errProc(int errType); //出错处理过程,errType是错误类型,将错误信息加入错误表中main()函数的流程图如下:lexicalAnalyze()函数的流程图如下所示:Reserved()、isId()和isConst()函数均采用了对链表的遍历算法,errProc()函数通过识别不同的错误编号,向错误链表中添加相应的错误信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告——词法分析程序设计【实验项目】1、了解词法分析的主要任务。
2、熟悉编译程序的编制。
【实验要求】1、构造一个小语言的文法;2、设计单词的输出形式,单词的种类和值的表示方法;3、编写词法分析程序cffx.c;4、生成并输出单词符号表。
【实验内容】根据某文法,构造一个基本词法分析程序。
找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词表(内容包括单词种类和值),构造符号表(内容包括name、kind、value和address等)。
【实验步骤】1.类C语言子集的文法G[<程序>]:<程序>→<分程序><分程序>→<程序首部>{<程序体>}<程序首部>→program<标识符>:<程序体>→<语句序列><语句序列>→<语句序列>;<语句>|<语句><标识符>→<字母>|<标识符><字母>|<标识符><数字><语句>→<定义语句>|<输入语句>|<复合语句>|<输出语句><类型>→int|double|llint|lldouble<定义表>→<标识符>|<标识符>,<定义表><定义语句>→<类型><定义表><输入语句>→scanf(<类型>,<标识符>)<复合语句>→<赋值语句>|<循环语句>|<条件语句><输出语句>→printf(<类型>,<标识符>)<赋值语句>→<标识符>=<表达式><循环语句>→<for型循环语句>|<while型循环语句><for型循环语句>→for(<表达式>;<表达式>;<表达式>){<语句>|<表达式>}<while型循环语句>→while(<表达式>){<语句>|<表达式>}<条件语句>→if(<表达式>){<语句>|<表达式>}else{<语句>|<表达式>}<表达式>→<因式><运算符><因式>|<因式><运算符>;<运算符>→=|==|#|<|<=|>|>=|++|--|+|-|*|/|%<因式>→(<表达式>)|<标识符>|<数字>|<数字><数字><字母>→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z<数字>→0|1|2|3|4|5|6|7|8|92.单词分类1、keyword(关键字):program|int|double|llint|lldouble|scanf |printf|for|while|if|else2、identification(标识符):a|b|c|……3、digit(数据):0|1|2|3|4|……4、operatorsign(运算符):=|==|#|<|<=|>|>=|++|--|+|-|*|/|%5、boundarysign(界符):{}|()|:|;|,3.词法分析源程序/**********************头文件**********************/#include<stdio.h>#include<string.h>#include<conio.h>#include<ctype.h>/*********************全局变量*********************/char word[20];/*暂存单词*/char test[500],*p;int count=1;charKeyword[11][10]={"program","int","double","llint","lldouble","scanf","printf","for","while","if" ,"else"};//关键字数组char Operatorsign[14][10]={"=","==","#","<","<=",">",">=","++","--","+","-","*","/","%"};//运算符数组/*****************函数1:关键字、标识符识别****************/char alpha(){int i=0,j=0;/*j=0是标识符,j=1是关键字*/char*opp;while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/{word[i]=*p;p++;i++;}opp=word;for(i=0;i<11;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/{if(!(strcmp(opp,Keyword[i])))/*比较两个字符串*/{printf("%d Keyword%s\n",count,opp);/*识别关键字*/j=1;}}if(j==0)printf("%d Identification%s\n",count,opp);/*识别标识符*/p--;/*回退多读进的字符*/return0;}/*****************函数2:数据识别******************/char digit(){int i=0;while(isdigit(*p))/*如果是数字,返回1,否则返回0*/{word[i]=*p;i++;p++;}printf("%d Digit%s\n",count,word);p--;/*回退多读进的字符*/return0;}/*****************函数3:运算符识别******************/char operatorsign(){int i=0;char*opp;while(!isalnum(*p))/*检查是否是符号*/{if(*p=='{'||*p=='}'||*p=='('||*p==')'||*p==':'||*p==';'||*p==',')break;word[i]=*p;p++;i++;}opp=word;for(i=0;i<14;i++)/*把符号与运算符核对*/{if(!(strcmp(opp,Operatorsign[i])))/*比较两个字符串*/{printf("%d Operatorsign%s\n",count,opp);/*识别运算符*/}}p--;/*回退多读进的字符*/return0;}/*********************主函数***********************/int main(){int i,k=0;memset(test,0,500);/*把test所指内存区域的前500个字节设置成字符0*/strcpy(test,"program a:\n{\n int i=10,j=0;\n if(i>=1)\n{\n j=i+2;\n}\n else\n{\n j++;\n}\n}\n");printf("The test program is:\n");puts(test);p=test;while(*p!='\0')/*检查源程序是否结束*/{memset(word,0,20);while(*p==''||*p=='\n'||*p=='\t')p++;/*检查是否是空白字符,如果是直接跳过*/if(isalpha(*p))/*识别关键字或标识符*/{alpha();}if(isdigit(*p))/*识别整数*/{digit();}if(*p=='{'||*p=='}'||*p=='('||*p==')'||*p==':'||*p==';'||*p==',')/*识别界符*/{printf("%d Boundarysign%c\n",count,*p);}if(*p=='='||*p=='#'||*p=='<'||*p=='>'||*p=='+'||*p=='-'||*p=='*'||*p=='/'||*p=='%')/*识别运算符*/{operatorsign();}count=count+1;/*准备识别下一个单词*/p++;}getch();return0;}4.程序运行结果5.流程图6.状态转换图【实验分析】通过本次实验,我更加清晰透彻的了解词法分析程序的工作原理,也对编译原理这门课程有了进一步的理解与体会。
最重要的是,从这次实验中,我的动手实践能力得到了极大的提高,更加熟练的掌握了Microsoft Office的运用,也更加熟练了的掌握了Visio的使用方法,当时,实验也促使我进一步加深巩固了对各种编程软件的运用。