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

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

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

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

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

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

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

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

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

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

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

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

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


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

//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]; 
                        }


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

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统一定义; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名),结果文件中每行按如下方式组织: 单词类别码 单词的字符/字符串形式(中间仅用一个空格间隔) 单词的类别码请统一按如下形式定义: 单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码 标识符 IDENFR else ELSETK - MINU = ASSIGN 整形常量 INTCON switch SWITCHTK * MULT ; SEMICN 字符常量 CHARCON case CASETK / DIV , COMMA 字符串 STRCON default DEFAULTTK < LSS ( LPARENT const CONSTTK while WHILETK GRE [ LBRACK char CHARTK scanf SCANFTK >= GEQ ] RBRACK void VOIDTK printf PRINTFTK == EQL { LBRACE main MAINTK return RETURNTK != NEQ } RBRACE if IFTK + PLUS : COLON 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】要求将词法分析结果输出至output.txt中。 【特别提醒】(1)读取的字符串要原样保留着便于输出,特别是数字,这里输出的并不是真正的单词值,其实是读入的字符串,单词值需另行记录。 (2)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (3)在今后的错误处理作业中,需要输出错误的行号,在词法分析的时候注意记录该信息。 (4)单词的类别和单词值以及其他关注的信息,在词法分析阶段获取后,后续的分析阶段会使用,请注意记录;当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【文法定义】请到“2020年文法定义(用于查看文法,不计入成绩)”作业中查看文法 【样例输入】 coNst int cONst1 = 001, const2 = -100; const char const3 = '_'; int change1; char change3; int gets1(int var1,int var2){ change1 = var1 + var2; return (change1); } void main(){ printf("Hello World"); printf(gets1(10, 20)); } 【样例输出】 CONSTTK coNst INTTK int IDENFR cONst1 ASSIGN = INTCON 001 COMMA , IDENFR const2 ASSIGN = MINU - INTCON 100 SEMICN ; CONSTTK const CHARTK char IDENFR const3 ASSIGN = CHARCON _ SEMICN ; INTTK int IDENFR change1 SEMICN ; CHARTK char IDENFR change3 SEMICN ; INTTK int IDENFR gets1 LPARENT ( INTTK int IDENFR var1 COMMA , INTTK int IDENFR var2 RPARENT ) LBRACE { IDENFR change1 ASSIGN = IDENFR var1 PLUS + IDENFR var2 SEMICN ; RETURNTK return LPARENT ( IDENFR change1 RPARENT ) SEMICN ; RBRACE } VOIDTK void MAINTK main LPARENT ( RPARENT ) LBRACE { PRINTFTK printf LPARENT ( STRCON Hello World RPARENT ) SEMICN ; PRINT
哈尔滨工业大学威海编译原理实验是指学生在编译原理课程中进行的实践性学习活动。通过该实验,学生们能够深入了解编译原理的基本概念和原理,并通过实际操作来加深对编译器的理解。 实验内容主要包括以下几个方面:词法分析、语法分析、语义分析和中间代码生成。在词法分析部分,学生需要根据给定的文法和词法规则,编写词法分析器,将输入的源代码分解成一个个的单词符号。在语法分析部分,学生需要设计并实现一个语法分析器,对分解出来的单词符号进行分析,判断其是否符合语法规则。在语义分析部分,学生需要对上一步得到的语法树进行静态分析,检查语义错误并进行相应的处理。在中间代码生成部分,学生需要将语法树转化成中间代码,为后续的优化和目标代码生成做好准备。 为了完成这个编译原理实验,学生通常需要利用计算机编程语言如C++或Java等实现所需的算法和数据结构,并进行调试和测试。此外,学生还需要熟悉相关的编译工具和库,如Lex和Yacc等。通过实践操作,学生们能够更好地理解编译器的工作原理,并培养自己的编程和分析能力。 总之,哈尔滨工业大学威海编译原理实验是一个培养学生编译器设计和实现能力的重要实践环节,通过实验,学生们能够将课堂理论知识转化为实际应用能力,并为以后的研究和职业发展奠定坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值