天天看點

詞法分析

  • 實驗一 詞法分析程式

一、實驗目的:

加深對詞法分析器的工作過程的了解;

加強對詞法分析方法的掌握。

二、實驗内容:

用C語言實作簡單的詞法分析程式;

能夠使用自己編寫的分析程式對簡單的程式段進行詞法分析。

三、實驗要求:

  1. 輸入源程式。
  2. 對源程式進行掃描與分解。 
  3. 按照詞法規則,正确識别源程式中的單詞符号;
  4. 識别出的單詞以<種别碼,值>的形式輸出;
  5. 對于源程式中的詞法錯誤,能夠做出簡單的錯誤處理,給出簡單的錯誤提示,保證順利完成整個源程式的詞法分析。

三、簡單進階語言

為友善同學們完成程式設計任務,我們定義了一個簡單版本的進階語言。

該語言包含的單詞符号、對應的種别碼如下表所示:

單詞符号 種别碼
begin 1 : 17
if 2 := 18
then 3 20
while 4 <= 21
do 5 <>  22
end 6 23
l(l|d)* 10 >= 24
dd* 11 = 25
+ 13 ; 26
- 14 ( 27
* 15 ) 28
/ 16 #

#include <stdio.h>

#include <string.h>

#include <stdlib.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;

    scaner();

    switch(syn)

     {case 11:printf("( %-10d%5d )\n",sum,syn);

          break;

      case -1:printf("you have input a wrong string\n");

          getchar();

          exit(0);

      default: printf("( %-10s%5d )\n",token,syn);

      }

    }while(syn!=0);

    getchar();

 }

 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--;

     case '>':token[m++]=ch;

          if(ch=='=')

            { syn=24;

              token[m++]=ch;

            { syn=23;

              p--;

     case '+': token[m++]=ch;

          if(ch=='+')

            { syn=17;

            { syn=13;

     case '-':token[m++]=ch;

          if(ch=='-')

            { syn=29;

            { syn=14;

     case '!':ch=prog[p++];

           { syn=21;

             token[m++]=ch;

           }

          { syn=31;

             p--;

          }

     case '=':token[m++]=ch;

            { syn=25;

            }

            { syn=18;

     case '*': syn=15;

           token[m++]=ch;

           break;

     case '/': syn=16;

     case '(': syn=27;

           token[m++]=ch;

     case ')': syn=28;

     case '{': syn=5;

     case '}': syn=6;

     case ';': syn=26;

          token[m++]=ch;

     case '\"': syn=30;

     case '#': syn=0;

     case ':':syn=17;

    default: syn=-1;

    token[m++]='\0';

結果:

詞法分析