西安邮电大学词法器的实现.doc
文本预览下载声明
西 安年月日掌握
词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。
单词的BNF表示
标识符- 字母字母数字串
字母数字串-字母字母数字串|数字字母数字串|
下划线字母数字串|ε
无符号整数- 数字数字串
数字串- 数字数字串 |ε
加法运算符- +
减法运算符- -
大于关系运算符-
大于等于关系运算符- =
3、“超前搜索”方法
词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a+”,当前字符为’’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符’+’,这时可知应将’’解释为大于运算符。但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。
4、
三.方案设计
词法形式化描述
使用正则文法进行描述,则可以得到如下的正规式:
其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。
A→(ID | NUM | RES | DEL | OPR) *
ID→letter(letter | didit)*
NUM→digit digit*
letter→a | … | z | A | … | Z
digit→ 0 | … | 9
RES→ program | begin | end | var | int | and | or | not | if | then | else | while | do
DEL→( | ) | . | ; | ,
OPR→+ | * | := | | | = | = | = |
如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。
单词种别定义;
A语言中的单词符号及其对应的种别编码如下表所示:
单词符号 种别编码 单词符号 种别编码 program 1 + 16 begin 2 * 17 end 3 ( 18 var 4 ) 19 int 5 , 20 and 6 . 21 or 7 := 22 not 8 ; 23 if 9 24 then 10 25 else 11 = 26 while 12 = 27 do 13 = 28 标识符 14 29 整型常量 15 - 30
状态转换图;
语言A的词法分析的状态转换图如下所示:
空格符,制表符
或回车符 字母或数字
数字
四.测试数据及运行结果
五.总结
实验过程中遇到的问题及解决办法;
在实验中也遇到很多的错误,比如刚开时不能读写含有数字和不能识别的单词的语句,直接程序运行出错,经过很长时间的调试和分析,最后用单步调试方法找到了原因所在
对设计及调试过程的心得体会。
通过本次试验,我加深了对编译原理中的词法分析的理解,同时通过动手,更加锻炼了自己。本次试验由于使用的刚刚学习的java语言,通过这次机会加强了自己对java语言的熟悉的使用。
六.实验程序的源代码如下:
package Analysis;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class A {
private static char ch;
private static String strToken;
private static int index = 0;
private static int line = 1;
private static boolean noteTag=false;
private Map Integer,String keywords;
private HashMapString, Integer punctuations;
private static ArrayListString p=new ArrayListString();
private static ArrayListString q
显示全部