2024年5月25日发(作者:)
编译原理
词法分析
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
2.1 待分析的简单的词法
(1)关键字:
begin if then while do end
所有的关键字都是小写。
(2)运算符和界符
: = + - * / < <= <> > >= = ; ( ) #
(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:
ID = letter (letter | digit)*
NUM = digit digit*
(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符
和关键字,词法分析阶段通常被忽略。
2.2 各种单词符号对应的种别码:
表2.1 各种单词符号对应的种别码
单词符号
bgin
If
Then
wile
do
end
lettet(letter|digit)*
dight dight*
+
—
*
/
种别码
1
2
3
4
5
6
10
11
13
14
15
16
=
;
(
)
#
单词符号
:
:=
<
<>
<=
>
>=
种别码
17
18
20
21
22
23
24
25
26
27
28
0
2.3 词法分析程序的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如
下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
三、词法分析程序的C语言程序源代码:
#include
#include
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
scaner();
void scanner_example (FILE *fp);
main()
{
FILE *fp;
fp=fopen("D:","r");//打开文件
scanner_example (fp);
scaner();
}
void scanner_example (FILE *fp)
{
do
{
ch=fgetc (fp);
prog[p++]=ch;
}while (ch!='#');
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )n",sum,syn);
break;
case -1:printf("you have input a wrong stringn");
default: printf("( %-10s%5d )n",token,syn);
break;
}
}while(syn!=0);
}


发布评论