ZCminus语言词法分析器实验报告413Word文件下载.docx
- 文档编号:20757519
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:16
- 大小:229.43KB
ZCminus语言词法分析器实验报告413Word文件下载.docx
《ZCminus语言词法分析器实验报告413Word文件下载.docx》由会员分享,可在线阅读,更多相关《ZCminus语言词法分析器实验报告413Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
void
while共6个,所有的关键字都是保留字,并且必须是小写。
标识符:
识别与C语言词法要求相一致的标识符,通过下列正则表达式定义:
ID
=
letter
(letter
|
digit)*。
常数:
NUM
digit
digit*(.digit
digit*
|ε)(e(+
-
|ε)
|ε),letter
a|..|z|A|..|Z|,digit
0|..|9,包括整数,如123等。
小数,如123.45等。
科学计数法表示的常数,如1.23e3,2.3e-9等。
专用符号:
+
*
/
<
>
==
!
(
)
[
]
{
}
/*
*/。
2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。
3、词法分析器应当能够指出源程序中的词法不对,如不可识别的符号、不对的词法等。
四、实验结果(程序)及分析
#include<
stdio.h>
stdlib.h>
string.h>
#define
N
100
typedef
struct
char
name[30];
code;
addr;
}token;
//存储刚从文件中读取的字符
}Keyword;
}symbol;
Keyword
key[6]={{"
else"
1},{"
if"
2},{"
int"
3},{"
return"
4},{"
void"
5},{"
where"
6}};
ch;
//接受字符
FILE
*source;
//源文件
*keytxt;
//关键字输出文件
*badgetxt;
//标识符输出文件
*othertxt;
//其他单词输出文件
*number;
error_count;
//不对的个数
addr_count;
//标识符表的指针
lineof;
//行号
token
current;
//
暂时存放读入的字符
zancun;
symbol
currentsymbol;
symboltable[N];
//标识符表
error(int
i);
main()
scan();
error_count=0;
addr_count=0;
lineof=0;
scan()
i=0;
iskeyword();
//判断关键字
isOthers()
//判断其他单词
output_1();
output_2();
output_others();
//其他单词输出文件
Iszhushi();
isnumber();
if((source=fopen("
Source.txt"
"
r"
))==NULL){
//打开源文件
printf("
file
open
error/n"
);
exit(0);
if((keytxt=fopen("
key.txt"
w"
//打开关键字文件
if((badgetxt=fopen("
badge.txt"
//打开标识符文件
if((othertxt=fopen("
others.txt"
))==NULL)
error\n"
if((number=fopen("
number.txt"
ch=fgetc(source);
while(ch!
=EOF)
{
for(i=0;
i<
30;
i++)
current.name[i]='
\0'
;
if((ch>
='
a'
&
ch<
z'
||(ch>
A'
Z'
||
ch=='
_'
)
if(ch=='
\\'
if(ch>
0'
9'
else
isOthers();
fclose(source);
fclose(keytxt);
fclose(badgetxt);
fclose(othertxt);
fclose(number);
iskeyword(){
i=0,k=0,j=0;
h=0;
while(((ch>
(ch<
))
||((ch>
(ch>
'
current.name[i]=ch;
i++;
}
zancun=current;
6;
i++)
for(j=0;
j<
j++)
if(current.name[j]==key[i].name[j]){
else{
h=1;
break;
if(h==0)
if(h==0){
current.code=key[i].code;
strcpy(symboltable[addr_count].name,current.name);
symboltable[addr_count].code=10;
symboltable[addr_count].addr=addr_count;
addr_count++;
isOthers(){
ch1;
i;
switch(ch){
case
+'
:
current.name[0]='
current.code=13;
current.addr=-1;
-'
current.code=14;
*'
current.code=15;
/'
current.code=16;
case'
ch1=fgetc(source);
if(ch1=='
){
current.name[1]='
current.code=17;
fseek(source,-1,1);
current.code=18;
current.code=19;
}else{
current.code=20;
){
current.code=21;
}else
current.code=22;
current.code=23;
}else{
current.code=24;
current.code=25;
'
current.code=26;
('
i=ftell(source);
ch1=ch;
ch2;
)'
current.name[0]=ch1;
current.name[1]=ch;
current.code=27;
fseek(source,i,0);
ch2=fgetc(source);
error_count++;
error
(1);
{'
current.code=28;
}'
['
current.code=29;
]'
10'
lineof++;
Iszhushi()
for(;
if(ch==EOF)
error
(2);
isnumber()
k=0;
output_number();
while(ch>
current.name[k++]=ch;
current.code=11;
output_1()
关键字:
%s,%d>
"
current.name,current.code);
putchar(10);
fprintf(keytxt,"
output_2()
标识符地址:
current.name,addr_count);
fprintf(badgetxt,"
output_others()
其它单词:
fprintf(othertxt,"
i)
switch(i){
1:
界符发生不对,发生在第%d行/n"
lineof);
2:
注释发生不对,发生在第%d行/n"
output_number()
常数<
\n"
fprintf(number,"
实验结果分析,程序运行结果截图:
关键字输出文件:
标识符输出文件:
数字的输出文件
其它单词输出文件:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZCminus 语言 词法 分析器 实验 报告 413