实验报告
实验名称:词法分析程序的设计与实现 日期:2019年10月11日
一、实验内容
词法分析程序(Lexical Analyzer)要求:
- 从左至右扫描构成源程序的字符流
- 识别出有词法意义的单词(Lexemes)
- 返回单词记录(单词类别,单词本身)
- 滤掉空格
- 跳过注释
- 发现词法错误
程序结构:
输入:字符流(什么输入方式,什么数据结构保存)
处理:
–遍历(什么遍历方式)
–词法规则
输出:单词流(什么输出形式)
–二元组
单词类别:
1.标识符(10)
2.无符号数(11)
3.保留字(一词一码)
4.运算符(一词一码)
5.界符(一词一码)
单词符号 |
种别码 |
单词符号 |
种别码 |
begin |
1 |
: |
17 |
if |
2 |
:= |
18 |
then |
3 |
< |
20 |
while |
4 |
<= |
21 |
do |
5 |
<> |
22 |
end |
6 |
> |
23 |
l(l|d)* |
10 |
>= |
24 |
dd* |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
二、程序代码
#include <stdio.h> #include <string.h> #define norw 6 /*关键字个数*/ #define nmax 14 //number的最大位数 #define al 10 //符号的最大长度 FILE* fa1; //输出分析的文件和首地址 首地址是虚拟机指针 char ch; //getch读取的字符 char id[al+1]; //存放标识符和保留字 int num; int cc, ll; //cc表示当前字符的位置 char line[81]; //读取行缓冲区 char a[al+1]; //读取一个符号 暂时存在这里 char word[norw][al]; //保留字取6个 就是begin end if 什么的 FILE* fin; FILE* fout; char fname[al]; //输入的文件名 int err; #define getchdo if(-1==getch()) return -1; //如果能在缓冲区读入一个单词,那么返回值不为-1,如果失败,则返回-1.取下一个字符到ch void error(int n); void error(int n) { char space[81]; memset(space, 32, 81); space[cc-1] = 0; printf("****出现错误 "); fprintf(fa1, "****出现错误 "); err++; } int getch() { if(cc == ll) { if(feof(fin)) { printf(" 读完了! "); return -1; } ll = 0; cc = 0; ch = ' '; while(ch != 10) { if(fscanf(fin, "%c", &ch) == EOF) { line[ll] = 0; break; } printf("%c", ch); line[ll] = ch; ll++; } printf(" "); } ch = line[cc]; cc++; return 0; } int getsym() { int i, j, k; while(ch == ' ' || ch == 10 || ch == 9||ch== 13) { //忽略空格换行回车和tab getchdo; }//当时空格,换行,回车,tab时忽略掉,取下一个字符 if(ch >= 'a' && ch <= 'z') { k = 0; do { if(k < al) { a[k] = ch;//标识符或者保留字放在数组a中 k++; } getchdo; } while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9'); a[k] = '