[工学]编译原理上机指导.doc

上传人:音乐台 文档编号:1977929 上传时间:2019-01-27 格式:DOC 页数:92 大小:745.47KB
返回 下载 相关 举报
[工学]编译原理上机指导.doc_第1页
第1页 / 共92页
[工学]编译原理上机指导.doc_第2页
第2页 / 共92页
[工学]编译原理上机指导.doc_第3页
第3页 / 共92页
亲,该文档总共92页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[工学]编译原理上机指导.doc》由会员分享,可在线阅读,更多相关《[工学]编译原理上机指导.doc(92页珍藏版)》请在三一文库上搜索。

1、第一部分 词法分析实验一、简单的扫描器设计一、实验目的:熟悉并实现一个简单的扫描器二、实验内容:1 设计扫描器的自动机;2 设计翻译、生成Token的算法;3 编写代码并上机调试运行通过。要求:输入源程序文件;输出(1)相应的Token序列; (2)关键字、界符表,符号表,常数表。三、扫描器设计:扫描器 单词 Token1 自动机: 空 l/d 关键字表和界符表 l -1 单词 编码 d program 3 d -1 procedure 4 begin 5 + end 6 while 7 * do 8 + 9 : = * 10 : 11 -1 := 12 = 13 , 14 , ; 15 -1

2、 2 关键字表和界符表:四、程序实现:1数据结构:char ch; /当前字符char strToken; /当前单词char *keywords=“program”, “procedure”, “begin”,; /关键字表、界符表char ID; /符号表int Cons; /常数表struct TokenType int code,value; struct TokenType Token; /Token数组2算法设计:1 初始化;2 滤除空格,读取第一个非空字符到ch;3 if (ch是一个字母) 4 处理关键字或标识符;5. else if (ch是一个数字) 6. 处理常数; el

3、se 7. 处理界符或错误处理;3算法求精:step2 : ch=GetChar(); /读取当前字符到ch while (ch= )ch=GetChar();step3: int IsLetter(char ch) /判断ch是否为字母 if (ch是AZ或az) return 1;else return 0;step4:4.1 在strToken中拼成一个单词; /拼关键字或标识符4.2 code=Reserve(strToken); /查关键字表; if (!code) /未查到,是一个标识符 4.3 value=InsertID(strToken); /将strToken中的单词插入到

