2016.9.30词法分析程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016.9.30词法分析程序相关的知识,希望对你有一定的参考价值。

单词符号

种别码

单词符号

种别码

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

#

0

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
char TOken[10];//分开进行比较 
char ch;

char r1[]={"begin"};
char r2[]={"if"};
char r3[]={"then"};
char r4[]={"while"};
char r5[]={"do"};
char r6[]={"end"};


char A[10000];//输入的所有值 
int syn,row;
int n,m,p,sum,j;
static int i = 0;
void scaner();

main()
{ 
    row = 0 ;
    p = 0 ;
    printf("请输入字符串:(#为结束)\\n");
    do
    {
        scanf("%c",&ch);
        A[p]=ch;
        p++;
    }//输入值到数组A【】中,以#结束 
    while(ch!=#);
    do
    {
        scaner();//进入函数进行判定 
        switch(syn)
        {
        case 11: printf("(%d,%d)\\n",syn,sum); break;//如果是11,那么就是数字 
        case 0: printf("(%d,%c)\\n",syn,TOken[0]);break;//如果是0,那么是# 结束 
        case -2: row=row++;break;
        case -1:break;
        default: printf("(%d,%s)\\n",syn,TOken);break;//否则,就是变量名、关键词 
        }
    }
    while (syn!=0);
}


void scaner()
{
    for(n=0;n<7;n++) 
        TOken[n]=0;//每次循环完就清零 
    ch=A[i];
    while(ch== ||ch==\\n)//如果字符是空格或者回车,跳过 
    {
        i++;
        ch=A[i];
    }
    if((ch>=a&&ch<=z)||(ch>=A&&ch<=Z)) //可能是标示符或者变量名 
    {
        m=0;
        while((ch>=0&&ch<=9)||(ch>=a&&ch<=z)||(ch>=A&&ch<=Z))//找到一个变量名或者关键字,直到遇到空格为止 
        {
            TOken[m]=ch;m++;
            i++;ch=A[i];
        }
        TOken[m]=\\0;//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2...... 
        if(strcmp(TOken,r1)==0){syn=1;}
        else if(strcmp(TOken,r2)==0){syn=2;}
        else if(strcmp(TOken,r3)==0){syn=3;} 
        else if(strcmp(TOken,r4)==0){syn=4;}
        else if(strcmp(TOken,r5)==0){syn=5;}
        else if(strcmp(TOken,r6)==0){syn=6;}
        else{syn=10;}    //变量名 
    }
    else if((ch>=0&&ch<=9)) //数字 
    {
        sum=0;
        while((ch>=0&&ch<=9))
        {
            sum=sum*10+ch-0;//显示其数字sum 
            i++;
            ch=A[i];
        }
        syn=11;
    }
    else switch(ch) //其他字符 
    {
case<:
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch===)
    {
        syn=21;
        TOken[m]=ch;
        m++;
        i++;
    }
    else if(ch==>) 
    {
        syn=22;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=20;
    }break;
case>:
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch===)
    {
        syn=24;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=23;
    }break;
case::
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch===)
    {
        syn=18;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=17;
    }break; 
case+:syn=13;TOken[0]=ch;i++;break; 
case-:syn=14;TOken[0]=ch;i++;break;
case*:syn=15;TOken[0]=ch;i++;break;
case/:syn=16;TOken[0]=ch;i++;break; 
case=:syn=25;TOken[0]=ch;i++;break;
case;:syn=26;TOken[0]=ch;i++;break;
case(:syn=27;TOken[0]=ch;i++;break;
case):syn=28;TOken[0]=ch;i++;break; 
case#:syn=0;TOken[0]=ch;i++;break; 
case\\n:syn=-2;break;
default:syn=-1;
    }
}

 技术分享

 

以上是关于2016.9.30词法分析程序的主要内容,如果未能解决你的问题,请参考以下文章

2016.9.30词法分析程序

编译原理 实验一 java语言实现对C语言词法分析

编译原理 实验一 java语言实现对C语言词法分析

词法分析

词法编辑器(Java)

词法分析程序的实现