1、西安交大编译原理实验词法分析器文档以及代码最后实验一:词法分析器一、 实验目的:1强化对系统软件综合工程实现能力的训练;2加强对词法分析原理、方法和基本实现技术的理解;二、 实验内容:用C语言或者其他的高级语言作为宿主语言完成C1语言的词法分析器的设计和实现。 三、 实验要求:1. 编写C0语言的词法分析器的源程序并调试通过。其中词法分析程序既可以自己手动去完成,也可以利用LEX自动生成。2. 通过测试程序的验收; 3.实验报告按照提供的模板填写:(1)功能描述:该程序具有什么功能?(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;另外可以附加函数之间的调用关系图、程序总体执行
2、流程图。(3)实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?你的收获有哪些?四、 评判标准: 1. 输出正确的实验结果; 2. 代码清晰,格式良好; 3. 提交报告,报告阐述清楚。五、 程序工作说明:(以C0语言为例)程序的输入文件是任何一个目录下的文件格式的C0语言程序段。程序的输出文件是以xml格式表示的词法分析的结果。该输出将作为下个实验语法分析的输入文件。(注意:也可以自定义格式,但需要在报告中给出格式说明)词法分析结果输出成xml文件格式为程序输入/输出示例:如源程序为如下:1vo
3、id f1(int a,int b) 2 a = 1;3 b = a+b;45void main() 67 int a100;8 int b;9 float c;10 ab=a;11 if(cb)12 f1(a,b);13 14则要求得到如下输出文件: token line=11 type=LT string= 六、 相关知识:词法分析器任务:输入源程序;扫描、分解字符串,识别出一个个单词(定义符、标识符、运算符、界符、常数)。单词符号的表示:1) 需要对单词分类,每一个识别出来的单词都属于不同的类型 public enum TokenType /关键字 IF,ELSE,WHILE,RETUR
4、N,VOID,INT, /运算符 + - * / = = != PLUS,MINUS,STAR,SLASH, LT,LTEQ,GT,GTEQ,EQ,NEQ,ASSIGN, /界符 ; , ( ) /* */ SEMI,COMMA,LPAREN,RPAREN,LSQUAR,RSQUAR,LBRACE,RBRACE, LCOMMENT,RCOMMENT, ID, /标识符 NUMBER, /数字常量 IDletter(letter|didit)* NUMBERdigit digit * lettera|b|z|A|B|Z digit0|9 NONTOKEN,ERROR,ENDFILE / 其它 ;
5、2) 单词符号的数据结构设计public class Token string str; /单词字符串 TokenType ttype; /单词的类型 int line; /所在行号信息 3) 词法分析 状态转换图运行结果:程序代码:#include#include#include#includeusing namespace std;string judge1(char a,int n) string str; str.assign(a,n); if(!pare(if) return IF; else if(!pare(else) return ELSE; else if(!pare(whi
6、le) return WHILE; else if(!pare(return) return RETURN; else if(!pare(void) return VOID; else if(!pare(int) return INT; else if(!pare(float) return FLOAT; else if(!pare(char) return CHAR; return ;string judge2(char a,int n) string str; str.assign(a,n); if(!pare(+) return PLUS; else if(!pare(-) return
7、 MINUS; else if(!pare(*) return STAR; else if(!pare(/) return SLASH; else if(!pare(=) return EQ; else if(!pare() return LT; else if(!pare() return GT; else if(!pare(=) return GTEQ; else if(!pare(!=) return NEQ; else if(!pare(=) return DEQ; else if(!pare() return ASSIGN; else if(!pare(;) return SEMI;
8、 else if(!pare(,) return COMMA; else if(!pare() return LPAREN; else if(!pare() return RPAREN; else if(!pare() return LSQUAR; else if(!pare() return RSQUAR; else if(!pare() return LBRACE; else if(!pare() return RBRACE; else if(!pare(/*) return LCOMMENT; else if(!pare(*/) return RCOMMENT; return ;void
9、 print(char a,int n,int sign,int lin) string TokenType; cout token line=lin type=; if(sign=1) TokenType=judge1(a,n); if(TokenType=) TokenType=ID; coutTokenType string=; for(int i=0;in;i+) coutai; coutendl; else if(sign=2) TokenType=NUMBER; coutTokenType string=; for(int i=0;in;i+) coutai; coutendl;
10、else if(sign=3) TokenType=judge2(a,n); if(TokenType=) system(cls);coutsome sign error occurred! On line:linendl;_exit(0); coutTokenType string=; for(int i=0;in;i+) coutai; coutendl; int main() int lin=0,sign,t=0; char *check,word100; char content100; fstream out; out.open(file1.txt, ios:in); coutendl; cout=a&*check=A&*check=0&*check|*check=a&*check=A&*check=0&*check|*check=a&*check=A&*check=Z) coutvariable error occurred! on line lin=0&*check|*check=a&*check=A&*check=0&*check|*check=0) print(word,t,sign,lin); t=0; sign=0; break; check+; out.close(); coutendl; cin.get(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1