1015词法分析

#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-08-22 20:42:14

1015词法分析的相关文章

简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)

说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到TokenList 语法分析 输出语法树 运行输出: 代码: main.cpp 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<vector> 4 #include<string.h> 5 using na

hiho 1015 KMP算法 &amp;&amp; CF 625 B. War of the Corporations

#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?” 小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就

词法分析实验报告

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

poj 1015

http://poj.org/problem?id=1015 题意:n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团,选出的m 个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int m,n; 6 int dp[30][805]; 7 int d[300],p[300]; 8 int path[10

BZOJ - 1015【并查集】

1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5721  Solved: 2639[Submit][Status][Discuss] Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道互相直 接或间接地连接. 但好景不长,很快帝国

实验报告-词法分析.c

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

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 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)