0917词法分析

#include<stdio.h>
#include<string.h>//strcmp()用于比较两个字符串
#include<conio.h>//getch()
#define max 200
char pro[max], lin[20];
int  n,i,syn;
char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" };   // 关键字,特殊标识符
char   ch ;
scaner( )
{
    int j=0;
    for ( n=0; n<20; n++ )
        lin[n]=NULL;                                //临时数组初始化
    ch=pro[i++];                                    //读取字符串
    while (ch==‘ ‘)                                 //判断,跳过空字符  
        ch=pro[i++];       //读取整个单词
    if  ((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))   //判断是否是字母或数字
    {
        if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘))                   //判断标示符和特殊关键字                      
        {
            lin[j++]=ch;
            ch=pro[i++];   //pro[i++]空,关键字
            while((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=48&&ch<=57))//判断标识符
            {
                lin[j++]=ch;
                ch=pro[i++];   
            }
            lin[j]=‘\0‘;   //结束标志,回车
            i--;
            syn=10;        //单词种别码
            for (n=0;n<6 ;n++ )
                if(strcmp(lin,word[n])==0) //查找关键字表是否符合
                {      
                    syn=n+1;
                    break ;
                }
        }
        else               //判断数字
        {  
            while (ch>=48&&ch<=57)
            {
                lin[j++]=ch;
                ch=pro[i++];  
            }
            i--;
            lin[j]=‘\0‘;
            syn=11;
        }
    }
    else           //判断其它符号
    {
                    //判断<,<=,<>
        if(ch==‘<‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘>‘)
            {  
                syn=21;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else if(ch==‘=‘)
            {  
                syn=22;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=20;
                lin[j]=‘\0‘;
                i--;
            }
        }
                   ///判断>,>=
        else if(ch==‘>‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘=‘)
            {
                syn=24;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=23;
                lin[j]=‘\0‘;
                i--;
            }
        }
                   //判断 :,:=
        else if(ch==‘:‘)
        {
            lin[j++]=ch;
            ch=pro[i++];
            if (ch==‘=‘)
            {
                syn=18;
                lin[j++]=ch;
                lin[j]=‘\0‘;
            }
            else
            {
                syn=17;
                lin[j]=‘\0‘;
                i--;
            }
        }
                  ///判断其它符号
        else if(ch==‘+‘)
        {
            syn=13;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘-‘)
        {
            syn=14;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘*‘)
        {
            syn=15;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘/‘)
        {
            syn=16;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘=‘)
        {
            syn=25;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘;‘)
        {
            syn=26;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘(‘)
        {
            syn=27;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘)‘)
        {
            syn=28;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else if(ch==‘#‘)
        {
            syn=0;
            lin[j++]=ch;
            lin[j]=‘\0‘;
        }
        else
            syn=-1;      
}
return syn;
}
void read()   //定义从文件读入数据函数
{
    int k;
    for(k=0;k<max-1;k++)
    {
        scanf("%c",&pro[k]);
    }
    pro[k]=‘\0‘;
}
void main()
{      
    int i=0 ;
   printf( "Please input source code:\n" );
   do{
       ch=getchar();//读入字符串
       pro[i++]=ch;
   }while(ch!=‘#‘);//将所读字符串存入数组pro[],直到遇到#
   i=0;

do
   {     
       scaner();
       switch(syn)
       {
       case 11:   printf ("(%d,%s)\n",syn,lin);
           break;
       case -1:  printf("错误符号\n");
           break;     
       default:   printf ("(%d,%s)\n",syn,lin);
       }
   } while (syn!=0);
   getch();
}

时间: 2024-12-14 09:50:59

0917词法分析的相关文章

0917 词法分析程序(java版)

1.程序说明: c语言和java两个版本的都做了一次,略作比较后觉得虽然用的语言不一样,但是中心思想都是一样的.本程序(java版)思路是先把源代码程序存入一个大字符串中, 然后分析该字符串,按照不同的词法分拆成一个个小字符串存到一个字符串数组中去,接着识别一些关键词,并对应相应的种别码,利用循环体一一列出.而对于c语言的 版本,笔者的思路是:由于C语言没有字符串类型,所以先把源代码输入到一个字符数组中去,然后按照词法截取单词或符号,逐一存到一个结构体数组中去,由于需要一 个个字符操作,要用到较

0917 词法分析

#include<stdio.h> #include<string.h> char input[200]; char token[5]; char ch; int p; int fg; int num; char index[6][6]={"begin","if","then","while","do","end"}; main() { p=0; printf(&

0917 实验一 词法分析 已修改

#include <stdio.h> #include <string.h> #include <iostream.h> #define BEGIN 1 #define IF 2 #define THEN #define WHILE 4 #define DO 5 #define END 6 #define INT 11 #define LT 20 #define LE 21 #define EQ 24 #define NE 22 #define GT 12 #defin

0917 实验一词法分析程序

#include <stdio.h>#include <string.h>int Input1(char a){ int i=0; switch(a) { case('+'):  printf("%c\t   13\n",a);i++;break; case('-'):  printf("%c\t   14\n",a);i++;break; case('*'):  printf("%c\t   15\n",a);i++;b

0917 实验一 词法分析程序

#include <stdio.h> #include <string.h> #include <iostream.h> #define BEGIN 1 #define IF 2 #define THEN 3 #define WHILE 4 #define DO 5 #define END 6 #define INT 11 #define LT 20 #define LE 21 #define EQ 24 #define NE 22 #define GT 12 #def

0917.小组词法分析

#include<stdio.h> #include<string.h> char input[200];//存放输入字符串 char token[5];//存放构成单词符号的字符串 char ch; //存放当前读入字符 int p; //input[]下标 int fg; //switch标记 int num; //存放整形值 //二维字符数组,存放关键字 char index[6][6]={"begin","if","then

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

词法分析

词法分析 #include<stdio.h> #include<string.h> void main() { int i=0,j,k=0,state=1,f=0,linenum=1; char a[11][10]={"const","var","call","begin","if","while","do","odd",&

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>