词法分析程序源代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char TOken[10];//分开进行比较
char ch;
char r1[]={"auto"};
char r2[]={"break"};
char r3[]={"case"};
char r4[]={"char"};
char r5[]={"const"};
char r6[]={"continue"};
char r7[]={"default"};
char r8[]={"do"};
char r9[]={"double"};
char r10[]={"else"};
char r11[]={"enum"};
char r12[]={"extern"};
char r13[]={"float"};
char r14[]={"for"};
char r15[]={"goto"};
char r16[]={"if"};
char r17[]={"int"};
char r18[]={"long"};
char r19[]={"register"};
char r20[]={"return"};
char r21[]={"short"};
char r22[]={"signed"};
char r23[]={"sizeof"};
char r24[]={"static"};
char r25[]={"struct"};
char r26[]={"switch"};
char r27[]={"typedef"};
char r28[]={"union"};
char r29[]={"unsigned"};
char r30[]={"void"};
char r31[]={"volatile"};
char r32[]={"while"};
char r33[]={"end"};
char r34[]={"include"};
char r35[]={"stdio"};
char r36[]={"string"};
char r37[]={"main"};
char r38[]={"stdlib"};//这是我定义的
char A[10000];//输入的所有值
int syn,row;
int n,m,p,sum,j;
static int i = 0;
void scaner();
int main()
{
    row = 0 ;
    p = 0 ;
    printf("Please input string:(end of ‘@‘)\n");
    do
    {
        scanf("%c",&ch);
        A[p]=ch;
        p++;
    }//输入值到数组A【】中,以@结束
    while(ch!=‘@‘);
    do
    {
        scaner();//进入函数进行判定
        switch(syn)
        {
        case 40: printf("(%d,%d)\n",syn,sum); break;//如果是40,那么就是数字
        case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是@ 结束
        case -2: row=row++;break;
        default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词
        }
    }
    while (syn!=0);
}
void scaner()
{
    /*共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else */
    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 if(strcmp(TOken,r7)==0){syn=7;}
        else if(strcmp(r8,TOken)==0){syn=8;}
        else if(strcmp(r9,TOken)==0){syn=9;}
        else if(strcmp(r10,TOken)==0){syn=10;}
        else if(strcmp(r11,TOken)==0){syn=11;}
        else if(strcmp(r12,TOken)==0){syn=12;}
        else if(strcmp(r13,TOken)==0){syn=13;}
        else if(strcmp(r14,TOken)==0){syn=14;}
        else if(strcmp(r15,TOken)==0){syn=15;}
        else if(strcmp(r16,TOken)==0){syn=16;}
        else if(strcmp(r17,TOken)==0){syn=17;}
        else if(strcmp(r18,TOken)==0){syn=18;}
        else if(strcmp(r19,TOken)==0){syn=19;}
        else if(strcmp(r20,TOken)==0){syn=20;}
        else if(strcmp(r21,TOken)==0){syn=21;}
        else if(strcmp(r22,TOken)==0){syn=22;}
        else if(strcmp(r23,TOken)==0){syn=23;}
        else if(strcmp(r24,TOken)==0){syn=24;}
        else if(strcmp(r25,TOken)==0){syn=25;}
        else if(strcmp(r26,TOken)==0){syn=26;}
        else if(strcmp(r27,TOken)==0){syn=27;}
        else if(strcmp(r28,TOken)==0){syn=28;}
        else if(strcmp(r29,TOken)==0){syn=29;}
        else if(strcmp(r30,TOken)==0){syn=30;}
        else if(strcmp(r31,TOken)==0){syn=31;}
        else if(strcmp(r32,TOken)==0){syn=32;}
        else if(strcmp(r33,TOken)==0){syn=33;}
        else if(strcmp(r34,TOken)==0){syn=34;}
        else if(strcmp(r35,TOken)==0){syn=35;}
        else if(strcmp(r36,TOken)==0){syn=36;}
        else if(strcmp(r37,TOken)==0){syn=37;}
        else if(strcmp(r38,TOken)==0){syn=38;}
        else{syn=100;}    //变量名
    }
    else if((ch>=‘0‘&&ch<=‘9‘)) //数字
    {
        sum=0;
        while((ch>=‘0‘&&ch<=‘9‘))
        {
            sum=sum*10+ch-‘0‘;//显示其数字sum
            i++;
            ch=A[i];
        }
        syn=40;
    }
    else switch(ch) //其他字符
    {
case‘<‘:m=0;TOken[m]=ch;m++;
    i++;ch=A[i];
    if(ch==‘=‘)//<>为22
    {
        syn=41;
        TOken[m]=ch;m++;i++;
    }
    else
    {
        syn=46;
    }
    break;
case‘>‘:m=0;TOken[m]=ch;m++;
    i++;ch=A[i];
    if(ch==‘=‘)
    {
        syn=42;
        TOken[m]=ch;m++;i++;
    }
    else
    {
        syn=47;
    }
    break;
case‘:‘:m=0;TOken[m]=ch;m++;
    i++;ch=A[i];
    if(ch==‘=‘)
    {
        syn=44;
        TOken[m]=ch;m++;i++;
    }
    else
    {
        syn=49;
    }
    break;
case‘@‘:syn=0;
    TOken[0]=ch;
    i++;
    break;
case‘=‘:syn=48;
    TOken[0]=ch;
    i++;
    break;
case‘#‘:syn=50;
    TOken[0]=ch;
    i++;
    break;
case‘+‘:syn=50;
    TOken[0]=ch;
    i++;
    break;
case‘-‘:syn=51;
    TOken[0]=ch;
    i++;
    break;
case‘*‘:syn=52;
    TOken[0]=ch;
    i++;
    break;
case‘/‘:syn=53;
    TOken[0]=ch;
    i++;
    break;
case‘(‘:syn=54;
    TOken[0]=ch;
    i++;
    break;
case‘)‘:syn=55;
    TOken[0]=ch;
    i++;
    break;
case‘{‘:syn=56;
    TOken[0]=ch;
    i++;
    break;
case‘}‘:syn=57;
    TOken[0]=ch;
    i++;
    break;
case‘;‘:syn=58;
    TOken[0]=ch;
    i++;
    break;
case‘.‘:syn=59;
    TOken[0]=ch;
    i++;
    break;
case‘\‘‘:syn=60;
    TOken[0]=ch;
    i++;
    break;
case‘\n‘:
    syn=-2;
    break;
default: syn=-1;
    break;
    }
}