4、符号表中4.4 生成并输出一个标识符Token; else4.5 生成并输出一个关键字Token;step5: int IsDigit(char ch) /判断ch是否为数字 if (ch是09) return 1;else return 0;step6:6.1 在strToken中拼成一个单词; /拼常数6.2 value=InsertConst(strToken); /将strToken中的单词插入到常数表中6.3 生成并输出一个常数Token;step7:7.1 将ch中的字符拼接到strToken中; if (ch=:) 7.2 处理双界符“:=”;7.3 code:=Bound(st

5、rToken); /查界符表 if (!code) /未查到 ProcError(); /错误处理 else7.4 生成并输出一个界符Token;step4.1: while (IsLetter(ch)|IsDigit(ch) Concat(); /将ch中的字符拼接到strToken中 ch=GetChar();step4.2: int Reserve(char *strToken) /用strToken中的单词去查关键字表。查到了,则返回该关键字的编码;/否则,返回0 int i=0; while (iN) /设N为关键字表中元素的个数 if (!strcmp(keywordsi, str

6、Token) return (i+3); i+; return 0; step4.3: int InsertID(char *strToken) /用strToken中的单词去查符号表。查到了,则返回该单词在表中的位置值;/否则,将strToken中的单词插入符号表的尾部,并返回位置值 int i=0; while (im) /设m为符号表中已有的标识符的个数 if (!strcmp(IDi, strToken) return i; i+; strcpy(IDi,strToken); m+; return i; step4.4: Tokeni.code=1; Tokeni.value=valu

7、e; Print(Tokeni+); /输出Tokenstep4.5: Tokeni.code=code; Tokeni.value=-1; Print(Tokeni+); /输出Tokenstep6.2: int InsertConst(char *strToken) /用strToken中的单词去查常数表。查到了,则返回该单词在表中的位置值;/否则,将strToken中的单词插入常数表的尾部,并返回位置值 int i=0; int num; num=trans(strToken); /将常数串转换为数字 while (i=A & ch=a & ch=0 & ch=9) return 1;

8、else return 0;int Reserve(char *strToken) /用strToken中的单词去查关键字表。查到了,则返回该关键字的编码; /否则,返回0 int i=0; while (iN) /设N为关键字表中元素的个数 if (!strcmp(keywordsi, strToken) return (i+3); i+; return 0;int InsertID(char *strToken) /用strToken中的单词去查符号表。查到了,则返回该单词在表中的位置值; /否则,将strToken中的单词插入符号表的尾部,并返回位置值 int i=0; while (i

9、m) /设m为符号表中已有的标识符的个数 if (!strcmp(IDi, strToken) return i; i+; strcpy(IDi,strToken); m+; return i;int trans(char *str)int num,i;num=i=0;while (stri)num=10*num+stri+-48;return num;int InsertConst(char *strToken) /用strToken中的单词去查常数表。查到了,则返回该单词在表中的位置值; /否则,将strToken中的单词插入常数表的尾部,并返回位置值 int i=0; int num;

10、num=trans(strToken); /将常数串转换为数字 while (in) /设n为常数表中已有的常数的个数 if (Consi=num) return i; i+; Consi=num; n+; return i;int main(int argc, char* argv) char line= while (x1=10) do y:=x1;int i_line;char ch; /当前字符 char strToken15; /当前单词int i_str; struct TokenType Token50; /Token数组 int code,value; int i; i=0;

11、i_line=0;ch=linei_line+; /读取当前字符到ch while (ch) i_str=0; while (ch= ) ch=linei_line+; if (IsLetter(ch) while (IsLetter(ch)|IsDigit(ch) /拼关键字或标识符 strTokeni_str+=ch; /将ch中的字符拼接到strToken中 ch=linei_line+; i_line-; /Retract()strTokeni_str=0; code=Reserve(strToken); /查关键字表; if (!code) /未查到,是一个标识符 value=Ins

12、ertID(strToken); /将strToken中的单词插入到符号表中 Tokeni.code=1; Tokeni.value=value; Print(Tokeni+); /输出Token else Tokeni.code=code; Tokeni.value=-1; Print(Tokeni+); /输出Token else if (IsDigit(ch) / 处理常数; while (IsDigit(ch) /拼常数 strTokeni_str+=ch; /将ch中的字符拼接到strToken中 ch=linei_line+; i_line-; /Retract() strToke

13、ni_str=0; value=InsertConst(strToken); /将strToken中的单词插入到常数表中 Tokeni.code=2; Tokeni.value=value; Print(Tokeni+); /输出Token else / 处理界符或错误处理; strTokeni_str+=ch; /将ch中的字符拼接到strToken中; if (ch=:) / 处理双界符:=; ch=linei_line+; if (ch=) strTokeni_str+=ch; else i_line-; /回溯一个字符 strTokeni_str=0; code=Reserve(str

14、Token); /查界符表 if (!code) /未查到 ProcError(); /错误处理 else /生成并输出一个界符Token; Tokeni.code=code; Tokeni.value=-1; Print(Tokeni+); /输出Token ch=linei_line+; printf(n); for (i=0;im;i+)printf(%s ,IDi);printf(n); for (i=0;in;i+)printf(%d ,Consi);printf(n);printf(Hello World!n);return 0;实验二、扫描器类的设计一、二、三、同实验一。四、程序

15、设计:数据结构:struct TokenType /Token类型 int code,value; ; struct SemRecord /符号表记录类型 char name15; SemRecord ID10; /符号表 int m=0; /标识符个数 int Cons10; /常数表 int n=0; /常数个数TokenType Token; /Tokenclass Scan /扫描器类 private: char *keywordsN; /关键字表、界符表 char line50; int i_line; char ch; /当前字符 char strToken15; /当前单词 in

16、t i_str; int code,value; int i; SemRecord *p_ID; /符号表指针 int *p_m; int *p_Cons; /常数表指针 int *p_n;public:Scan();Scan(SemRecord *p1,int *p2,int *p3,int *p4);void Read(TokenType *token); /read(w)private: void ProcError(); int IsLetter(char ch); int IsDigit(char ch); int Reserve(char *strToken); int Inser

17、tID(char *strToken); int trans(char *str); int InsertConst(char *strToken);Scan sExam(ID,&m,Cons,&n); /扫描器类对象五、源程序代码/scaner.h扫描器类设计#define N 15char KeysN15=program,procedure,begin,end,while,do,+,*,:,:=,=,;,(,);struct TokenType /Token类型 int code,value; ;struct SemRecord /符号表记录类型 char name15;class Sca

18、n /扫描器类 private: char *keywordsN; /关键字表、界符表 char line50; int i_line; char ch; /当前字符 char strToken15; /当前单词 int i_str; int code,value; int i; SemRecord *p_ID; /符号表指针 int *p_m; int *p_Cons; /常数表指针 int *p_n;public:Scan();Scan(SemRecord *p1,int *p2,int *p3,int *p4);void Read(TokenType *token); /read(w)p

19、rivate: void ProcError(); int IsLetter(char ch); int IsDigit(char ch); int Reserve(char *strToken); int InsertID(char *strToken); int trans(char *str); int InsertConst(char *strToken);Scan:Scan(SemRecord *p1,int *p2,int *p3,int *p4) p_ID=p1; p_m=p2; p_Cons=p3; p_n=p4; int i; for (i=0;i=A & ch=a & ch

20、=0 & ch=9) return 1; else return 0;int Scan:Reserve(char *strToken) /用strToken中的单词去查关键字表。查到了,则返回该关键字的编码; /否则,返回0 int i=0; while (iN) /设N为关键字表中元素的个数 if (!strcmp(keywordsi, strToken) return (i+3); i+; return 0;int Scan:InsertID(char *strToken) /用strToken中的单词去查符号表。查到了,则返回该单词在表中的位置值; /否则,将strToken中的单词插入

21、符号表的尾部,并返回位置值 int i=0; while (iname, strToken) return i; i+; strcpy(p_ID+i)-name,strToken); (*p_m)+; return i;int Scan:trans(char *str)int num,i;num=i=0;while (stri)num=10*num+stri+-48;return num;int Scan:InsertConst(char *strToken) /用strToken中的单词去查常数表。查到了,则返回该单词在表中的位置值; /否则,将strToken中的单词插入常数表的尾部,并返回位置值 int i=0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1