词法分析程序(C)

#include <stdio.h>
#include <string.h>  

char string[80],word[8],ch;
int type,p,i,n,sum;
char keyword[][6]={"begin","if","then","while","do","end"};    //关键字数组

void scaner(void);  

main()
{
    p=0;
    printf("\n\n请输入一个程序段(以‘#‘结束):\n");
    do{
            scanf("%c",&ch);
            string[p++]=ch;
    }while(ch!=‘#‘);
     printf("单词符号\t种别码 \n");
    p=0;
    do{
            scaner();
            switch(type)
            {
                case 11:
                    printf("   %-10d%5d\n",sum,type);
                break;
                case -1:
                    printf("有无法识别的字符\n");
                    return 0;
                break;
                default:
                printf("   %-10s%5d \n",word,type);
                break;
            }
        }while(type!=0);
 }  

void scaner(void)
{
    sum=0;
    for(i=0;i<8;i++)
       word[i++]= NULL;  

    ch=string[p++];
    i=0;  

    while((ch==‘ ‘)||(ch==‘\n‘))
        ch=string[p++];  

    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
     {
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
        {
            word[i++]=ch;
            ch=string[p++];
        }

     p--;
     type=10;                     //先将以字母开头的字符识别为标识符

        for(n=0;n<6;n++)
        if(strcmp(word,keyword[n])==0)    //关键字数组比较,相同则表示为关键字,种别码即为下标值加一
        {
            type=n+1;
            break;
        }
    }                                   

    else if((ch>=‘0‘)&&(ch<=‘9‘))
     {
        while((ch>=‘0‘)&&(ch<=‘9‘))
        {
            sum=sum*10+ch-‘0‘;    //将字符型转化为整形sum
            ch=string[p++];
        }
        p--;
        type=11;
     }  

    else                   //else语句内识别除关键字、标识符、数字以外的其他字符
    {
        switch(ch)
        {
        case ‘+‘:
            type=13;
            word[i++]=ch;
        break;  

        case ‘-‘:
            type=14;
            word[i++]=ch;
        break; 

         case ‘*‘:
            type=15;
            word[i++]=ch;
        break;  

        case ‘/‘:
            type=16;
            word[i++]=ch;
        break;  

        case ‘:‘:
            word[i++]=ch;
            ch=string[p++];
         if(ch==‘=‘)
           {
               type=18;
               word[i++]=ch;
           }
            else
            {
                type=18;
                p--;
            }
        break; 

        case ‘<‘:
            word[i++]=ch;
            ch=string[p++];
            if(ch==‘=‘)
            {
                type=21;
                word[i++]=ch;
            }
            else
            {
                type=20;
                p--;
            }
        break;  

        case ‘>‘:
            word[i++]=ch;
            ch=string[p++];
            if(ch==‘=‘)
            {
                type=24;
                word[i++]=ch;
            }
            else
            {
                type=23;
                p--;
            }
        break;

        case ‘=‘:
                type=25;
                word[i++]=ch;
        break;  

        case ‘;‘:
            type=26;
            word[i++]=ch;
        break;  

        case ‘(‘:
            type=27;
            word[i++]=ch;
        break;  

        case ‘)‘:
            type=28;
            word[i++]=ch;
        break;  

        case ‘#‘:
            type=0;
            word[i++]=ch;
        break;  

        default:
            type=-1;
        break;
        }
    }
        word[i++]=‘\0‘;                      //word字符数组变字符串
}
时间: 2024-12-16 13:40:11

词法分析程序(C)的相关文章

实验一词法分析程序

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

1014 编写完词法分析程序的感想

经过几个星期的努力,总算把词法分析的程序给完成了,总的来说这是一个坚苦而又漫长的过程.是啊,读了那么多年的书,编写词法分析程序可是第一次呀!看着劳动成果,很欣慰!虽然这不是我一个人做的,是大家的共同努力得来的. 几个星期前,当听到老师布置给我们的这个题目时,我们都蒙了,这么难的题目我们怎么会啊!毕竟我们对那个一无所知,对于老师上课的讲解还能听懂,不过理论与实践之间还是有鸿沟的.我们私下都表示不满,抗议,可是一切都是徒劳,所以我们只能尽我们自己最大的努力把程序给写出来. “也许完成不了!”两个星期

编写词法分析程序

Note: 这学期修了严厉的Mr.J的编译原理,不定期更新笔记! 欢迎指正! TEST 语言的词法规: 标识符:字母打头,后接任意字母或数字 保留字:标识符的子集,包括:if,else,for,while,do, int,write,read, 无符号整数:由数字组成,但最高位不能为0,允许一位的0, 分界符:(.).;.{.} 运算符:+.-.*./.=.<.>.>=.<=.!=.== 注释符:/* */ 正则表达式: 标识符:        ( a|b|--|z|A|B--|Z

词法分析程序的实现

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

实验报告一 词法分析程序

实验一.词法分析程序实验 专业:商业软件工程   姓名:卓润峰  学号:201506110202 一.        实验目的 编制一个词法分析程序. 二.        实验内容和要求 1.输入:源程序字符串. 2.输出:二元组(种别,单词本身) 3.待分析语言的词法规则 主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析 三.        实验方法.步骤及结果测试 1.     源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:

编译原理小作业词法分析程序

词法分析程序所参照的编码如70页表3.3 (<编译技术>张莉等著.--北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0) 用Java语言实现如下: 1 import java.io.IOException; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 import java.util.Map; 5 6 class Code{ 7 public static final int BEGINSY