实验 词法分析器

    

实验一、词法分析实验

商业软件工程专业   姓名:张木贵  学号:201505060365

一.实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

二、实验内容和要求

  1. 根据状态转换图直接编程

编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。

  具体任务有:

(1)组织源程序的输入

(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件

(3)删除注释、空格和无用符号

(4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。

(5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。

标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址

注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。

常量表结构:常量名,常量值

2.能对任何S语言源程序进行分析

在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。

3.能检查并处理某些词法分析错误

词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。

4. 本实验要求处理以下两种错误(编号分别为1,2):

1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。

2:源程序文件结束而注释未结束。注释格式为:/* …… */

三、实验方法、步骤及结果测试

  1.      原理分析及流程图

2.源代码:

public class 词法分析 {   
     
    /*  初始化数据  
      syn为单词种别码;  
      token为存放的单词自身字符串;  
      sum为整型常数。  
     */  
    static String prog;   
    static char ch;   
    static char[]token=new char[8];   
    static int syn,p,m,n,sum;   
    static //关键字表的初值  
    String[] rwtable={"begin","if","then","while","do","end"};   
       
    /**  
     * @param args  
     * @throws IOException   
     */  
    public static void main(String[] args) throws IOException {   
         //1、输入字符串   
         //prog="begin  x:=9; if x>0  then   x:=2*x+1/3;end #";  
         //1、从文件中读取字符串   
        prog=dofile.readFileByChars("src/data.txt");   
         //2、扫描输出   
         p=0;   
         do{   
             scaner();   
             switch(syn){   
             case 11:System.out.print("("+syn+" , ");//单词符号:Digit digit*  
                     System.out.print(sum);   
                     System.out.println(")");   
                break;   
             case -1:System.out.println("error!");   
                break;   
             default:   
                     System.out.print("(");   
                     System.out.print(syn);    
                     System.out.print(" , ");   
                     String str=new String(token);   
                     System.out.print(str);   
                     System.out.println(")");   
             }   
         }while(syn!=0);   
            
            
    }   
    //扫描程序   
    private static void scaner() throws IOException {          
//      1、初始化   
        for(int i=0;i<8;i++)   
            token[i]=‘ ‘;   
//      2、读字母   
        ch=prog.charAt(p++);   
        while(ch==‘ ‘){//如果是空格,则取下一个字符  
            ch=prog.charAt(p++);   
        }   
//      3、开始执行扫描   
//          1、是字母   
//                     读标识符,查保留字表   
//                         查到,换成属性字表,写到输出流  
//                         没查到, 查名表,换成属性字,写到输出流  
        if(ch>=‘a‘&&ch<=‘z‘){   
            m=0;   
            //获取完整单词   
            while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘)){   
                token[m++]=ch;   
                ch=prog.charAt(p++);   
            }   
            token[m++]=‘\0‘;   
            --p;   
            syn=10;//单词符号为letter(letter|digit)*  
            //判断是哪个关键字   
            String newStr=new String(token);   
            newStr=newStr.trim();   
            //System.out.println("newStr:"+newStr);  
            for(n=0;n<6;n++){   
                //System.out.println("rwtable:"+rwtable[n]);  
                if(newStr.equals(rwtable[n])){   
                    syn=n+1;   
                    System.out.println("syn 的值是:"+syn);   
                    break;   
                }   
            }   
            token[m++]=‘\0‘;   
        }   
//          2、是数字   
//                         取数字,查常量表,换成属性字表,写到输出流  
        else if(ch>=‘0‘&&ch<=‘9‘){   
            while(ch>=‘0‘&&ch<=‘9‘){   
                sum=sum*10+ch-‘0‘;   
                ch=prog.charAt(p++);   
            }   
            --p;   
            syn=11;//digitdigit*  
            token[m++]=‘\0‘;   
        }   
//          3、是特殊符号   
//                         查特殊符号表,换成属性字。写到输出流  
//          4、错误error   
//      4、是否分析结束   
//              未结束,到2   
//              结束,到出口   
        else    
        switch(ch){   
            case‘<‘:   
                m=0;   
                token[m++]=ch;   
                ch=prog.charAt(p++);   
                if(ch==‘>‘){   
                    syn=21;//<>  
                }   
                else if(ch==‘=‘){   
                    syn=22;//<=  
                    token[m++]=ch;   
                }   
                else{   
                    syn=20;//<  
                    --p;   
                }   
            break;   
            case‘>‘:   
                token[m++]=ch;   
                ch=prog.charAt(p++);   
                if(ch==‘=‘){   
                    syn=24;//>=  
                }   
                else{   
                    syn=23;//>  
                    --p;   
                }   
                break;   
            case‘:‘:   
                token[m++]=ch;   
                ch=prog.charAt(p++);   
                if(ch==‘=‘){   
                    syn=18;//:=  
                    token[m++]=ch;   
                }   
                else{   
                    syn=17;//:  
                    --p;   
                }   
            break;   
            case‘+‘:   
                syn=13;token[0]=ch;token[1]=‘\0‘;break;   
            case‘-‘:   
                syn=14;token[0]=ch;token[1]=‘\0‘;break;   
            case‘*‘:   
                syn=15;token[0]=ch;token[1]=‘\0‘;break;   
            case‘/‘:   
                syn=16;token[0]=ch;token[1]=‘\0‘;break;   
            case‘=‘:   
                syn=25;token[0]=ch;token[1]=‘\0‘;break;   
            case‘;‘:   
                syn=26;token[0]=ch;token[1]=‘\0‘;break;   
            case‘(‘:   
                syn=27;token[0]=ch;token[1]=‘\0‘;break;   
            case‘)‘:   
                syn=28;token[0]=ch;token[1]=‘\0‘;break;   
            case‘#‘:   
                syn=0;token[0]=ch;token[1]=‘\0‘;break;   
            default:   
                syn=-1;    
                   
        }   
           
        File txt=new File("src/nihao.txt");   
           if(!txt.exists()){   
               txt.createNewFile();   
           }   
           byte[] bytes=new byte[token.length];//定义一个长度与需要转换的char数组相同的byte数组  
           for(int i=0;i<bytes.length ;i++){//循环将char的每个元素转换并存放在上面定义的byte数组中  
               byte b=(byte)token[i];//将每个char转换成byte  
               bytes[i]=b;//保存到数组中   
           }   
           FileOutputStream fos;   
        try {   
            fos = new FileOutputStream(txt,true);   
            fos.write(syn);   
            fos.write(bytes);   
               
               fos.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }     
    }   
}  

3.运行结果

时间: 2024-10-28 09:54:49

实验 词法分析器的相关文章

mfc控件——list control的使用

[前话] 编译原理的第一个实验——词法分析器验收时,老师要求最后的结果用GUI的形式表现出来.想想确实,黑白的控制台应用程序界面在用户操作时的确不如GUI 友好.GUI界面也算是大势所趋.我现在掌握三种语言的基本语法——c/c++.Java和python.python好久之前学过然后没用就忘记了,最 近想写网络爬虫才又重新去看,对于python写GUI也是一窍不通,不做考虑.自认为Java写GUI比较方便,但是实验代码已经用c写完了,所以最后 决定用mfc做这个GUI. 到了大二下陆陆续续的做了

词法分析器实验报告

一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试  1.      源程序名:cffx.cpp 可执

实验一、词法分析器实验

专业:商业软件工程   姓名:陈楷涛  学号:201506110199 一.        实验目的        通过编写一个词法分析器,进一步了解词法之间的关系 二.        实验内容和要求 对输入的字符串进行识别,并将输出该字符串和种别码 三.        实验方法.步骤及结果测试  1.      源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图   #include <stdio.h> #include <string.h>

编译原理 - 实验二 - FLEX词法分析器

FLEX词法分析器 一.Lex和Yacc介绍 Lex 是一种生成扫描器的工具.扫描器是一种识别文本中的词汇模式的程序. 一种匹配的常规表达式可能会包含相关的动作.这一动作可能还包括返回一个标记. 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配. 它一次读入一个输入字符,直到找到一个匹配的模式. 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记). 另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息. Ya

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

