《编译原理课程设计》课程报告题目C语言词法分析器和C-语言语法分析器学生姓名学生学号指导教师提交报告时间2019年6月8日四川大学《编译原理课程设计》学号20121414610171C语言词法分析器1实验目的及意义1.熟悉C语言词法2.掌握构造DFA的过程3.掌握利用DFA实现C语言的词法分析器4.理解编译器词法分析的工作原理2词法特点及正则表达式2.1词法特点2.1.1保留字AUTO,BREAK,CASE,CHAR,CONST,CONTINUE,DEFAULT,DO,DOUBLE,ELSE,ENUM,EXTERN,FLOAT,FOR,GOTO,IF,INT,LONG,REGISTER,RETURN,SHORT,SIGNED,SIZEOF,STATIC,STRUCT,SWITCH,TYPEDEF,UNION,UNSIGNED,VOID,VOLATILE,WHILE,2.1.2符号+-*/++--+=-=*=====!==;,()[]{}/**/:2.2正则表达式whitespace=(newline|blank|tab|comment)+digit=0|..|9nat=digit+signedNat=(+|-)?natNUM=signedNat(“.”nat)?letter=a|..|z|A|..|ZID=letter(letter|digit|“_”)+CHAR='other+'STRING=“other+”四川大学《编译原理课程设计》学号201214146101723Token定义3.1token类型保留字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongredisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile特殊符号+-*/++--+=-=*=====!==;,()[]{}/**/:文件结束、错误EOFERROR其它tokenNUMIDCHARACTERSTRING3.2tokenType类型代码typedefenum{//错误、结束ENDFILE,ERROR,//保留字AUTO,BREAK,CASE,CHAR,CONST,CONTINUE,DEFAULT,DO,DOUBLE,ELSE,ENUM,EXTERN,FLOAT,FOR,GOTO,IF,INT,LONG,REGISTER,RETURN,SHORT,SIGNED,SIZEOF,STATIC,STRUCT,SWITCH,TYPEDEF,UNION,UNSIGNED,VOID,VOLATILE,WHILE,//其他tokenID,NUM,CHARACTER,STRING,//特殊符号//+、-、*、/、++、--、+=、-=、*=、、=、、=、==、!=、=、;、,、(、)、[、]、//{、}、/*、*/、:PLUS,MINUS,TIMES,OVER,SELFPLUS,SELFMINUS,PLUSASSIGN,MINUSASSIGN,TIMESASSIGN,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,MINUSASSIGN,TIMESASSIGN,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LBRACKET,RBRACKET,LCBRACKET,RCBRACKET,LCOMMENT,RCOMMENT,COLON}TokenType;四川大学《编译原理课程设计》学号201214146101734DFA设计4.1注释的DFA设计注释的DFA如下所示,一共分为5个状态,在开始状态1时,如果输入的字符为/,则进入状态2,此时有可能进入注释状态,如果在状态2时,输入的字符为*,则进入注释状态,状态将转到3,如果在状态3时,输入的字符为*,则有可能结束注释状态,此时状态将转到状态4,如果在状态4时输入的字符为/,则注释状态结束,状态转移到结束状态。4.2词法分析的DFA设计词法分析的DFA如下所示,一共分为10个状态:START、INNUM、INNUM1、INNUM2、INID、INCOMPARE、INOPERATE、INSTRING、INCHAR、DONE。状态START表示开始状态,状态INNUM,INNUM1,INNUM2表示数字类型(NUM)Token的状态,状态INID表示标示符(ID)类型Token的状态,状态INOPERATE表示算数运算符型Token的状态,状态INOCOMPARE表示比较运算符型Token的状态,INSTRING表示字符串(STRING)类型Token的状态,INCHAR表示字符(CHARACTER)类型Token的状态,状态DONE表示接收状态。在开始状态START时如果输入的字符为空白符,如空格换行等,则仍在START状态如果输入的字符为digit,则进入状态INNUM,即可能是数字类型(NUM)Token的状态如果输入的字符为letter,则进入状态INID,即可能是标识符类型Token的状态如果输入的字符为、、!、=,则进入状态INCOMPARE,即可能是比较运算符型Token的状态如果输入的字符为+、—、*、/,则进入状态INOPERATE,即可能是算数运算符类型Token的状态如果输入的字符为‘,则进入状态INCHAR,即可能是字符类型Token的状态如果输入的字符为“,则进入状态INSTRING,即可能是字符串类型Token的状态如果输入的字符为是除以上之外的,则进入状态DONE,这次输入的字符可能是单目运算符、错误等在状态INNUM时如果输入的字符为digit,则仍停留在INNUM状态如果输入的字符为”.”,则转到INNUM1状态四川大学《编译原理课程设计》学号20121414610174在状态INNUM1时如果输入的字符为digit,则进入INNUM2状态在状态INNUM2时如果输入的为其他的字符,则转到DONE状态如果输入字符为digit,则停留在INNUM2状态如果输入的为其他字符,则转到DONE状态在状态INID时如果输入的字符为letter或“_”或digit,则仍停留在INID状态如果输入的为其他的字符,则转到DONE状态在状态INCOMPARE时如果输入的字符为=,则转到DONE状态如果输入的为其他的字符,则直接转到DONE状态在状态INOPERATE时如果输入的字符为=,转到DONE状态如果输入的为其他的字符,则直接转到DONE状态在状态INCOMPARE时如果输入的字符为=,则转到DONE状态如果输入的为其他的字符,则直接转到DONE状态在状态INCHAR时如果输入为单引号,则转到DONE状态如果输入的为其他字符,则停留在INCHAR状态在状态INSTRING时如果输入为双引号,则转到DONE状态如果输入的为其他字符,则停留在INSTRING状态在状态DONE时接受状态,根据分析过程中获取的字符串确定Token的类型,并生成和保存相应的Token四川大学《编译原理课程设计》学号201214146101755代码结构分析5.1主要结构词法分析部分的代码在scan.c和scan.h文件中,全局变量以及公共函数代码在global.h以及util.h和util.c文件中。主函数中进行文件打开和关闭,并调用scan.c中的getToken()函数对源文件进行词法分析。5.2函数和成员变量的作用和含义voidprintToken(TokenType,constchar*);/*输出token*/char*copyString(char*);/*字符串复制*/TokenTypegetToken(void);/*词法分析函数*/staticintgetNextChar(void)/*获取下一个字符*/staticvoidungetNextChar(void)/*退回一个字符*/staticTokenTypereservedLookup(char*s)/*查找对应的保留字*/chartokenString[MAXTOKENLEN+1];/*token字符串*/intlineno=0;/*当前行号*/staticcharlineBuf[BUFLEN];/*整行代码缓冲区*/staticintlinepos=0;/*当前行的位置*/staticintbufsize=0;/*缓冲区大小*/staticintEOF_flag=FALSE;/*文件结束标志*/四川大学《编译原理课程设计》学号201214146101766实验结果与分析6.1测试文件test.c/*test.c*/intmain(void){###inta=0;floatb=20.1;charc[]=abcdefg;chard='h';if(a=2){b+=0.1a++;}}6.2测试结果四川大学《编译原理课程设计》学号201214146101776.3结果分析test.c文件中包括注释,保留字,整数和小数,标识符,特殊符号,字符串以及错误输入。本程序成功对test.c文件进行了词法分析,对注释进行了忽略,输出了相应的行号、类型、取值,对于错误的输入显示ERROR。7小结通过编写C语言词法分析器,我对编译器的基本原理有了更深的认识,同时掌握了DFA的设计与实现。在最开始的编写过程中,我总是把词法和语法分析混淆,比如一些错误应该在语法分析中判断,我却写进了词法分析中,后来我逐步认识到词法分析的作用就是提取源代码中的Token。在DFA的实现过程中,我主要参考了书后tiny语言DFA的实现方法,将它扩展到C语言。另外C语言词法比较复杂,因为时间关系我省略了一些,比如位运算符,转义字符等等,希望今后能完善。四川大学《编译原理课程设计》学号20121414610178C-语言语法分析器1实验目的及意义用C语言编制Tiny/C-语言的语法分析程序,实现对词法分析程序所提供的Token序列的语法检查和结构分析。2文法规则(EBNF)program→declaration-listdeclaration_list→declaration{declaration}declaration→var-declaration|fun-declarationvar_declaration→type-specifierID;|type-specifierID[NUM];type-specifier→int|voidfun-declatation→type-specifierID(params)|compound-stmtparams→param_list|voidparam_list→param{,param}param→type-specifierID{[]}compound-stmt→{local-declarationstatement-list}local-declarations→empty{var-declaration}statement-list→{statement}statement→expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmtexpression-stmt→[expression];selection-stmt→if(expression)statement[elsestatement]iteration-stmt→while(expression)statementreturn-stmt→return[expression];expression→var=expression|simple-expressionrelop→=||