资源描述:
《编译原理课设计.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理课程设计(C-词法分析器、语法分析器)平台:VC++姓名:闫洪波学号:20040810426班级:计科四班实验报告一.程序思路1.词法分析器对输入的程序进行分析,将关键字,保留字与系统标识符分开,并对其属性进行说明。建立数组,将单词读入,对单词的ASCII码进行判断,将在ASCII码值在一定区间进行区分(使用if语句来判断),分开来后,对其所在ASCII值区间的不同,给予以不同的属性(比如:系统保留字…),词法分析器完成后要能识别+,-,=等字符。2.语法分析器对输入的程序语句进行分析。对每个非终结点定义单个函数
2、,定义了它的后继节点。然后用一个构造来的函数,使定义的后继节点符合语法,否则报错。下面是C-语言的EBNF文法:1declaration-list->declaration{declaration}2declaration->(int
3、void)ID(;
4、[NUM];
5、(params)compound-stmt)3var-declaration->(int
6、void)ID(;
7、[NUM];)4params->intID(e
8、[]){,param}
9、void(e
10、ID(e
11、[]){,param})5param->(int
12、
13、void)ID(e
14、[])6compound-stmt->{local-declarationsstatement-list}7local-declarations->{var-declaration}8statement-list->{statement}9statement->assign-stmt
15、compound-stmt
16、selection-stmt
17、iteration-stmt
18、return-stmt10selection-stmt->if(expression)statement(e
19、elsestateme
20、nt)11iteration-stmt->while(expression)statement12return-stmt->return(;
21、expression;)13assign-stmt->ID(e
22、[expression])=expression;14expression->additive-expression{relopadditive-expression}15relop-><(e
23、=)
24、>(e
25、=)
26、(=
27、!)=16additive-expression->term{addopterm}17addop->
28、+
29、-18term->factor{mulfactor}19mulop->*
30、/20factor->(expression)
31、ID(e
32、[expression]
33、(args))
34、NUM21args->expression{,expression}
35、e二、源代码1、词法分析:#include#include#include#include#include#defineMAXTOKENLEN40//#defineMAXLINE1000#
36、defineMAXRESERVED6#defineFALSE0#defineTRUE1#defineBUFLEN256//usingnamespacestd;intlineno=0;//FILE*source;//FILE*listing;//intlinepos=0;//staticintbufsize=0;//charfile_in[100];charfile_out[100];charlineBuf[MAXLINE];//chartokenString[MAXTOKENLEN+1];typedefenum{ENDF
37、ILE,ERROR,ELSE,IF,INT,RETURN,VOID,WHILE,//keywordID,NUM,ADD,SUB,MUL,DIV,LT,LE,GT,GE,EQ,NEQ,ASSIGN,SEMICOLON,COMMA,LSP,RSP,LMP,RMP,LLP,RLP}TokenType;typedefenum{START,INASSIGN,SINCOMMENT,FINCOMMENT,INCOMMENT,INNUM,INID,INL,ING,INNE,DONE,}StateType;staticstruct{cha
38、r*str;TokenTypetok;}reservedWords[MAXRESERVED]={{"else",ELSE},{"if",IF},{"int",INT},{"return",RETURN},{"void",VOID},{"while",WHILE}};TokenTypereservedLookup(ch