哈工大编译原理实验1——词法分析

设计实现类高级语言的词法分析器,基本功能如下:

(1)    能识别以下几类单词:

标识符(由大小写字母、数字以及下划线组成,但必须以字母或者下划线开头)

关键字(①类型关键字:整型、浮点型、布尔型、记录型;②分支结构中的if和else;③循环结构中的do和while;④过程声明和调用中的关键字)

运算符(①算术运算符;②关系运算符;③逻辑运算)

界符(①用于赋值语句的界符,如“=”;②用于句子结尾的界符,如“;”;③用于数组表示的界符,如“[”和“]”;④用于浮点数表示的界符“.”)

常数(无符号整数和浮点数,包括指数形式)

注释(/*……*/形式)

(2)能够进行词法错误处理。识别出输入程序中的词法错误,准确给出错误所在位置,并采用可行的错误恢复策略。输出的错误提示信息格式如下:

Error at Line [行号]:[说明文字]

(3)系统的输入形式:要求能够通过文件导入测试用例。测试用例要涵盖第(1)条中列出的各类单词,并包含各种单词拼写错误。

这里采用的token字符串识别方法是基于DFA状态转移

哈工大编译原理实验1——词法分析_第1张图片

与之对应可以建立一个二维数组进行状态判断

//DFA of digit
	public static String digitDFA[] = { 
		"#d#####", 
		"#d.#e##", 
		"###d###", 
		"###de##",  
        "#####-d", 
        "######d", 
        "######d" };

//判断输入符号是否符合状态机
	public static int in_digitDFA(char ch, char test) 
	{  
        if (test == 'd') {  
            if (isDigit(ch))  
                return 1;  
            else  
                return 0;  
        }  
        else
        {
        	if (ch == test)
        		return 1;
        	else
        		return 0;
        }
    }

//初始化进入1状态
						int state = 1;
						//声明计数变量
						int k;
                        Boolean isfloat = false;  
                        while ( (ch != '\0') && (isDigit(ch) || ch == '.' || ch == 'e' || ch == '-'))
                        {
                        	if (ch == '.' || ch == 'e')  
                              isfloat = true;
                        	  
                            for (k = 0; k <= 6; k++) 
                            {  
                                char tmpstr[] = digitDFA[state].toCharArray();  
                                if (ch != '#' && 1 == in_digitDFA(ch, tmpstr[k])) 
                                {  
                                    token += ch;  
                                    state = k;  
                                    break;  
                                }  
                            }
                            if (k > 6) break;
                            //遍历符号先前移动
                            i++;
                            if(i>=strline.length) break;  
                            ch = strline[i]; 
                        }

哈工大编译原理实验1——词法分析_第2张图片

全部工程源代码:https://github.com/SalamanderJY/Compiler_Experiment

你可能感兴趣的:(Compiler,Principle)