魏陈强 23020092204168 实验二 词法分析器 一、实验目的 掌握词法分析器的构造原理,掌握手工编程或 LEX编程方法之一。 二、实验内容 编写一个词法分析器,能够输入的源程序转换为单词序列输出。 三、实验要求 1.可以采用手工或 LEX开发工具,采用 VC环境。 2.源语言定义见教材附录 A.1,其中的终结符即词法分析需要得到的tokens。 (1)该语言的关键字:if while do break real true false int char bool float (其中,int、char、boolean、float在产生式中为basic) 所有的关键字都是保留字,并且必须是小写。 (2)id和num的正则表达式定义; (3)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ (4)空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开I D、N U M关键字。 (5)考虑注释。注释由/*和*/包含。注释可以放在任何空白出现的位置,且可以超过一行。注释不能嵌套。 3.实现词法分析器的注意要点: (1 ) 关键字和标识符名的区别; (2 ) 数字的转换处理; (3 ) “>=”和“>”这类单词的处理; 四、实验思路 本次实验,打算两种方法都使用。 1、采用LEX开发工具编写,熟悉LEX语言的编写格式即可。 2、手工编写 定义一个关键字数组,预先存入所以可能出现的关键字,并分 别创建两个关键字表、ID表、num表、专用符号表、注释表,以及一个作为缓存的数组。采用命令行读入语句形式,读入一行语句,设置while(1)循环分别读取每个字符,以‘\n’作为结束。读入一个字符,判断其属于哪个类别,然后通过调用函数转向那个类别所属的子程序去执行。比如,读入一个字符,判断出为字母,因此调用void alpha();进入字母处理子程序去,读取下个字符,如果为字母或者数字,则继续往下读,直到其既不是字母也不是数字为止,然后将从上个断点开始到目前为止的字符串存入缓存数组,并且把该缓存数组和关键字数组逐一比对,若该字符串为关键 字,则存入关键字表,否则存入ID表。同理,如果接下去遇到数字,则转入void digit();中去,取得一个字符串后,判断字符串中是否有字母,如果有则存入ID表,如果没有,则存入digit表,即数字表。如果接下去遇到'\t'和' ',则不做动作。如果遇到'/',则转入void note();判断是否是注释,在注释判断中,通过判断字符串是否以/*开头并且以*/结尾,如果是,则存入注释表中,如果不是,则报错,因为出现了...