day11.09
来源:互联网 发布:淘宝的水印设置在哪 编辑:程序博客网 时间:2024/05/18 21:11
上午数逻实验想了6,7道水题和一个hard,可惜没实现完,明天一定AC了。
昨天的sell and but stock IV终于理解了可是还是没通过…
下午实现了
还剩一个List的和一个stack的hard没写…
晚上把编译原理的作业完成了,用lex实现了一个词法分析器,少实现了++和–,明天补上。
格式大致![第一段两个百分号之间是定义枚举类Kind来表示各词法单元类型,然后是声明后边要用到的函数
第二段是正则定义,定义了letter,num和id三种正则表达式。
下边就是具体读到这个地方的时候执行的操作,要自己写的基本只有id这个词法单元。
进入主函数,读入字符不用理会。
下边就是我们自己创建的符号表token结构体,一个全局变量符号表指针word_list和一个用来记录ID属性值的idNum全局变量。
之后就是包括搜索,插入(创建),以及deal函数用来处理遇到ID类型如何输出。
一个容易忽略的点就是创建token的时候不能name=yytext.
否则yytext这片空间变得时候name也跟着变了。
%{/****************************************************************************mylexer.lParserWizard generated Lex file.Date: 2016年11月8日****************************************************************************/#pragma warning( disable : 4996)enum Kind{ TYPE=0, ID,NUM,LB,RB,LD,RD,ADD,SUB,MUL,DIV,EQUAL,MAIN,ASSIGN,OPERATOR,SEMICOLON,IF,FOR,ELSE,WHILE};int search(char*word);int add_word(int type,char*word);void deal(char*yytext);#include<iostream>using namespace std;%}/////////////////////////////////////////////////////////////////////////////// declarations section// lexical analyser name%name mylexer// class definition{ // place any extra class members here}// constructor{ // place any extra initialisation code here}// destructor{ // place any extra cleanup code here}// place any declarations hereletter [A-Za-z]num [0-9]id (_|{letter})(_|{letter}|{num})*%%/////////////////////////////////////////////////////////////////////////////// rules section// place your Lex rules here[\n\t ] ;main { cout << "MAIN " << yytext << endl; }int { cout << "TYPE " << yytext << endl; }double { cout << "TYPE " << yytext << endl; }char { cout << "TYPE " << yytext << endl; }void { cout << "TYPE " << yytext << endl; }if { cout << "IF " << yytext << endl; }for { cout << "FOR " << yytext << endl; }else { cout << "ELSE " << yytext << endl; }while { cout << "WHILE " << yytext << endl; }{id} {deal(yytext); }{num}* {cout << "NUM " << yytext << " " << yytext << endl; }\+ {cout << "ADD " << yytext << " " << endl; }- {cout << "SUB " << yytext << " " << endl; }\* {cout << "MUL " << yytext << " " << endl; }\/ {cout << "DIV " << yytext << " " << endl; }= {cout << "ASSIGN " << yytext << " " << endl; }== {cout << "EQUAL " << yytext << " " << endl; }\( { cout << "LD " << yytext << " " << endl; } \) {cout << "RD " << yytext << " " << endl;}\{ { cout << "LB " << yytext << " " << endl; }\} {cout << "RB " << yytext << " " << endl; }; {cout << "SEMICOLON " << yytext<< endl; }%%/////////////////////////////////////////////////////////////////////////////// programs sectionint main(void){ cout << "词素表:" << endl; cout << "单词 词素 属性" << endl; mylexer lexer; freopen("C:\\Users\\lenovo\\Desktop\\text.txt", "r", stdin); if (lexer.yycreate()) lexer.yylex(); return 0;}struct token{ Kind kind; char *name; token*next; int pos; token(Kind k=TYPE,char*n=NULL,token *behind=NULL,int p=0){ kind=k; name=new char[sizeof(n)+1]; strcpy_s(name,sizeof(n)+1,n); next=behind; pos=p; }};token *word_list=NULL;int idNum=0;int search(char*word){ token *tmp=word_list; for(;tmp!=NULL;tmp=tmp->next){ if(strcmp(tmp->name,word)==0) return tmp->pos; } return -1;//not found}int add_word(Kind type,char*word){ if(search(word)!=-1) return -1; token* tmp=new token(type,word,NULL,idNum); tmp->next=word_list; word_list=tmp; idNum+=1; return 1;}void deal(char*yytext){ int i=0; add_word(ID,yytext); i=search(yytext); cout << "ID " << yytext << " " << i << endl;}
0 0
- day11.09
- day11
- DAY11
- day11
- day11
- day11
- day11
- Day11
- day11
- day11
- day11
- day11
- day11
- Day11
- day11
- Day11
- day11
- Day11
- 在java中如何在非servlet的普通类中获取request、response、session
- Android中RxJava+Retrofit+MVP模式的整合(1)—目录设计
- C#/C++ 文件中插入数据和文件后添加数据的几种方法
- XML与JSON的解析
- (反向代理 + cache) varnish 使用 (实例)
- day11.09
- 苏嵌9 16.11.8
- 将现有的代码,推送到一个新的GitHub Repo中
- 建立虚拟机
- varnish 配置语言 VCL
- 1111. Online Map (30)
- Unity动画知识之二:Animator动画状态机
- ffmpeg音频编码
- HDU 1175 连连看 DFS+搜索+方向