记一次编译原理实验:
如果有问题或者建议可以留言,欢迎交流,不定时回复。
一.实验目的:
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程
语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分
析。
二.实验内容
1.要识别的词素:
(1)保留字或关键字:如:BEGIN、
END、VAR、INTEGER、REAL、
IF、
THEN、
READ、WRITE、WHILE。
(2)运算符: 如:+、-、*、/、:=、=、>、<、>=、<=
(3)标识符: 用户定义的变量名、常数名、过程名
(4)常数: 如:10、25、100、2.3 等整数或实数
(5)界符: 如:‘,’、‘.’ 、‘;’ 、‘(’ 、‘)’、‘{’、‘}’,‘:
由于没有学习PASCAL,在实验过程中以c语言的关键字和界符为准。
三.实验要求:
- 对单词的构词规则有明确的定义;
- 编写的分析程序能够正确识别源程序中的单词符号;
- 识别出的单词以<类别码,值>的形式保存并输出;
- 实验报告要求用自动机对词法定义做出详细说明,并给出词法分析程序的工作流程
四.实验步骤
1.先画出识别不同词素的自动机,再将其组合成一个大的自动机;
2.画出词法分析程序的工作流程图,编写程序。
3. 依次读入源程序符号,对源程序进行词素识别,直到源程序结束;
4. 对正确的单词,按照它的种别以<类别码,值>的形式输出;
思路如图:
五.程序及运行结果(或实验数据记录及分析)
* 种类: 标识码:
* 数字 0
* 关键字 1
* , 2
* ; 3
* ++ 4
* += 5
* + 6
* -- 7
* -= 8
* - 9
* *= 10
* * 11
* /= 12
* / 13
* >= 14
* > 15
* <= 16
* < 17
* == 18
* = 19
* ( 20
* ) 21
* {
22
* } 23
* [ 24
* ] 25
* 变量名 26
*/
实验代码:
#include <iostream>
#include <cstring>
using namespace std;
const char keyWord[15][20] = {
"main", "if", "else", "do", "while", "for", "switch",
"case", "int", "double", "float", "long", "void", "char", "return"};
int getFilePointer(const char *filename, FILE **file) {
*file = fopen(filename, "r");
if (*file == 0) {
return 0;
} else {
return 1;
}
}
void cleanBuffer(char *a) {
for (int i = 0; i < 20; ++i) {
a[i] = '\0'