词法分析程序(原创!)

/************************************************************************
                        词法分析程序

  功能:用于对输入的字符串进行分类(如果是无符号数,就对它记值;否则值为空)
类别码:1-无符号数,2-‘+’,3-‘-’,4-‘*’,5-‘/’,6-‘(’,7-‘)’        
***************************************************************************/
#include<iostream.h>
#include <windows.h>
#include <conio.h>

/*清屏函数定义*/
int clrscr()
{
  HANDLE hndl = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  GetConsoleScreenBufferInfo(hndl, &csbi);
  DWORD written;
  DWORD N = csbi.dwSize.X * csbi.dwCursorPosition.Y +
            csbi.dwCursorPosition.X + 1;
  COORD curhome = {0,0};
  FillConsoleOutputCharacter(hndl, ' ', N, curhome, &written);
  csbi.srWindow.Bottom -= csbi.srWindow.Top;
  csbi.srWindow.Top = 0;
  SetConsoleWindowInfo(hndl, TRUE, &csbi.srWindow);
  SetConsoleCursorPosition(hndl, curhome);
  return 0;
}
void main(){
    char input[20];               //定义输入缓冲区
    char s,CurrentState;          //定义s用于接收判断是否继续,CurrentState判断当前状态
    unsigned int i,oldi,j;        //定义临时变量,用于数组操作
    do{
        cout<<"/t ---------------------------/n";
        cout<<"/t|       词法分析程序        |/n";
        cout<<"/t ---------------------------/n";
        cout<<"/t请输入:/n";
        cout<<"/t ";
        cin>>input;                  //屏幕提示输入
        i=0,oldi=0,CurrentState='0';
        cout<<"/tclassno/t/tvalue/n";//输出列属性
        do{
            switch(CurrentState){    //判断当前状态
            case '0':
                switch(input[i]){    //判断输入数值
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='1';//改变状态,指向下一个字符
                    i++;
                    break;
                case '.':   CurrentState='3';
                    i++;
                    break;                    
                case '+':   if(i-oldi>0){    //判断如果符号前有数字,就输出
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){    
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                         
                default:    if(input[i]=='/0')    
                            {
                                if(i-oldi>0){     //判断如果符号前有数字,就输出
                                    cout<<"/t"<<1<<"/t/t";
                                    for(j=oldi;j<i;j++)
                                        cout<<input[j];
                                    cout<<endl;}
                                cout<<endl<<"/t Finished!"<<endl;
                                goto exit;
                            }else{                //非法字符判断
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;
                }            
                break;
            case '1':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='1';
                    i++;
                    break;
                case 'E':   CurrentState='4';
                    i++;
                    break;
                case '.':   CurrentState='2';
                    i++;
                    break;
                case '+':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                        
                default:    if(input[i]=='/0')   //1、2、6状态可以是终态
                            {
                                if(i-oldi>0){
                                    cout<<"/t"<<1<<"/t/t";
                                    for(j=oldi;j<i;j++)
                                        cout<<input[j];
                                    cout<<endl;}
                                cout<<endl<<"/t Finished!"<<endl;
                                goto exit;
                            }else{
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;            
                }break;
            case '2':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='1';
                    i++;
                    break;
                case 'E':   CurrentState='4';
                    i++;
                    break;                    
                case '+':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                        
                default:    if(input[i]=='/0')
                            {
                                if(i-oldi>0){
                                    cout<<"/t"<<1<<"/t/t";
                                    for(j=oldi;j<i;j++)
                                        cout<<input[j];
                                    cout<<endl;}
                                cout<<endl<<"/t Finished!"<<endl;
                                goto exit;
                            }else{
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;            
                }        
                break;
            case '3':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='2';
                    i++;
                    break;                        
                case '+':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                         
                default:    if(input[i]=='/0')     //3、4、5不能是终态
                            {
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;
                }        
                break;
            case '4':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='6'; i++;break;
                case '+':   CurrentState='5'; i++;break;  
                case '-':   CurrentState='5'; i++;break;                        
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                        
                default:    if(input[i]=='/0')
                            {
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;
                }break;
            case '5':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='6';
                    i++;
                    break;                        
                case '+':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                        
                default:    if(input[i]=='/0')
                            {
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;
                }break;
            case '6':
                switch(input[i]){
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':   CurrentState='6';
                    i++;
                    break;                        
                case '+':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<2<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '-':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<3<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '*':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<4<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '/':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<5<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case '(':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<6<<endl;
                    CurrentState='0';
                    oldi=++i; break;  
                case ')':   if(i-oldi>0){
                    cout<<"/t"<<1<<"/t/t";
                    for(j=oldi;j<i;j++)
                        cout<<input[j];
                    cout<<endl;}
                    cout<<"/t"<<7<<endl;
                    CurrentState='0';
                    oldi=++i; break;                                             
                default:    if(input[i]=='/0')
                            {
                                if(i-oldi>0){
                                    cout<<"/t"<<1<<"/t/t";
                                    for(j=oldi;j<i;j++)
                                        cout<<input[j];
                                    cout<<endl;}
                                cout<<endl<<"/t Finished!"<<endl;
                                goto exit;
                            }else{
                                cout<<"/t ERROR!"<<endl; goto exit;
                            }   break;
                }break;
            }
            }while(1);
            
exit:   cout<<"/n/t请输入e推出 任意键继续/n";
        cout<<"/t";
        cin>>s;
        if(s!='e')
            clrscr();
    }while(s!='e');
}

⒈ 题目 编写前述PASCAL子集的词法分析程序。 1)主程序设计考虑,(参阅后面给出的程序框架) 主程序说明部分为各种表格变量安排空间。 数组k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。 P 数组存放分界符。为了简单起见,分界符、算术运算符关系运算符都放在p表中(学生编程时,应建立算术运算符表关系运算符表,并且各有类号),合并成一类。 id ci 数组分别存放标识符常数。 instring 数组为输入源程序的单词缓存。 outtoken 记录为输出内部表示缓存。 还有一些为造表填表设置的变量主程序开始后,先以人工方式输入关键字,造 k 表;再输入分界符等造 p 表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 2)词法分析过程考虑 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符k表示关键字;i表示标识符;c 表示常数;p 表示分界符;s 表示运算符(学生编程时类号分别为1,2,3,4,5)。 对于标识符常数,需分别与标识符表常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数变为二进制形式存入数组中 ci 中,并记录其在表中的位置。 lexical 过程中嵌有两个小过程:一个名为 getchar,其功能为从 instring 中按顺序取出一个字符,并将其指针 pint 加 1 ;另一个名为 error,当出现错误时,调用这个过程,输出错误编号。 将词法分析程序设计成独(入口)立一遍扫描源程序的结构。其流程图见图5-1。 图5-1 词法分析程序流程图 ⒉ 要求 ⑴ 所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为 t ,第二个字节为 i 。 t 为单词的种类。关键字的 t=1;分界符的 t=2;算术运算符的 t=3;关系运算符的 t=4;无符号数的 t=5;标识符的 t=6。i 为该单词在各自表中的指针或内部码值。表 5-1 为关键字表;表 5-2 为分界符表;表 5-3 为算术运算符的 i 值;表 5-4 为关系运算符的 i 值。 表5-1 关键字表 表5-2 分界符表 指针1 关键字 指针1 分界符 0 BEGIN 0 , 1 DO 1 ; 2 ELSE 2 . 3 END 3 := 4 IF 4 ( 5 THEN 5 ) 6 VAR 7 WHILE 表5-3 算术运算符 表5-4 关系运算符 i 值 算术运算符 i 值 关系运算符 00H < 10H + 01H 21H / 04H >= 05H 常数表标识符表是在编译过程中建立起来的。其 i 值是根据它们在源程序中出现的顺序确定的。 ⑵ 常数分析程序、关键字标识符分析程序、其他单词分析程序请参阅范例自行设计。 ⑶ 本实践题可通过扩充下面给出的程序框架完成。 PROGRAM plexical(input,output); LABEL l; CONST keylen=10; identlen=10; TYPE //定义的类型 tstring=ARRAY[1..identlen] OF char; outreco=RECORD//记录为输出内部表示缓存。 ty: char; point: integer; END; {outreco} VAR cip,ip,pint,i,j,l,m,errorx:integer; charl:CHAR; ci:ARRAY[1..10] OF integer; k,id:ARRAY[1..keylen] OF tstring; token:tstring; //标志符 outtoken:outreco; instring:ARRAY[1..10]OF char; p:ARRAY[1..16] OF ARRAY [1..2] OF char; PROCEDURE lexical; VAR l,m,num:integer; b: boolean; PROCEDURE
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值