第五次作业
此程序要逐个检查运行情况,并能当场补全代码。
词法分析程序(Lexical Analyzer)要求:
- 从左至右扫描构成源程序的字符流
- 识别出有词法意义的单词(Lexemes)
- 返回单词记录(单词类别,单词本身)
- 滤掉空格
- 跳过注释
- 发现词法错误
程序结构:
输入:字符流(什么输入方式,什么数据结构保存)
处理:
–遍历(什么遍历方式)
–词法规则
输出:单词流(什么输出形式)
–二元组
单词类别:
1.标识符(10)
2.无符号数(11)
3.保留字(一词一码)
4.运算符(一词一码)
5.界符(一词一码)
| 单词符号 | 种别码 | 单词符号 | 种别码 | 
| begin | 1 | : | 17 | 
| if | 2 | := | 18 | 
| then | 3 | < | 20 | 
| while | 4 | <= | 21 | 
| do | 5 | <> | 22 | 
| end | 6 | > | 23 | 
| l(l|d)* | 10 | >= | 24 | 
| dd* | 11 | = | 25 | 
| + | 13 | ; | 26 | 
| - | 14 | ( | 27 | 
| * | 15 | ) | 28 | 
| / | 16 | # | 0 | 
代码部分:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char prog[80],word[8],ch;
char *tag[6]={"begin","if","then","while","do","end"};
int syn,i,j,p,sum,row,y;
void getsyn(){
    for(i=0;i<8;i++)
        word[i]=NULL;
    ch=prog[p++]; 
    while(ch==' '){
        ch=prog[p]; 
        p++;
    }
    //标识符
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        j=0;
    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        word[j++]=ch;
        ch=prog[p++];
    }
    word[j++]='\0';
    p--;
    syn=10;
    for(i=0;i<6;i++){
        if(strcmp(tag[i],word)==0){
            syn=i+1;
            break;
        }
    }
    }
    //数字
    else if(ch>='0'&&ch<='9'){
        sum=0;
        while(ch>='0'&&ch<='9'){
            sum=sum*10+(ch-'0');
            ch=prog[p++];
        }
        p--;
        syn=11;
    }
    //符号
    else switch(ch){
        case ':':i=0;word[i++]=ch;
            ch=prog[p++];
            if(ch=='='){
                word[i++]=ch;
                syn=18;
            }else{
                syn=17;
                p--;
            }
            break;
        case '<':
            i=0; 
            word[i++]=ch;
            ch=prog[p++];
            if(ch=='='){
                word[i++]=ch;
                syn=21;
            }else if(ch=='>'){
                word[i++]=ch;
                syn=22;
            }else{
                syn=20;
                p--;
            }
            break;
        case '>':
            i=0;
            word[i++]=ch;
            ch=prog[p++];
            if(ch=='='){
                word[i++]=ch;
                syn=24;
            }else{
                syn=23;
                p--;
            }
            break;
        case '+':word[0]=ch;syn=13;break;
        case '-':word[0]=ch;syn=14;break;
        case '*':word[0]=ch;syn=15;break;
        //case '/':word[0]=ch;syn=16;break;
        case '=':word[0]=ch;syn=25;break;
        case ';':word[0]=ch;syn=26;break;
        case '(':word[0]=ch;syn=27;break;
        case ')':word[0]=ch;syn=28;break;
        case '#':word[0]=ch;syn=0;break;
        case '\n':syn=233;break;
        //注释
        case '/':
            i=0;
            word[i++]=ch;
            ch=prog[p++];
            if(ch=='/'){
                do{
                    p++;
                }while(prog[p]!='\n');
                    if(prog[p]=='\n'){
                        syn=233;break;
                    }
            }
            
            if(ch=='*'){
                do{
                    p++;
                    if(p==y-1 ){
                        syn=-1;break;
                    }
                }while(prog[p]=='*'&&prog[p+1]!='/'||prog[p]!='*'&&prog[p+1]=='/'||prog[p]!='*'&&prog[p+1]!='/');
                if(prog[p]=='*'&&prog[p+1]=='/'){
                    p++;p++;
                    syn=233;
                    break;
                }
            }
            
            else{
                p--;ch=word[i];syn=16;break;
            }
            break;
            
        default:syn=-1;break;
    }
}
int main(){
        p=0;
        row=1;
        printf("请输入语句段:");
        do{
            ch=getchar();
            prog[p++]=ch; 
        }while(ch!='#');
        y=p;
        p=0;
        do{
            getsyn();
        switch(syn){
            case -1:printf("在第%d行有错误!\n",row);break;
            case 233:row+=1;break;
            case 11:printf("(%d,%d)\n",sum,syn);break;
            default:printf("(%s,%d)\n",word,syn);break;
    }
        }while(syn!=0);
}

 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号