词法分析器实验报告

更新时间:2024-05-07 11:29:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验报告

实验目的: 1.掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 2.通过设计、编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中,将其分解为各类单词的词法分析方法。 3. 掌握根据程序的伪代码来编写程序模块程序源代码。 实验内容: 一 实验目的 4.掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。 5.通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 6.掌握根据程序的伪代码来编写程序模块程序源代码。 二 实验涉及到的知识要点 词法分析器的功能输入是源程序,输出单词符号。 词法分析可以采用如下两种处理结构: (1)把词法分析程序作为主程序; (2)把词法分析程序作为语法分析程序调用的子程序。 三 实验预习 (以把词法分析程序作为主程序为例) 程序语言的单词符号通常可以分以下五种:保留字、标识符、常数、运算符、界符。 语法分析程序输出的单词符号通常以二元式的形式表示: (单词种别,单词自身的值) 五 程序结构 CH Token GetCH( ) GetBC( ) Concat ( ) Letter( ) Digit( ) Reserve( ) Retract( ) 字符变量,用来存放最新读进的字符。 字符数组,存放构成单词的字符串。 字符数组,存放构成单词的字符串。 函数,检查CH中的字符是否为空格,若是,则调用GetCH直到CH中为一非空格。 函数,把CH中的字符连接到Token中。 函数,它们分别判断CH中的字符是否为字母和数字。 函数,对Token中的字符串查找关键字表,若它是一个关键字则回送相应内部编码,否则回送0。 函数,把源程序缓冲区指针回退一个字符位置,并把CH置空白。 第1页 共6页

Buildlist() Error() 将标识符登录到符号表或将常数登录到常数表。 出现非法字符,显示错误信息。 六 实验内容 题目:用以下语言词法构造规则,来构造词法分析器。词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。 词法规则要求: ①识别保留字:if、int、else、for、while、do、return、break、continue;单词种别码为1。 ②其他的都识别为标识符, 标识符由字母开头,后面可以是数字、字母和下划线;单词种别码为2。 ③常数为无符号整形数, 无符号的整数由数字开头,后面只包含数字;单词种别码为3。 ④运算符包括:+、-、*、/、=、>、<、>=、<=、<> ;单词种别码为4。 ⑤分隔符(界符)包括:,、;、{、}、(、); 单词种别码为5。 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如图: (2,”main”) (5,”(“) (5,”)“) (5,”{“) (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,” } “ ) 第2页 共6页

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

1、程序源代码:

#include \

#include \#include \#include \

char ch ; // 存放当前的输入字符 int lineno = 1; // 记录当前的行号

void main()//主函数 {

void Reserve(ifstream&);

ifstream fin(\用ifstream的对象fin打开input文件,文件不存在时,不创建

if (fin.fail()) cout << \找不到文件\ Reserve(fin);

fin.close(); //fout.close(); // ferr.close(); }

int judge(char *string) // 判断是否为关键字 {

char *keywords[1000]={\关键字表,按相应类型号排序

for(int i = 0;i <= 8;i++) //遍历keywords数组 { if (!strcmp(string,*(keywords+i))) { return 1; //是关键字,返回对应的类型值 } }

return 0; //不是关键字,返回0 }

void Reserve(ifstream &fin) //词法分析程序,用引用传递参数 {

char temp[100]; // 临时存放已读入但无法判断类型的字符 int j = 0;

int value_judge ;//存放函数judge的返回值 while (fin.get(ch))

第3页 共6页

{

if (ch == '\\n') {lineno += 1; }

else if (ch == '\\t'||ch == ' ') {} //排除制表、空格字符 else if (isalpha(ch)) //当前输入符为字母 { while (isalpha(ch)||isdigit(ch)) { temp[j] = ch; j++; fin.get(ch); } temp[j] = '\\0'; //标志字符串结束 j = 0; if (value_judge = judge(temp)) // 判断是否为关键字 { cout << \ << endl; } else cout << \ << endl; fin.seekg(-1,ios::cur); //回退1个字符 }

else if (isdigit(ch)) { while (isdigit(ch)) { temp[j] = ch; j++; fin.get(ch); } temp[j] = '\\0'; //标志字符串结束 j = 0; cout << \ << endl; fin.seekg(-1,ios::cur); //回退一个字符 }

//+、-、*、/、=、>、<、>=、<=、<>

else if (ch == '+') cout << \ << endl; else if (ch == '-') cout << \ << endl; else if (ch == '*') cout << \ << endl; else if (ch == '/') cout << \ << endl; else if (ch == '=') cout << \ << endl;

第4页 共6页

}

}

else if (ch == '>') cout << \ << endl; else if (ch == '<') cout << \ << endl; else if (ch == '>=') cout << \ << endl; else if (ch == '<=') cout << \ << endl; else if (ch == '<>') cout << \ << endl;

//,、;、{、}、(、)

else if (ch == ',') cout << \ << endl; else if (ch == ';') cout << \ << endl; else if (ch == '(') cout << \ << endl; else if (ch == ')') cout << \ << endl; else if (ch == '{') cout << \ << endl; else if (ch == '}') cout << \ << endl; ch = '\\0';

2、程序设计截图

第5页 共6页

3、程序运行结果截图

第6页 共6页

本文来源:https://www.bwwdw.com/article/4nxg.html

Top