词法分析程序构造原理以及实现方法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在输入的txt:ceshi.txt中写入:< <> :=
在程序中输入文件名,程序运行完毕
在输出的jieguo.txt中显示出来二元组即为:(26,<)(28,<>)(30,:=)\
1.2
对字母的大小写不进行区分,所输出的二元组都是以小写形式输出。
1.3
当输入串为未定义的字符时,在输出文件中显示“不能识别的字符”。
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'-':
syn=18;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'*':
syn=19;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case';':
syn=20;
{
char arr[200];
char ch;
int i=0;//字符
int j=0;//数字
char* keyword[11]={"begin","end","if","then","else","for","do","while","and","or","not"};
int syn;
int
ch =tolower(ch);
}
arr[i]=ch;
i++;
ch =fgetc(fin);
if(ch==EOF){syb=0;break;}
}
printf("b");
fseek(fin,-1L,SEEK_CUR);
char* temp=(char*)malloc(i+1);
1
1.1
1.1.1
输入为一个写有字符串的txt文件。
程序读入txt文件,并进行操作。
1.1.2
输出为一个写有二元组(syn,String)的txt文件。
其中二元组(syn,String)
syn为单词符号的类别编码,
String为单词符号字符串
例:输入txt中含有:< <> :=
输出txt中二元组应为(26,<),(28,<>),(30,:=)
case'/':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =31;
fprintf(fout,"(%d,%c)",syn,ch);
break;
}
else{
if(ch=='*'){
syn =32;
fprintf(fout,"(%d,%s)",syn,"/*");
while(1){
memcpy(temp,arr,i);
temp[i]='\0';
i=0;
syn=15;
for(int n=0;n<11;n++)
{
if(strcmp(temp,keyword[n])==0)
{
syn=n+1;
break;
}
}
fprintf(fout,"(%d,%s)",syn,temp);
ch =fgetc(fin);
char* temp2=(char*)malloc(j+1);
memcpy(temp2,arr,j);
temp2[j]='\0';
j=0;
syn=16;
fprintf(fout,"(%d,%s)",syn,temp2);
if(syb==0){break;}
}
switch(ch){
case'+':
syn=17;
break;
}
else{
if(ch=='='){
syn =27;
fprintf(fout,"(%d,%s)",syn,"<=");
}
else if(ch=='>'){
syn =28;
fprintf(fout,"(%d,%s)",syn,"<>");
}
else{
fseek(fin,-2L,SEEK_CUR);
while(1) //判断是否读到末尾
{
ch =fgetc(fin);
if(feof(fin)){
syb=0;
break;
}
if(ch==' '||ch==''){
//
}
else if(isalpha(ch)){
printf("a");
ch =tolower(ch);
while(isalpha(ch)||isdigit(ch)){
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'>':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn=24;
fprintf(fout,"(%d,%c)",syn,ch);
break;
}
else{
if(ch=='='){
syn=25;
fprintf(fout,"(%d,%s)",syn,">=");
if(feof(fin)){
syb=0;
break;
}
}
else if(isdigit(ch)){
while(isdigit(ch)){
arr[j]=ch;
j++;
fscanf(fin,"%c",&ch);
if(feof(fin)){syb=0;break;}
}
fseek(fin,-1L,SEEK_CUR);
printf("输入文件名:");
scanf("%s",filename);
FILE *fin=fopen(filename,"r");
wordanalysis(fin,fout);
fclose(fout);
}
syn =26;
ch =fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
case':':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =29;
fprintf(fout,"(%d,%c)",syn,ch);
break;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'(':
syn=21;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case')':
syn=22;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'=':
syn=23;
}
else{
if(ch=='='){
syn =30;
fprintf(fout,"(%d,%s)",syn,":=");
}
else{
fseek(fin,-2L,SEEK_CUR);
syn =29;
ch=fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
3
3.1
单词符号
种别码
单词符号
种别码
begin
1
无符号整数
16
end
2
+
17
If
3
-
18
then
4
*
19
else
5
;
20
for
6
(
21
do
7
)
22
while
8
=
23
and
9
>
24
or
10
>=
25
not
11
<
26
标识符
15
<=
27
<>
28
:
29
:=
30
/
31
/*
32
3.2
3.2.1
3.2.2
4
4.1
1.beginEgib2876
}
else{
fseek(fin,-2L,SEEK_CUR);
syn=24;
ch=fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
case'<':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =26;
fprintf(fout,"(%d,%c)",syn,ch);
例如:当输入文件中有未定义的字符“#”的时候
输入文件如下:
1.4
当输入文件中出现了/*的字符串之后,程序会自动忽略之后的输入字符串,直到遇到*/。
例如:
当输入中含有/*的时候:
输入:
程序只会输出/*,之后的部分便会全部省略。
2
本程序仅由一个main函数组成,未定义以及调用子程序。
在程序中利用了字符数组来实现了输入字符串的读入。
2.+ - < <= >= := :#
3./*shdaohfoi*/shi
4.2
1.
2.
3.
5
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void wordanalysis(FILE *fin,FILE *fout)
}
break;
}
case'#':
fprintf(fout,"不能识别的字符。");
}
}
}
void main(){
int num=10;
char* filename=new char[100];
FILE *fout=fopen("jieguo.txt","w");
memset(filename,'\0',100);
ch =fgetc(fin);
if(feof(fin)){
break;
}
if(ch =='*'){
ch =fgetc(fin);
if(ch=='/'){
break;
}
}
}
}
else{
fseek(fin,-2L,SEEK_CUR);
syn =31;
ch =fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
在程序中输入文件名,程序运行完毕
在输出的jieguo.txt中显示出来二元组即为:(26,<)(28,<>)(30,:=)\
1.2
对字母的大小写不进行区分,所输出的二元组都是以小写形式输出。
1.3
当输入串为未定义的字符时,在输出文件中显示“不能识别的字符”。
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'-':
syn=18;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'*':
syn=19;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case';':
syn=20;
{
char arr[200];
char ch;
int i=0;//字符
int j=0;//数字
char* keyword[11]={"begin","end","if","then","else","for","do","while","and","or","not"};
int syn;
int
ch =tolower(ch);
}
arr[i]=ch;
i++;
ch =fgetc(fin);
if(ch==EOF){syb=0;break;}
}
printf("b");
fseek(fin,-1L,SEEK_CUR);
char* temp=(char*)malloc(i+1);
1
1.1
1.1.1
输入为一个写有字符串的txt文件。
程序读入txt文件,并进行操作。
1.1.2
输出为一个写有二元组(syn,String)的txt文件。
其中二元组(syn,String)
syn为单词符号的类别编码,
String为单词符号字符串
例:输入txt中含有:< <> :=
输出txt中二元组应为(26,<),(28,<>),(30,:=)
case'/':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =31;
fprintf(fout,"(%d,%c)",syn,ch);
break;
}
else{
if(ch=='*'){
syn =32;
fprintf(fout,"(%d,%s)",syn,"/*");
while(1){
memcpy(temp,arr,i);
temp[i]='\0';
i=0;
syn=15;
for(int n=0;n<11;n++)
{
if(strcmp(temp,keyword[n])==0)
{
syn=n+1;
break;
}
}
fprintf(fout,"(%d,%s)",syn,temp);
ch =fgetc(fin);
char* temp2=(char*)malloc(j+1);
memcpy(temp2,arr,j);
temp2[j]='\0';
j=0;
syn=16;
fprintf(fout,"(%d,%s)",syn,temp2);
if(syb==0){break;}
}
switch(ch){
case'+':
syn=17;
break;
}
else{
if(ch=='='){
syn =27;
fprintf(fout,"(%d,%s)",syn,"<=");
}
else if(ch=='>'){
syn =28;
fprintf(fout,"(%d,%s)",syn,"<>");
}
else{
fseek(fin,-2L,SEEK_CUR);
while(1) //判断是否读到末尾
{
ch =fgetc(fin);
if(feof(fin)){
syb=0;
break;
}
if(ch==' '||ch==''){
//
}
else if(isalpha(ch)){
printf("a");
ch =tolower(ch);
while(isalpha(ch)||isdigit(ch)){
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'>':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn=24;
fprintf(fout,"(%d,%c)",syn,ch);
break;
}
else{
if(ch=='='){
syn=25;
fprintf(fout,"(%d,%s)",syn,">=");
if(feof(fin)){
syb=0;
break;
}
}
else if(isdigit(ch)){
while(isdigit(ch)){
arr[j]=ch;
j++;
fscanf(fin,"%c",&ch);
if(feof(fin)){syb=0;break;}
}
fseek(fin,-1L,SEEK_CUR);
printf("输入文件名:");
scanf("%s",filename);
FILE *fin=fopen(filename,"r");
wordanalysis(fin,fout);
fclose(fout);
}
syn =26;
ch =fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
case':':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =29;
fprintf(fout,"(%d,%c)",syn,ch);
break;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'(':
syn=21;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case')':
syn=22;
fprintf(fout,"(%d,%c)",syn,ch);
break;
case'=':
syn=23;
}
else{
if(ch=='='){
syn =30;
fprintf(fout,"(%d,%s)",syn,":=");
}
else{
fseek(fin,-2L,SEEK_CUR);
syn =29;
ch=fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
3
3.1
单词符号
种别码
单词符号
种别码
begin
1
无符号整数
16
end
2
+
17
If
3
-
18
then
4
*
19
else
5
;
20
for
6
(
21
do
7
)
22
while
8
=
23
and
9
>
24
or
10
>=
25
not
11
<
26
标识符
15
<=
27
<>
28
:
29
:=
30
/
31
/*
32
3.2
3.2.1
3.2.2
4
4.1
1.beginEgib2876
}
else{
fseek(fin,-2L,SEEK_CUR);
syn=24;
ch=fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);
}
break;
}
case'<':
fscanf(fin,"%c",&ch);
if(feof(fin)){
syn =26;
fprintf(fout,"(%d,%c)",syn,ch);
例如:当输入文件中有未定义的字符“#”的时候
输入文件如下:
1.4
当输入文件中出现了/*的字符串之后,程序会自动忽略之后的输入字符串,直到遇到*/。
例如:
当输入中含有/*的时候:
输入:
程序只会输出/*,之后的部分便会全部省略。
2
本程序仅由一个main函数组成,未定义以及调用子程序。
在程序中利用了字符数组来实现了输入字符串的读入。
2.+ - < <= >= := :#
3./*shdaohfoi*/shi
4.2
1.
2.
3.
5
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void wordanalysis(FILE *fin,FILE *fout)
}
break;
}
case'#':
fprintf(fout,"不能识别的字符。");
}
}
}
void main(){
int num=10;
char* filename=new char[100];
FILE *fout=fopen("jieguo.txt","w");
memset(filename,'\0',100);
ch =fgetc(fin);
if(feof(fin)){
break;
}
if(ch =='*'){
ch =fgetc(fin);
if(ch=='/'){
break;
}
}
}
}
else{
fseek(fin,-2L,SEEK_CUR);
syn =31;
ch =fgetc(fin);
fprintf(fout,"(%d,%c)",syn,ch);