西安交大编译原理语法分析器实验报告.docx

西安交大编译原理语法分析器实验报告.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理课内实验报告 学生姓名 石磊 专业/班级 计算机26 学 号 2120505140 所在学院 电信学院 提交日期 2014-12-2 一:实验目的: 1.强化对系统软件综合工程实现能力的训练; 2.加强对语法分析原理、方法和基本实现技术的理解; 二:实验内容 1. 用C语言或者其他的高级语言作为宿主语言完成C0语言的词法分析器的设计和实现。 2. 针对if语句的文法编写一个递归下降分析程序,输出结果为抽象语法树。注意,if语句文法中的表达式E采用四则运算表达式的文法;抽象语法树的格式自行设计,如果需要降低难度的话,也可用具体语法树而不用抽象语法树作为输出。 三:实验功能描述 编写C0语言的语法分析器的源程序并调试通过。其中语法分析程序既可以自己手动去完成,也可以利用YACC自动生成。 2. 通过测试程序的验收; 四:功能描述: 该语法分析器用yacc生成,针对if语句的文法编写的向下递归程序,输出结果为语法树,实现了实验目标,达到了实验要求。 五:实验程序代码 %{ #include string.h #include stdlib.h #include yystype.h #include y.tab.h #include treedisp.h int yycount = 0; extern YYSTYPE yylval; #define NSYMS 20 struct symtab { char *name; double value; } symtab[NSYMS]; struct symtab *symlook(char *s); #define NRSVS 10 struct rsvtab { char *name; int id; } rsvtab[NRSVS] = { {if, IF}, {else, ELSE}, {while, WHILE}, {for, FOR}, {other, OTHER}, {var, VAR} }; int rsvlook(char *s); %} digit [0-9] integer {digit}+ eq == pl + mi - mu * di / sc ; as = identifier [a-zA-Z][a-zA-Z0-9_]* delim [ \n\t] ws {delim}+ other other %% {integer} { //yylval = atoi(yytext); rec_token(INTEGER); return INTEGER; } {identifier} { if (rsvlook(yytext) != 0) { rec_token(RESERVED); return rsvlook(yytext); } rec_token(SYMBOL); return SYMBOL; {eq} { rec_token(OPR); return EQ; } {pl} { rec_token(OPR); return PL; } {mi} { rec_token(OPR); return MI; } {mu} { rec_token(OPR); return MU; } {di} { rec_token(OPR); return DI; } {as} { rec_token(OPR); return ASSIGN; } {sc} { rec_token(SC); return SC; } \( { rec_token(LB); return LB; } \) { rec_token(RB); return RB; } {ws} ; . { printf(error: %s\n, yytext); yyerror(Illigal input.); } %% char *buffer[20]; void rec_token(char *s) { yylval.token_id = ++yycount; yylval.text = strdup(yytext); sprintf(buffer, %s(%s), s, yytext); name_node(yycount, buffer); } int rsvlook(char *s) { struct rsvtab *sp; f

文档评论(0)

***** + 关注
实名认证
内容提供者

我是自由职业者,从事文档的创作工作。

1亿VIP精品文档

相关文档