编译原理实验二 使用lex创建词法分析器
实验二直接上代码吧,其实我也不怎么知道哪里是致命的,课上听老师的课后,将代码写上,但是运行在环境里面还是不行,把注释去掉就可以了,不知道会不会是注释的问题
%{ #include <stdio.h> #include "define.h" int lineno = 1; TokenType id2keyword(const char* token); %} newline \n whitespace [ \t]+ id [a-zA-Z_]+[a-zA-Z0-9_]* num ([1-9]+[0-9]*)|([1-9])|0 %% ":=" { return ASSIGN; } "=" { return EQ;} "<" { return LT; } "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "/" { return OVER; } "(" { return LPAREN; } ")" { return RPAREN; } ";" { return SEMI; } {id} { return id2keyword(yytext); } {num} { return NUM; } {newline} { lineno++; } {whitespace} { } "{" { char c; do { c = input(); if(c == EOF) { return ERROR; } else if(c == '\n') lineno++; else if(c == '}') break; }while(1); } . { return ERROR; } %% void printToken(TokenType token,char* tokenString); int main(int argc, char* argv[]) { TokenType tt; if(argc < 2) { printf("Usage: scan.exe filename.\n"); return 1; } FILE* file = fopen(argv[1], "rt"); if(NULL == file) { printf("Can not open file \"%s\".\n", argv[1]); return 1; } yyin = file; while((tt = yylex()) != 0) { printToken(tt, yytext); if(tt==ERROR) break; } fclose(file); return 0; } typedef struct _KeyWord_Entry { const char* word; TokenType type; }KeyWord_Entry; static const KeyWord_Entry key_table[] = { { "if", IF }, { "then", THEN }, { "else", ELSE }, { "end", END }, { "repeat", REPEAT }, { "until", UNTIL }, { "read", READ }, { "write", WRITE } }; TokenType id2keyword(const char* id) { int i; for (i = 0; i < 8; i++) { if (!strcmp(id, key_table[i].word)) return key_table[i].type; } return ID; } void printToken(TokenType token,char* tokenString) { switch (token) { case IF: printf("line%2d: %-6d%-10s%s\n", lineno,IF,"IF", "if"); break; case THEN: printf("line%2d: %-6d%-10s%s\n", lineno,THEN, "THEN","then"); break; case ELSE: printf("line%2d: %-6d%-10s%s\n",lineno, ELSE, "ELSE" "else"); break; case END: printf("line%2d: %-6d%-10s%s\n", lineno,END,"END", "end"); break; case REPEAT: printf("line%2d: %-6d%-10s%s\n", lineno,REPEAT,"REPEAT", "repeat"); break; case UNTIL: printf("line%2d: %-6d%-10s%s\n", lineno,UNTIL,"UNTIL", "until"); break; case READ: printf("line%2d: %-6d%-10s%s\n",lineno, READ,"READ", "read"); break; case WRITE: printf("line%2d: %-6d%-10s%s\n",lineno, WRITE, "WRITE", "write"); break; case ASSIGN: printf("line%2d: %-6d%-10s%s\n",lineno, ASSIGN,"ASSIGN", ":="); break; case LT: printf("line%2d: %-6d%-10s%s\n",lineno, LT,"LT", "<"); break; case EQ: printf("line%2d: %-6d%-10s%s\n", lineno,EQ, "EQ","="); break; case LPAREN: printf("line%2d: %-6d%-10s%s\n", lineno,LPAREN," LPAREN" ,"("); break; case RPAREN: printf("line%2d: %-6d%-10s%s\n", lineno,RPAREN,"RPAREN", ")"); break; case SEMI: printf("line%2d: %-6d%-10s%s\n", lineno,SEMI,"SEMI", ";"); break; case PLUS: printf("line%2d: %-6d%-10s%s\n", lineno,PLUS, "PLUS","+"); break; case MINUS: printf("line%2d: %-6d%-10s%s\n", lineno,MINUS, "MINUS","-"); break; case TIMES: printf("line%2d: %-6d%-10s%s\n", lineno,TIMES, "TIMES","*"); break; case OVER: printf("line%2d: %-6d%-10s%s\n", lineno,OVER,"OVER", "/"); break; case ENDFILE: printf("line%2d: %-6d%-10s%s\n", lineno,ENDFILE,"ENDFILE", "endfile"); break; case NUM: printf("line%2d: %-6d%-10s%s\n", lineno,NUM,"NUM", tokenString); break; case ID: printf("line%2d: %-6d%-10s%s\n", lineno,ID, "ID",tokenString); break; case ERROR: printf("line%2d: %-6d%-10s\n", lineno,ERROR, "ERROR"); break; default: return ; } }
本文来自博客园,作者:hellciw,转载请注明原文链接:https://www.cnblogs.com/hellciw/p/17488438.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析