时间: 2024-10-12 21:55:54

词法分析程序源代码的相关文章

1022词法分析程序源代码

#include <stdio.h> #include <string.h> char prog[80],token[8],ch; //token是存放的字符串 ch是字符 prog是缓冲区int syn,p,m,n,sum; //syn是种别码 p是缓冲区prog的指针 m是token的指针 n是指针数组rwtab的下标 sum是存放整数型的字char *rwtab[6]={"begin","if","then",&qu

词法分析程序的实现

我们知道人类制造了计算机,计算机需要为我们的生活提供帮助,但是我们需要它帮助我们做什么.怎么做还是需要我们来告诉它,告诉它的过程就是通过一串又一串的字符串也就是代码来告诉它.但是代码对于计算机来说它还是不理解的,它只是辨识0与1而已,所以我们要进一步的将我们编写的程序代码进一步分解变化为机器码.在这过程中,使用的编译器就是完成这一工作的,词法分析程序就是其必不可少的部分. 词法分析是将输入的字符串以单词符号的结果进行输出,以下是便是关于词法规则和各种单词符号对应的种别码的相关图片 在这个词法分析

实验一 词法分析程序实验

实验一.词法分析程序实验 商业软件工程   蓝海鹏  201506110171 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 实验内容: 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)*(标识符) 10 >=

词法分析程序实验

一.词法分析程序的功能 输入一段字符串,从字符串表示的源程序中识别出具有独立意义的单词符号,根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号. 二.符号与种别码对照表 单词符号 种别码 单词符号 种别码 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

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

词法分析程序实验报告

实验一词法分析实验 商业软件工程2班  黄铭坤  201506110147 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 (1)   关键字: begin  if  then  while  do  end (2) 

词法分析程序新

词法分析程序的功能:提示用户输入一段需分析的源程序,然后程序读入该源程序的字符串进行词法分析,最后输出词法分析的结果显示在屏幕上.符号与种别码对照表:单词符号 种别码 单词符号 种别码begin     1        :          17if           2        :=        18then      3        <          20while      4       <=        22do         5 end       6    

词法分析程序(编译原理)

一:词法分析程序的功能: 输入单词串,以'begin'开始,以'#'结束.如果是文法正确的句子,则输出成功的信息:'输入单词串成功',否则返回错误提示. 例: 输入 begin a:=345 end # 输出 输入单词串成功 二:符号与种码对照表 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 <  20 while 4 <= 21 do 5 <>  22 end 6 >  23 l(l|d)* 10 >= 24 dd*

简单的词法分析程序

词法分析程序完成的是编译第一阶段的工作,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 我写的简单代码实现如下: #include<stdio.h>#include<string.h>#define N 80char word[6][10]={"begin","if","then","while","do","end"};vo