文档库 最新最全的文档下载
当前位置:文档库 › pl0词法分析器(C语言版)

pl0词法分析器(C语言版)

pl0词法分析器(C语言版)
pl0词法分析器(C语言版)

#include

#include

#include

void init();

void getsym();

enum symbol

{

nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,

lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,

beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,

constsym,varsym,procsym,programsym,

};

#define norw 14

#define al 10

#define nmax 10

char word [norw][al];

char ch;

enum symbol sym;

enum symbol wsym[norw];

enum symbol ssym[256];

FILE *fin,*fout;

void main()

{

printf("please input outfile's name:\n"); //词法分析之后的结果要输出到的文件char outname[30],inname[30];

scanf("%s",outname);

if((fout=fopen(outname,"w"))==NULL)

{

printf("cannot open output file!");

exit(0);

}

printf("please input infile's name:\n"); //需要词法分析的源程序

scanf("%s",inname);

if((fin=fopen(inname,"r"))==NULL)

{

printf("cannot open file!\n");

exit(0);

}

ch=fgetc(fin);

while(ch!=EOF)

{

getsym();

}

}

//读取源文件

void getsym()

{

long m;

char id[al+1],a[al+1];

int i,k;

init();

if(ch==' '||ch==10||ch==9)

{

ch=fgetc(fin);

}

else

{

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

{

k=0;

do

{

if(k

{

a[k]=ch;

k++;

}

ch=fgetc(fin);

}while

((ch>='a'&&ch<='z'||ch>='0'&&ch<='9')||(ch>='A'&&ch<='Z'||ch>='0'&&ch<='9'));

a[k]=0;

strcpy(id,a);

for(i=0;i

{

if(strcmp(id,word[i])==0)

{

sym=wsym[i];

printf("%s %ssym\n",id,id);

fprintf(fout,"%s %ssym\n",id,id);

break;

}

else

{

if(i==(norw-1))

{

sym=ident;

printf("%s ident\n",id);

fprintf(fout,"%s ident\n",id);

}

}

}

else

{

if(ch>='0'&&ch<='9')

{

k=0;

m=0;

sym=number;

do

{

m=10*m+ch-'0';

k++;

ch=getc(fin);

}while(ch>='0'&&ch<='9');

if(k>=nmax)

{

printf(" error!数值太大!\n");

//exit(0);

}

printf("%d number\n",m);

fprintf(fout,"%d number\n",m);

}

else

{

if(ch==':')

{

ch=getc(fin);

if(ch=='=')

{

sym=becomes;

printf(":= becomes\n");

fprintf(fout,":= becomes\n");

ch=fgetc(fin);

}

else

{

sym=nul;

printf(": nul\n");

fprintf(fout,": nul\n");

}

}

{

if(ch=='<')

{

ch=fgetc(fin);

if(ch=='=')

{

sym=leq;

printf("<= lep\n");

fprintf(fout,"<= lep\n");

ch=fgetc(fin);

}

else

{

sym=lss;

printf("< lss\n");

fprintf(fout,"< lss\n");

}

}

else

{

if(ch=='>')

{

ch=fgetc(fin);

if(ch=='=')

{

sym=geq;

printf(">= geq\n");

fprintf(fout,">= geq\n");

ch=fgetc(fin);

}

else

{

sym=gtr;

printf("> gtr\n");

fprintf(fout,"> gtr\n");

}

}

else

{

sym=ssym[ch];

if(ch=='+'){printf("+ plus\n");fprintf(fout,"+ plus\n");ch=fgetc(fin);}

else

if(ch=='-'){printf("- minus\n");fprintf(fout,"- minus\n");ch=fgetc(fin);}

else

if(ch=='*'){printf("* times\n");fprintf(fout,"* times\n");ch=fgetc(fin);}

else

if(ch=='/'){printf("/ slash\n");fprintf(fout,"/ slash\n");ch=fgetc(fin);}

else

if(ch=='('){printf("( lparen\n");fprintf(fout,"( lparen\n");ch=fgetc(fin);}

else

if(ch==')'){printf(") rparen\n");fprintf(fout,") rparen\n");ch=fgetc(fin);}

else

if(ch=='='){printf("= eql\n");fprintf(fout,"= eql\n");ch=fgetc(fin);}

else

if(ch==','){printf(", comma\n");fprintf(fout,", comma\n");ch=fgetc(fin);}

else

if(ch=='#'){printf("# neq\n");fprintf(fout,"# neq\n");ch=fgetc(fin);}

else

if(ch=='.'){printf(". period\n");fprintf(fout,". period\n");ch=fgetc(fin);}

else

if(ch==';'){printf("; semicoln\n");fprintf(fout,"; semicoln\n");ch=fgetc(fin);}

else{printf("%c nul\n",ch);fprintf(fout,"%c nul\n",ch);ch=fgetc(fin);}

}

}

}

}

}

}

}

//对关键字等实现初始化

void init()

{

int i;

for(i=0;i<=255;i++)

{

ssym[i]=nul;

}

ssym['+']=plus;

ssym['-']=minus;

ssym['*']=times;

ssym['/']=slash;

ssym['(']=lparen;

ssym[')']=rparen;

ssym['=']=eql;

ssym[',']=comma;

ssym['.']=period;

ssym['#']=neq;

ssym[';']=semicolon;

strcpy(&(word[0][0]),"begin");

strcpy(&(word[1][0]),"call");

strcpy(&(word[2][0]),"const");

strcpy(&(word[3][0]),"do");

strcpy(&(word[4][0]),"end");

strcpy(&(word[5][0]),"if");

strcpy(&(word[6][0]),"odd");

strcpy(&(word[7][0]),"procedure");

strcpy(&(word[8][0]),"read");

strcpy(&(word[9][0]),"program");

strcpy(&(word[10][0]),"var");

strcpy(&(word[11][0]),"whlie");

strcpy(&(word[12][0]),"write");

strcpy(&(word[13][0]),"then");

wsym[0]=beginsym;

wsym[1]=callsym;

wsym[2]=constsym;

wsym[3]=dosym;

wsym[4]=endsym;

wsym[5]=ifsym;

wsym[6]=oddsym;

wsym[7]=procsym;

wsym[8]=readsym;

wsym[9]=programsym;

wsym[10]=varsym;

wsym[11]=whilesym;

wsym[12]=writesym;

wsym[13]=thensym;

}

c语言语法分析器详解

#include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出@的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0) return(0); for(i=0;;i++) { if(p[i]==c) return(1); /*若在,返回1*/ if(i==strlen(p)) return(0); /*若不在,返回0*/ } } /******************************************* 得到一个不是非终结符的符号 ********************************************/

词法分析器,C语言写的,很不错

我自己写的个词法分析程序可以完成一个非常非常基本的C语言词法分析.自己鼓励下自己 :-) #include #include #include #include #include #include #include using namespace std; //用来存储目标文件名 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); //此函数将一个pair数组输出到一个文件中 void OutFile(vector > v); //此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组 vector > analyst(vector vec); //此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假 bool IsKey(string str); int main() {

编译原理设计c语言的词法分析器

编译原理课程设计报告 题目: 学院: 教师: 姓名: 学号: 班级: 评分: 签字:

编译原理课程设计一:设计c语言的词法分析器 一、实验目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。 二、实验要求 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 三、实验设计 3.1.单词分类及表示 3.1.1 C语言的子集分类 (1)标识符:以字母开头的字母数字串 (2)整数或浮点型。 (3)保留字:for,while,do,else,if,static,int,sizeof,break,continue (4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||; (5)界符:"(",")",",",":",";","{","}" 3.1.2单词二元组(单词分类号、单词自身值)

3.2 词法分析器的设计 3.2.1算法设计 3.2.1.1概要设计 从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。

3.2.1.2状态图设计 3.2.2输入输出设计 输入:通过文件指针从文件中一个一个读取字符 输出:输出单词二元组至文件。格式为(种别码,值) 3.2.3主要函数 void Getchar(FILE *fp ) //读入一个字符 void GetBC(FILE *fp)//读入一个非空字符 void contacat()//连接字符 int letter()//判断是否为字母 int digit()//判断是否为字母 void retract(FILE *fp,char *c)//回退 int reserve (char **k)//处理保留字 int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置

编译原理C语言词法分析器

编译原理 C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法和技术; 3、加深对有穷自动机模型的理解。 三、主要函数 四、设计 1. 主函数 void main ( )

2. 初始化函数 void load ( ) 3. 保留字及标识符判断函数 void char_search(char *word) 4. 整数类型判断函数 void inta_search(char *word) 5. 浮点类型判断函数 void intb_search(char *word)

6. 字符串常量判断函数 void cc_search(char *word) 7. 字符常量判断函数 void c_search(char *word) 同4、5函数图 8.主扫描函数 void scan ( ) 五、关键代码 #include <> #include <> #include <> char *key0[]={"

C语言词法分析器-内容说明注释完整-可运行代码知识分享

C语言词法分析器-内容说明注释完整-可运 行代码

1.实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 2.实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 3.实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组

*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字 流程图、程序 流程图:

程序:

编译原理词法分析和语法分析报告+代码(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.0 *作者:** *2015/4/2 ************************************************/ #include #include #include #include #include #define LENGTH1 10//type reserved word size FILE * fp=NULL;//outstream Pointer FILE * fw=NULL;//instream pointer char character; char token[32]; //The character array to store the sequence of characters, has been read. //Code table char * CODE[]={"identifier","constant","keyword","+","-","*","/",">","<",">=","<=","!=","=","==", "(",")","[","]","{","}","&","||","!",",",";",".",":","\"","%","#","\'"}; //key word table char *k[]={"for","while","do","go","to","switch","if","else","int","float","char","static","break", "exit","continu","error"}; //标识符结构体 typedef struct { char * I[256]; //标识符数组 int len;//标识符数量 } identifier; //常量结构体 typedef struct { int cont[300];//存放常量的数组 int len;//常量的数目 } constnumber; //读入一个字符,从输入流中读入一个字符到变量character中。 void getNextChar(FILE *ifp)

C语言 词法分析器设计_编译原理

词法分析器设计 一、问题描述 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 二、实验思路 1、本实验思路很简单,就是逐个匹配测试文件的每个字符与程序中所标识的符号,总共分为几个比较模块,先是字母数字模块,可以识别出C语言程序中保留字,标识符和数字,其次是运算符和界符模块,可以识别出运算符和界符,最后一个模块就是未标识的符号,此时程序会报错,然后依次循环,直到文件结束。 2、采用结构体来存储符号的类型和符号本身: struct point { char *kind; char value[10]; }; 另外采用C语言文件指针和相关函数处理待测试文件以及测试结果文件。 3、程序中的函数名指示含义:keyword----保留字,Identifier---标识符,Digit---数字,CaculatorIdentifier---运算符,PatitionIdentifier---界符 4、程序中所定义的符号采用char类型,只能对C语言中最常见的单字符的符号进行定义,如‘+’,‘<’,而对于“<=”,”>=”及“++”,“--”则不能处理。因此本程序并不能实现对所有符号的归类。 三、实验代码 #include #include char keywordtable[30][10]= {"int","char","float","double","signed","unsigned", "if","else","break","while","return","switch", "case","continue","for","default","void","const", "static","long","struct","auto","register","typedef", "enum","extern","short","goto","sizeof","do", }; char caculatetable[15]={'+','-','*','/','%','(',')','=','>','<','#'}; char partitiontable[10]={',',';','.',' ','{','}','"','[',']'}; struct point { char *kind; char value[10]; };

基于LEX的C语言词法分析器

实验二C-语言的词法分析器(基于Lex) 1. 课程设计目标 自动构造C-语言的的词法分析器,要求能够掌握编译原理的基本理论,,理解编译程序的基本结构,掌握编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤.,增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,熟悉C-语言的各种Token。 。 2. 分析与设计 基于Parser Genarator的词法分析器构造方法 Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliary routine)或用户程序集(user routine)。这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下 {definitions} %% {rules} %% {auxiliary routines} 而且第一部分用“%{”和“%}”括起来。 第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。 定义正则表达式如下 ID = letter letter* NUM = digit digit* Letter = a|…|z|A|…|Z Dig it = 0|…|9 Keyword = else|if|int|return|void|while Special symbol = +|-|*|/|<|<=|>|>=|==|!=|=|;|,|(|)|[|]|{|}|/*|*/ White space = “ ” Enter = \n 在lex中的构造 letter [A-Za-z] digit [0-9] id ({letter}|[_])({letter}|{digit}|[_])* error_id ({digit})+({letter})+ num {digit}+ whitespace [ \t]+ enter [\n]+ 在Lex中的规则定义构造 定义识别保留字规则"int"|"else"|"return"|"void"|"if"|"while"

C语言词法分析器

C语言词法分析器 C语言词法分析器的设计与实现一(实验目的 1(强化对系统软件综合工程实现能力、规划能力的训练; 2(加强对词法分析原理、方法和基本实现技术的理解; 二(实验内容 或 C++ )作为宿主语言完成: 用C语言( 其中具体要求: 1.使用DFA实现词法分析器的设计; 2.实现对C源程序中注释的过滤; 3.利用两对半缓冲区从文件中逐一读取单词; 4.词法分析结果属性字流存放在独立文件中; 5.统计源程序每行单词的个数和整个源文件单词个数; 6.具有报告词法错误和出错位置(源程序行号和该行字符)的功能; 7.屏幕输出属性字流,每次显示10行,按ESC可中途退出,每行有统计信息,最后有词法分析的全 部信息,包括各种属性单词的个数。 三(实验验收与评分要求 1.编写C语言词法分析器的源程序并调试通过; 2.通过测试程序的验收 (测试程序名称:Test-Lexcial); 3.提交简明扼要的书面实验报告。内容包括:FA设计;源程序主要函数功能;主要数据结构设计。 四. 验收测试用例 1.测试用例一:统一验收测试用例; #include

#include char buf[100],str[15]; int countdef=0; FILE *fpmiddle; struct define { char with[30]; char des[30]; char filename[15]; }def[30]; char* getFileName() { int i=0,k=0; for(i=0;buf[i]!='<'&&i<30&&buf[i]!='\0';i++); i++; while(buf[i]!='>'&&i<30&&buf[i]!='\0') str[k++]=buf[i++]; str[k]='\0'; puts(str); return str; } long readline(FILE *fpt) { if(fgets(buf,100,fpt)==NULL)

编译原理C语言词法分析器

编译原理C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法和技术; 3、加深对有穷自动机模型的理解。 三、主要函数

四、设计 1.主函数void main ( ) 2. 初始化函数void load ( ) 3. 保留字及标识符判断函数void char_search(char *word) 4. 整数类型判断函数void inta_search(char *word)

5. 浮点类型判断函数void intb_search(char *word) 6. 字符串常量判断函数void cc_search(char *word) 7. 字符常量判断函数void c_search(char *word) 同4、5函数图 8.主扫描函数void scan ( )

五、关键代码 #include #include #include char *key0[]={" ","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","i f","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","_Complex","_Imaginary ","union","unsigned","void","volatile","while"}; /*保留字表*/ char *key1[]={" ","(",")","[","]","{","}",",",";","'"}; /*分隔符表*/ char *key2[]={" ","+","-","*","/","%","<",">","==",">=","<=","!=","!","&&","||","<<",">>","~","|","^","&","=","?:","->","++","--",".","+=", "-=","*=","/="}; /*运算符表*/ int xx0[35],xx1[10],xx2[31]; int temp_key3=0,temp_c40=0,temp_c41=0,temp_c42=0,temp_c43=0; /******* 初始化函数*******/ void load() { int mm; for (mm=0;mm<=34;mm++) { xx0[mm]=0; } for (mm=0;mm<=9;mm++) { xx1[mm]=0; } for (mm=0;mm<=30;mm++)

(完整版)词法分析器(c语言实现)

词法分析c实现 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 2.1待分析的简单的词法 (1)关键字: beg in if the n 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为整型常数。 例如:对源程序begi n x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,经过词法分析后输出如下序列: (1,begi n)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的C语言程序源代码: #i nclude #in clude char prog[80],toke n[ 8],ch;

int syn,p,m,n,sum; char *rwtab[6]={"begin","if","then","while","do","end"}; scaner(); main() {p=0; printf("\n please input a string(end with '#'):/n"); do{ scanf("%c",&ch); 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"); getch(); exit(0); default: printf("( %-10s%5d )\n",token,syn); break; } }while(syn!=0); getch(); } 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; }

毕业设计编译原理设计报告c语言词法与语法分析器的实现

编译原理课程设计报告 课题名称:编译原理课程设计 C-语言词法与语法分析器的实现 提交文档学生姓名: 提交文档学生学号: 同组成员名单: 指导教师姓名: 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:年月日

C-词法与语法分析器的实现 1.课程设计目标 (1)题目实用性 C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。(2)C-语言的词法说明 ①语言的关键字: else if int return void while 所有的关键字都是保留字,并且必须是小写。 ②专用符号: + - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。 小写和大写字母是有区别的。 ④空格由空白、换行符和制表符组成。空格通常被忽略。 ⑤注释用通常的c语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套。

(3)程序设计目标 能够对一个程序正确的进行词法及语法分析。 2.分析与设计 (1)设计思想 a.词法分析 词法分析的实现主要利用有穷自动机理论。有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。通过有穷自动机理论能够容易的设计出词法分析器。b.语法分析 语法分析采用递归下降分析。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。 (2)程序流程图 程序主流程图: 词法分析: 语法分析: 读取程序 对输入的字符进行匹配判断 对应输出各行代码的词法分析结果 读取程序 进行递归下降分析匹配或建立树 输出程序对 应的语法树

C语言语法分析器

郑州轻工业学院 编译原理课程设计总结报告 设计题目:词法分析器(语法分析器) 学生姓名: 系别: 专业: 班级: 学号: 指导教师: 20013年6 月2日

目录 一、设计题目 (3) 二、运行环境(软、硬件环境) (3) 三、算法设计的思想 (3) 四、算法流程图 (5) 五、算法设计分析 (5) 六、源代码 (6) 七、运行结果 (11) 八、收获及体会 (12)

(一)设计题目 词法分析器 (二)运行环境 Visual C++.6.0 (三)算法设计的思想 各种单词符号对应的种别码: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 1.主程序示意图: 主程序示意图如下;其中初值包括如下两个方面:

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

(五)算法设计分析 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 其中初值包括如下两个方面:(一)关键字表的初值。关键字作为特殊标示符处理,把它们预先安排到一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如果能查到匹配的单词,则该单词为关键字,否则为一般的标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab[6]={“begin”,”if”,”then”,”while”,”do”,”end”}; (2)程序需要用到的主要变量为syn,token和sum。 2.扫描子程序的算法思想

C语言词法分析器构造实验报告(1)1

C 语言词法分析器构造实验报告 02计算机(2) 2002374203 冯绍欣 一、题目要求: 完成一个C 语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并能处理注释。 二、设计方案: 这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default 。选择要分析的c 文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。 1、全局数据结构: 字符数组 set[ ]:存放从文件中读到的所有字符; str[ ]:存放经过注释处理和预空格处理的字符; strtoken[ ]:存放当前分析的字符; 结构体 KEYTABLE :存放关键字及其标号; 全局字符变量 ch :当前读入字符; 全局整型变量 sr, to :数组str, strtoken 的指针。 2、以层次图形式描述模块的组成及调用关系 3、主要函数的设计要求(功能、参数、返回值): openfile :打开文件; GetChar :将下一个输入字符读到ch 中,搜索指示器前移一字符位置; GetBC :检查ch 中的字符是否为空白。若是,则调用GetChar 直至ch 中进入一个非空白字符; Main ( ) Openfile ( ) Analysis ( ) Reflesh() Process() Set32() GetChar() GetBC() Concat() Reserve() IsLetter() IsDigit() Retract() GetChar()

C语言词法分析器,内容说明注释完整,可运行代码

1.实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C 语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 2.实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 3.实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字 流程图、程序

流程图: 开始 输入源文件路径 路径是否有 效 是初始化文件指针 否 将字符加入字符数 组Word[] 是空格,空白或换 行吗 是字母吗是数字吗否否是界符吗否打开源文件 跳过该字符 是是 文件结束? 否 将字符加入字符数 组Word[] 否 将字符加入字符数组Word[] 是 指向下一字符识别指针内容 指向下一字符 是字母惑数字 吗 是 将word 与关键字表key 进行匹 配 否匹配?是输出word 为关键字 输出word 为普通标示符 否将字符加入字符数组Word[] 指向下一字符输出word 为常数 识别指针内容 回退 是数字吗 是 否输出word 为界符 指向下一字符 结束 是输出Word 内容为不可识别 将字符加入字符数组Word[]

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

信息工程学院实验报告(2010 ~2011 学年度第一学期) 姓名:柳冠天 学号:2081908318 班级:083

词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 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.1 各种单词符号对应的种别码 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)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:

相关文档
相关文档 最新文档