词法分析c实现
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
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
1
17
If
2
:=
18
Then
3
<
20
wile
4
<>
21
do
5
<=
22
end
6
>
23
lettet(letter|digit)*
10
>=
24
dight dight*
11
=
25
+
13
26
14
(
27
*
15
)
28
/
16
#
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 <stdio.h>
#include <string.h>
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<8;m++)token[m++]=NULL;
    ch=prog[p++];
    m=0;
    while((ch==' ')||(ch=='\n'))ch=prog[p++];
    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
      { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
      {token[m++]=ch;
      ch=prog[p++];
      }
      p--;
      syn=10;
      for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0)
      { syn=n+1;
        break;
      }
      }
    else if((ch>='0')&&(ch<='9'))
      { while((ch>='0')&&(ch<='9'))
    { sum=sum*10+ch-'0';
      ch=prog[p++];
    }
    p--;
    syn=11;
      }
    else switch(ch)
    { case '<':token[m++]=ch;
          ch=prog[p++];
          if(ch=='=')
            {  syn=22;
              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;
一个完整的c语言程序    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;
            p--;
          }
          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;
          break;
    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)……  如图5-1所示:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。