词法分析器:代码注释

前沿:词法分析器是将一段程序的代码按照类别分开.一般来说是将关键字, 变量名  , 常数 运算符( + _ * / )和界符分类词法分析算是编译的基础把今天上编译原理的实验课, 看了看  老师给的代码 添加了一些注释大致的流程是这样的:规定关键字的符号是10数字的符号是数字本身+ - *  = 这些符号代码中的case里面有(分别是13 14 ...),可以看懂的首先, 把程序存到制定的内存区域, 这里是划出了一个连续的空间(放到字符数组);然后再按字节读取里面的内容 , 当读到空格(" &qu

Java语言词法分析器

一.实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字.标识符.常数.运算符.分隔符五大类.并依次输出各个单词的内部编码及单词符号自身值.(遇到错误时可显示“Error”,然后跳过错误部分继续显示). 二.实验准备工作 1.词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号.词法分析器的单词符号

203-陈冠权-词法分析实验报告

实验一.词法分析实验 专业:商业软件工程3班   姓名:陈冠权  学号:201506110203 一.实验目的 通过设计编译程序完成一个词法分析器,加深对词法分析的理解. 二.实验内容和要求 输入一连串的字符,即保留字.标识符.常数.运算符和分隔符,通过词法 分析器来识别具有独立意义的字符,并输出各个字符的内部编码. 三.实验方法.步骤及结果测试 1.   源程序名:词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 要求在主函数输入字符串,将字符串存入数组里面,调用

自己动手实现简单编译器之(二)词法分析器和有穷自动机

一:实验指导书 对下述单词表定义的语言设计编制一个词法分析器.单词符号及种别表和词法分析器功能及基本要求如下: (1)单词符号及种别表 单词符号 种别编码 单词值 main 1   int 2   float 3   double 4   char 5   if 6   else 7   do 8   while 9   l(l|d)* 10 内部字符串 ( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε) 20 二进制数值表示 = 21   + 22   -