词法分析
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
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 各种单词符号对应的种别码:
输入:所给文法的源程序字符串。
输出:二元组(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)……
三、词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:
主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:
Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};
图1-1
(2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想:
首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。
图 1-2
四、词法分析程序的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(); main() {p=0;
printf("\n please input a string(end with '#'):/n"); do{
scanf("%c",&ch); 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 string\n"); getch(); exit(0);
default: printf("( %-10s%5d )\n",token,syn); break; }
}while(syn!=0); getch(); }
scaner() { sum=0;
for(m=0;m
while((ch==' ')||(ch=='\n'))ch=prog[p++];
if(((ch='a'))||((ch='A')))
{ while(((ch='a'))||((ch='A'))||((ch>='0')&&(ch
for(n=0;n
if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } }
else if((ch>='0')&&(ch='0')&&(ch
else switch(ch)
{ case '
token[m++]=ch; } else
{ syn=20; p--;
} break;
case '>':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24;
token[m++]=ch; } else
{ syn=23; p--; } break;
case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17;
token[m++]=ch; } else
{ syn=13; p--; } break;
case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29;
token[m++]=ch; } else
{ syn=14; p--; } break;
case '!':ch=prog[p++]; if(ch=='=') { syn=21;
token[m++]=ch; } else
{ syn=31;
}
break;
case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25;
token[m++]=ch; } else
{ syn=18; p--; } break; case '*': syn=15;
token[m++]=ch; break; case '/': syn=16;
token[m++]=ch; break; case '(': syn=27;
token[m++]=ch; break; case ')': syn=28;
token[m++]=ch; break; case '{': syn=5;
token[m++]=ch; break; case '}': syn=6;
token[m++]=ch; break; case ';': syn=26;
token[m++]=ch; break; case '\"': syn=30;
token[m++]=ch; break; case '#': syn=0;
token[m++]=ch; break; case ':':syn=17;
token[m++]=ch;
default: syn=-1; break; }
token[m++]='\0'; }
五、结果分析:
输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图1-3所示:
图5-1
六、总结:
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。
词法分析
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
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 各种单词符号对应的种别码:
输入:所给文法的源程序字符串。
输出:二元组(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)……
三、词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图:
主程序示意图如图3-1所示。其中初始包括以下两个方面: ⑴ 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:
Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};
图1-1
(2)程序中需要用到的主要变量为syn,token和sum 3.2 扫描子程序的算法思想:
首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图1-2所示。
图 1-2
四、词法分析程序的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(); main() {p=0;
printf("\n please input a string(end with '#'):/n"); do{
scanf("%c",&ch); 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 string\n"); getch(); exit(0);
default: printf("( %-10s%5d )\n",token,syn); break; }
}while(syn!=0); getch(); }
scaner() { sum=0;
for(m=0;m
while((ch==' ')||(ch=='\n'))ch=prog[p++];
if(((ch='a'))||((ch='A')))
{ while(((ch='a'))||((ch='A'))||((ch>='0')&&(ch
for(n=0;n
if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } }
else if((ch>='0')&&(ch='0')&&(ch
else switch(ch)
{ case '
token[m++]=ch; } else
{ syn=20; p--;
} break;
case '>':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24;
token[m++]=ch; } else
{ syn=23; p--; } break;
case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17;
token[m++]=ch; } else
{ syn=13; p--; } break;
case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29;
token[m++]=ch; } else
{ syn=14; p--; } break;
case '!':ch=prog[p++]; if(ch=='=') { syn=21;
token[m++]=ch; } else
{ syn=31;
}
break;
case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25;
token[m++]=ch; } else
{ syn=18; p--; } break; case '*': syn=15;
token[m++]=ch; break; case '/': syn=16;
token[m++]=ch; break; case '(': syn=27;
token[m++]=ch; break; case ')': syn=28;
token[m++]=ch; break; case '{': syn=5;
token[m++]=ch; break; case '}': syn=6;
token[m++]=ch; break; case ';': syn=26;
token[m++]=ch; break; case '\"': syn=30;
token[m++]=ch; break; case '#': syn=0;
token[m++]=ch; break; case ':':syn=17;
token[m++]=ch;
default: syn=-1; break; }
token[m++]='\0'; }
五、结果分析:
输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)…… 如图1-3所示:
图5-1
六、总结:
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。