编译原理实验代码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实验代码.doc

[实验任务] 完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。 标识符→字母︱ 标识符字母︱ 标识符数字 无符号整数→数字︱ 无符号整数数字 单字符分界符 →+ ︱- ︱* ︱; ︱(︱) 双字符分界符→大于=︱小于=︱小于︱冒号=︱斜竖* 小于→ 等于→= 大于→ 冒号 →: 斜竖 →/ 该语言的保留字 :begin end if then else for do while and or not 说明: 1 该语言大小写不敏感。 2 字母为a-z A-Z,数字为0-9。 3可以对上述文法进行扩充和改造。 4 ‘/*……*/’为程序的注释部分。 [设计要求] 1、给出各单词符号的类别编码。 2、词法分析程序应能发现输入串中的错误。 3、词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件。 4、设计两个测试用例(尽可能完备),并给出测试结果。 demo.cpp #include stdio.h #include ctype.h #include string.h #include demo.h char token[20]; int lookup(char *token) { for (int i = 0; i 11; i++) { if (strcmp(token, KEY_WORDS[i]) == 0) { return i+1; } } return 0; } char getletter(FILE *fp) { return tolower(fgetc(fp)); } void out(FILE *fp, int c, char *value) { fprintf(fp, %d,%s\n, c, value); } void report_error(FILE *fp, char ch) { fprintf(fp, There must be some error.\n); fprintf(fp, %c...\n, ch); fprintf(fp, ^\n); } void scanner(FILE *infile, FILE *outfile) { char ch; int i, c; do { do { ch = getletter(infile); } while(isspace(ch)); if (isalpha(ch)) { token[0] = ch; ch = getletter(infile); i = 1; while (isalnum(ch)) { token[i] = ch; i++; ch = getletter(infile); } token[i] = \0; fseek(infile, -1, 1); c = lookup(token); if (c == 0) { out(outfile, ID, token); } else { out(outfile, c, ); } } else { if (isdigit(ch)) { token[0] = ch; ch = getletter(infile); i = 1; while (isdigit(ch)) { token[i] = ch; i++; ch = getletter(infile); } token[i] = \0; fseek(infile, -1, 1); out(outfile, INT, token); } else { switch(ch) { case : { ch = getletter(infile); if (ch == =) { out(outfile, LE, ); } else if (ch == ) { out(outfile, NE, ); } else { fseek(infile, -1, 1); out(outfile, LT, ); } break; } case =: { out(outfile, EQ, ); break;

文档评论(0)

dzzj200808 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档