实验项目一指导(上)词法分析程序的设计与实现

上传人:M****1 文档编号:492457640 上传时间:2023-09-19 格式:DOC 页数:6 大小:26KB
返回 下载 相关 举报
实验项目一指导(上)词法分析程序的设计与实现_第1页
第1页 / 共6页
实验项目一指导(上)词法分析程序的设计与实现_第2页
第2页 / 共6页
实验项目一指导(上)词法分析程序的设计与实现_第3页
第3页 / 共6页
实验项目一指导(上)词法分析程序的设计与实现_第4页
第4页 / 共6页
实验项目一指导(上)词法分析程序的设计与实现_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《实验项目一指导(上)词法分析程序的设计与实现》由会员分享,可在线阅读,更多相关《实验项目一指导(上)词法分析程序的设计与实现(6页珍藏版)》请在金锄头文库上搜索。

1、实验项目一指导(上) 词法分析程序的设计与实现开发与测试建议:按模块,逐步地增量开发,尽早测试模块数据结构设计 属性字定义返回结果:行号,二元形式序列各类表1) 机内表示对照表(即各符号的分类编号,请参看教材p91的表3-4)2) 标识符表(即自定义的各种变量和函数,需要根据文法检测是否有错误,文法 ID=letter(letter| digit)*)3) 关键字表4) 整数表(暂不考虑实数,文法 NUM=digit digit *)各类表的查询程序思路:1)用map结构 2)switch case 或者if else 3)一维数组,写一个搜索程序源文件结构:1. 头文件word_scanne

2、r.h 存放数据结构和各函数模块的声明;注意,不要在头文件内定义变量或者写出函数的具体定义,否则可能导致连接LINK错误。2. 源文件word_scanner.cpp 存放各函数的具体定义3. 主程序文件scanner.cpp 用来调用和测试各模块实现词法分析的程序,以函数的形式放在word_scanner.h和word_scanner.cpp中。好处有二:1)先声明再使用函数,不用担心调用前没有声明;2)方便复用代码/word_scanner.h 文件内容示例#ifndef WORD_SCANNER_H /防止被嵌套include#define WORD_SCANNER_H#include

3、#include #include #include using namespace std; /如果没有此语句会如何?/=/基本数据结构/=/属性字,结构为二元组(类别,值)typedef struct /int isSpecial; /是否特殊符号/int isOperator; /是否操作符号/int priority_level; /操作符优先级int class_id; /分类编号string value; /符号值 Attrib_words;/枚举类型定义的示例/*typedef enum SYMBOL nul, eof, plus, minus, times, slash, lp

4、aren, rparen, comma, semicolon, period, becomes, eql, neq, lss, gtr, leq, geq, number, ident, beginsym, callsym, constsym, dosym, endsym, ifsym, oddsym, proceduresym, readsym, thensym, varsym, whilesym, writesym SYMBOL; */怎样建属性值表,怎样查表?/ (10, +), (11, for), (2, variable一般变量)/=/基本功能声明/=/*函数1:读程序源文件,提取

5、文本文件中的信息,结果放入字符串缓冲区*/ void ReadSourcefile();/函数2:分词模块,从位置begin_position开始,从缓冲区内取出一个词/参数end_position返回结束位置,可作为下一次取词的开始位置string getToken( string strLine, int begin_position, int &end_position );/函数3:词法分析主程序/返回:标识符表,即所有的自定义变量与函数都放入同一个表内/token统一的中间表示形式void word_Scanner( string strBuffer );/判断是不是空格、回车、换行

6、符bool IsBlankchar(char ch);/判断是不是字母 bool IsLetter(char ch);/判断是不是数字 bool IsDigital(char ch);/判断是不是下划线 bool IsUnline(char ch);/*这个函数用来除去字符串中连续的空格和换行第一个参数为目标字符串,第二个参数为开始位置/返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/ int DeleteNull(string str,int i); /=/查表函数/=/*判断位置i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(stri

7、ng str,int i); /*判断位置i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i); /*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKeywords(string str); #endif/=/word_scanner.cpp 部分内容示例#include stdafx.h#include word_scanner.h/全局变量,字符串缓冲区数组,每行代码的字符串为数组中一个元素vector fileBuffer;/=/基本功能/=/判断是不是空格、回车、换行符bool

8、 IsBlankchar(char ch) if(ch=n|ch=t|ch= ) return true; return false; /判断是不是字母 bool IsLetter(char ch) if(ch=a&ch=A&ch=Z) return true; return false; /判断是不是数字 bool IsDigital(char ch) /自己完成 /判断是不是下划线 bool IsUnline(char ch) /自己完成 /*提取文本文件中的信息,结果放入字符串缓冲区*/ void ReadSourcefile() string file_name; coutfile_n

9、ame; ifstream infile(file_name.c_str(),ios:in); /* c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 */ if (!infile) cerr无法打开文件! file_name.c_str() !endl; exit(-1); coutendl; string buffer;while (getline(infile,buffer) coutbufferendl;

10、 fileBuffer.push_back(buffer); /存入全局变量缓冲区内infile.close(); /=/查表函数/为了简化代码,表可以用静态数组实现/=/*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i) int t; char arr11=,;,(,), , ., , ; for (t=0;t11;t+) if(stri=arrt) return true; return false; /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i) int t; char arr10=+,-,*,/,=,|, &, !; for (t=0;t10;t+) if(stri=arrt) return true; return false; /*此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假*/ bool IsKeywords(string str) /自己完成,建议使用string类型及其方法 /=/测试程序/=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题 > 初中试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号