代码改变世界

词法分析实验报告

2016-10-14 21:09  124杨锦达  阅读(341)  评论(2编辑  收藏  举报

实验一、词法分析实验

专业商业软件工程   姓名杨锦达  学号201506110124

一、 实验目的

编织一个词法分析程序

 

二、 实验内容和要求

内容:

对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,发现词法错误,则返回出错信息

 

要求:

---输入:源程序字符串

---输出:二元组(种别,单词本身)

---待分析语言的此法规则

      在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

  1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
  2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
  3. 运算符:+-*/=><>=<=!=
  4. 分隔符:,;{}()
  5. 常数,如1234587

 

三、 实验方法、步骤及结果测试

 

  1. 源程序名:编译原理实验报告 源程序名 词法分析.c

可执行程序名:编译原理实验报告.exe

     2.原理分析及流程图

 

       3.主要程序段及其解释:

#include<stdio.h>

#include<string.h>

void F(char c,char b);

void word(char a[]);

void number(char a[]);

int i; //定义全局变量i

int s=1; //用来记录是否存在非法字符

main(){

    char a[50];

    printf("\n请您输入需要分析的字符串:\n");

    gets(a);

printf("\n您要分析的字符串为:\n");

printf("\t%s",a);

printf("\n");

    for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++){

if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))

   word(a);

else if(a[i]>='0' && a[i]<='9')

number(a);

else

F(a[i],a[i+1]);

}

printf("\n");

 }

  

 void number(char a[]) //对数字字符进行扫描分析

 {

     char b[50];

 int m,k=0,t;

 m=i;

     while(a[m]>='0' && a[m]<='9')

 {

 b[k]=a[m]; //用数组b存放数组a中的数字

 k++;

 m++;

 }

 i=m-1;

 printf("(11,");

 for(t=0;t<k;t++)

 printf("%c",b[t]);

 printf(")");

 printf("\n");

 }

 

void word(char a[]) //对字母字符进行扫描分析,并识别保留字

{

int k=0,m,flag=0,t;

char b[50];

char *key[6]={"begin","if","then","while","do","end"};

m=i;

while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母

{

b[k]=a[m];

k++;

m++;

b[k]='\0';

}

    i=m-1;

    for(t=0;t<6;t++)

    {

if(strcmp(b,key[t])==0) //将数组b与关键字进行比较

{

printf("(%d,%s)",t+1,key[t]); //输出关键字

 

flag=1;

printf("\n");

}

}

    if(flag==0)

{

printf("(10,%s)",b); //输出标识符

printf("\n");

}

}

void F(char c,char b) //对特殊字符进行扫描分析

{

switch(c){

case '+':

printf("(13,+)\n");

break;

case '-':

printf("(14,-)\n");

break;

case '*':

        printf("(15,*)\n");

    break;

case '/':

printf("(16,/)\n");

break;

case ':':

if(b=='=')

{

            i++;

printf("(18,:=)\n");

}

else

            printf("(17,:)\n");

break;

case ' ':

break;

case '<':

if(b=='>')

{

i++;

printf("(21,<>)\n");

}

else if(b=='=')

{

i++;

printf("(22,<=)\n");

}

else

            printf("(20,<)\n");

break;

case '>':

if(b=='=')

{

            printf("(24,>=)\n");

            i++;

}

else

printf("(23,>)\n");

break;

case '=':

printf("(25,=)\n");

break;

case ';':

printf("(26,;)\n");

break;

case '(':

printf("(27,()\n");

break;

case ')':

printf("(28,))\n");

break;

case '#':

printf("(0,#)\n");

break;

default:

{

printf("\n存在字符 '%c',无法继续识别!\n",c);

s=0; //s=0记录存在非法字符

break;

}

}

 }

     4.运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

四、 实验总结

心得体会:实验一要理解并不是很难,但是其程序要为繁杂,需要对字符串逐个进行分析,这次的实验让我更加深刻的体会到了词法分析对于编程的重要性,并且懂得了编译原理的确是计算机领域的一大浪漫