PL/0 词法分析器设计 c语言

来源:互联网 发布:电话转接软件 编辑:程序博客网 时间:2024/04/28 10:06

【实验内容】

用C余元编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序风格成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常熟以及界符)输出。


运行效果:

    


基本思路:

1、读取所有的输入的文本,存入一个二维数组。(数组的宽度固定)

2、对二维数组一行行进行处理

3、对文本进行操作的时候,创建两个临时字符数组,一个存储变量名,一个存储常量。

对某行进行遍历的时候,倘若碰到字母,就读完该单词并存储到临时数组里,进行基本字判断后输出。

光标往后移动该单词的长度后,继续循环。(比如读到的是end,那么我该行的光标就要+3,然后继续循环)

倘若读到数字也是一样,只是不需要判断基本字,所以更为简单。



代码:

#include"stdio.h"#include"string.h"#define lineLength 100  //固定每行的长度#define primLength 10   //读取的字符串的长度(标识符之类)#define numLength 20    //读取的常量的长度//存储基本字char mPrimary[14][20]= {"begin","call","const","do","end","if","odd",                        "procedure","read","then","var","while","write","xujiajia"                       };char text[lineLength][lineLength];//存储读到的内容int listLength;//保存读取到的内容的长度void read(){    //把所有的数据读入一个二维字符数组中    for(int i=0,isEnd=0;; i++)    {        char my[lineLength];        gets(my);        for(int j=0; j<lineLength; j++)        {            text[i][j]=my[j];            //判断数组一行是否结束            if(my[j]=='\0')                break;            else if(my[j]=='.')            {                isEnd=1;                break;            }        }        if(isEnd)        {            listLength=i;            break;        }    }    //对二维字符数组进行处理    for(int i=0,isEnd=0; i<=listLength; i++)    {        char prim[primLength];//新建一个字符数组用来存储基本字或者变量名        char num[numLength];//新建一个字符数组用来存储常量        for(int k=0; k<primLength; k++) //清空数组            prim[k]='\0';        for(int k=0; k<numLength; k++) //清空数组            num[k]='\0';        for(int j=0; text[i][j]!='\0'; j++)        {            if(text[i][j]=='.')            {                printf(". 界符\n");                isEnd=1;                break;            }            else if(text[i][j]==' ')            {                continue;            }            else if(text[i][j]>='a'&&text[i][j]<='z')            {                for(int k=0; (text[i][j]>='a'&&text[i][j]<='z')||(text[i][j]>='0'&&text[i][j]<='9'); j++,k++) //读入字符串                    prim[k]=text[i][j];                j--;//由于用j去判断循环的结束,此处需要回退一个字符                for(int k=0; prim[k]!='\0'; k++) //输出字符串                    printf("%c",prim[k]);                int ii=0,jj=13;//二分查找,查找是否为基本字                int kk;                while(ii<=jj)                {                    kk=(ii+jj)/2;                    if(strcmp(prim,mPrimary[kk])<=0)                        jj=kk-1;                    if(strcmp(prim,mPrimary[kk])>=0)                        ii=kk+1;                }                if(ii-1>jj)//搜索成功,确定为基本字                    printf(" 基本字\n");                else                    printf(" 标识符\n");                for(int k=0; prim[k]!='\0'; k++) //清空数组方便下次读入                    prim[k]='\0';            }            else if(text[i][j]>='0'&&text[i][j]<='9')            {                for(int k=0; text[i][j]>='0'&&text[i][j]<='9'; j++,k++)//读入数字                    num[k]=text[i][j];                j--;//由于用j去判断循环的结束,此处需要回退一个字符                for(int k=0; num[k]!='\0'; k++) //输出数字,并且清空方便下次读入                {                    printf("%c",num[k]);                    num[k]='\0';                }                printf(" 常量\n");            }            else//此处处理“+-*/,#()等”            {                switch(text[i][j])                {                case '<':                case '>':                case ':':                {                    if(text[i][j+1]=='=')                    {                        printf("%c%c 运算符\n",text[i][j],text[i][j+1]);                        j++;                    }                    else                    {                        printf("%c 运算符\n",text[i][j]);                    }                    break;                }                case '+':                case '-':                case '*':                case '/':                {                    printf("%c 运算符\n",text[i][j]);                    break;                }                case '(':                case ')':                case ',':                case ';':                {                    printf("%c 界符\n",text[i][j]);                    break;                }                default:                    printf("%c 标识符\n",text[i][j]);                }            }        }        if(isEnd)            break;    }}int main(){    read();    return 0;}


 

2 0