词法分析器实验报告1

标签:
词法分析器it |
分类: c和c 知识和代码 |
词法分析器实验报告
一.目的与要求:通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解后各类单词的词法分析方法。
二.实验内容:
对于如下文法所定义的PASCAL语言子集,试编写并上机调试一个词法分析程序:
<程序>→PROGRAM
<分程序>→<变量说明>BEGIN<语句表>END
<变量说明>→VAR<变量表>:<类型>;|
<变量表>→<变量表>,<变量>
<类型>→INTEGER
<语句表>→<语句表>;<语句>
<语句>→<赋值语句>
<赋值语句>→<变量>:=<算术表达式>
<条件语句>→IF<关系表达式>THEN<语句>ELSE<语句>
<WHILE语句>→WHILE<关系表达式>DO<语句>
<复合语句>→BEGIN<语句表>END
<过程定义>→PROCEDURE<标识符><参数表>;
BEGIN<语句表>END
<参数表>→(<标识符表>)|
<标识符表>→<标识符表>,<标识符>
<算术表达式>→<算术表达式>+<项>
<项>→<项>*<初等量>
<初等量>→(<算术表达式>)|
<关系表达式>→<算术表达式><关系符><算术表达式>
<变量>→<标识符>
<标识符>→<标识符><字母>
<无符号数>→<无符号数><数字>
<关系符>→=
<字母>→A
<数字>→0
<所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式。)。对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。
为便于查看由词法(一)单词的分类:构造上述语言中的各类单词符号及其分类码表如下:
单词符号 |
类别码 |
单词符号 |
类别码 |
main |
1 |
= |
10 |
int |
2 |
<> |
11 |
if |
3 |
> |
12 |
then |
4 |
>= |
13 |
return |
5 |
, |
14 |
标识符 |
6 |
; |
15 |
整数 |
7 |
|
|
< |
8 |
|
|
<= |
9 |
|
|
(二)状态转移矩阵
|
l |
d |
非l和d |
非d |
< |
= |
> |
非= |
非=和> |
其他 |
0 |
1 |
3 |
|
|
5 |
9 |
10 |
|
|
13 |
1 |
1 |
1 |
2 |
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
3 |
|
3 |
|
4 |
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
6 |
7 |
|
8 |
|
6 |
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
8 |
|
|
|
|
|
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
11 |
|
12 |
|
|
11 |
|
|
|
|
|
|
|
|
|
|
12 |
|
|
|
|
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
|
|
(三)词法分析过程
四、词法分析程序的功能
输入:所给文法的原程序字符串。
输出:二元数组。
如:main()
输出结果为:
(1,
error!
error!
(17,
(2,
(6,x)
(14,,)
(6,y)
(15,;)
(6,x)
(13,>=)
(6,return)
(15,;)
(18,})
五.源程序
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
char
int
}
void
}
void
}
main()
{
}
六.函数说明
1.
2.
3.
4.fseek(fp,-1,1)
5.isalpha(ch)
6.isalnum(h)
7.isdigit(ch)
8.fgetc(fp)
9.fopen
七.实验结果及截图