编译原理课程设计-词法分析器设计(C语言)

实验任务:完成下述文法所描述的单词符号的词法分析程序。
<标识符>--><字母>|<标识符><字母>|<标识符><数字>
<无符号整数>--><数字>|<无符号整数><数字>
<分界符>-->+|-|*|/|;|(|)|{|}|<|<=|=|!=|>=|>|:=|<空格>
<字母>-->a|…|z|A|…|Z
<数字>-->0|…|9
<空格>-->’ ’
说明:
(1) 假定该语言对字母的大小写不敏感,由指定文件读入预分析的源程序,分析结果再写入指定文件;
(2) 假定语言的关键字为"begin","if","end","else","then","for","while","to","do","and","not","or","write";
程序的功能描述
从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
本程序规定输出用KeyWord代表关键字,Word代表普通标识符,Digit代表阿拉伯数字,SingleWord代表单分界符,DoubleWord代表双分界符,ERROR代表无法识别的字符。
例如读入下面一段程序:
if(i>1)
return 1;
else
return 0;
输出结果为:
KeyWord if
SingleWord (
Word i
SingleWord >
Digit 1
SingleWord )
Word return
Digit 1
SingleWord ;
KeyWord else
Word return
Digit 0
SingleWord ;

#include "stdio.h"                  /*定义I/O库所用的某些宏和变量*/

#include "string.h"                 /*定义字符串库函数*/

#include "conio.h"                  /*提供有关屏幕窗口操作函数*/

#include "ctype.h"                  /*分类函数*/

char prog[80]={'\0'},

     token[8];                     /*存放构成单词符号的字符串*/

char ch;

int syn,                           /*存放单词字符的种别码*/

      n,

    sum,                           /*存放整数型单词*/

    m,p;                           /*p是缓冲区prog的指针,m是token的指针*/

char *rwtab[6]={"begin","if","then","while","do","end"};

void scaner(){

    m=0;

    sum=0;

    for(n=0;n<8;n++)

        token[n]='\0';

    ch=prog[p++];

    while(ch==' ')

        ch=prog[p++];

    if(isalpha(ch))    /*ch为字母字符*/{

        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/{

           token[m++]=ch;

           ch=prog[p++];}

        token[m++]='\0';

        ch=prog[p--];

        syn=10;

        for(n=0;n<6;n++)

            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/{

                syn=n+1;

                break;}}

    else

        if(isdigit(ch))    /*ch是数字字符*/{

            while(isdigit(ch))    /*ch是数字字符*/{

                sum=sum*10+ch-'0';

                ch=prog[p++];}

            ch=prog[p--];

            syn=11;}

        else

            switch(ch){

                case'<':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='>'){

                            syn=21;

                            token[m++]=ch;}

                        else if(ch=='='){

                            syn=22;

                            token[m++]=ch;}

                            else{

                                 syn=20;

                                 ch=prog[p--];}

                        break;

                case'>':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='='){

                            syn=24;

                            token[m++]=ch;}

                        else{

                            syn=23;

                            ch=prog[p--];}

                        break;

             case':':m=0;token[m++]=ch;ch=prog[p++];

                     if(ch=='='){

                         syn=18;

                         token[m++]=ch;}

                     else{

                         syn=17;

                         ch=prog[p--];}

                     break;

             case'+':syn=13;token[0]=ch;break;

             case'-':syn=14;token[0]=ch;break;

             case'*':syn=15;token[0]=ch;break;

             case'/':syn=16;token[0]=ch;break;

             case'=':syn=25;token[0]=ch;break;

             case';':syn=26;token[0]=ch;break;

             case'(':syn=27;token[0]=ch;break;

             case')':syn=28;token[0]=ch;break;

             case'#':syn=0;token[0]=ch;break;

             default:syn=-1;}}

main()

{

    printf("\n\nThe significance of the figures:\n"

           "1.figures 1 to 6 said Keyword\n"

           "2.figures 10 and 11 said Other indicators\n"

           "3.figures 13 to 28 said Operators\n");

    

p=0;

    printf("\nplease input string:\n");

    do {

           ch=getchar();

           prog[p++]=ch;

       }while(ch!='#');

     

p=0;

    do{

        scaner();

        switch(syn){

            case 11: printf("(%d,%d)\n",syn,sum);break;

            case -1: printf("\n ERROR;\n");break;

            default: printf("(%d,%s)\n",syn,token);

}

     }while(syn!=0);

    getch();

}

程序测试结果

对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下图5-1所示:

 

具体的你在修改修改吧

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-03
定义:
词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
(1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符 如+、-、*、/等等。
(5) 界符 如逗号、分号、括号、等等。
输出:
词法分析器所输出单词符号常常表示成如下的二元式:
(单词种别,单词符号的属性值)
单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。
示例:
比如如下的代码段:
while(i>=j) i--
经词法分析器处理后,它将被转为如下的单词符号序列:
<while, _>
<(, _>
<id, 指向i的符号表项的指针>
<>=, _>
<id, 指向j的符号表项的指针>
<), _>
<id, 指向i的符号表项的指针>
<--, _>
<;, _>

词法分析分析器作为一个独立子程序
词法分析是编译过程中的一个阶段,在语法分析前进行。词法分析作为一遍,可以简化设计,改进编译效率,增加编译系统的可移植性。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
相似回答