[编译原理]java实现的词法分析程序

[编译原理]java实现的词法分析

代码链接:https://github.com/HeisenbergSu/Lexical-Analysis

一、问题描述

MIDL的词法规则和编译原理课程实验要求

  1. MIDL的词法规则
    1)语言的关键字(16个):
    struct float boolean short long
    double int8 int16 int32 int64
    unit8 unit16 unit32 unit64 char
    unsigned

注:关键字是保留字,并且不区分大小写。

2)语言的专用符号17个:

3)标示符ID、整数INTEGER、 字符串STRING和BOOLEAN等4个词法规则(标黑的)通过下列正则表达式定义:
ID = LETTER (UNDERLINE?( LETTER | DIGIT))*

LETTER = [a-z] | [A- Z]

DIGIT = [0-9]

UNDERLINE= _

INTEGER = (0 | [1-9] [0-9]*) INTEGER_TYPE_SUFFIX?

INTEGER_TYPE_SUFFIX = l | L

STRING = " ( ~\ | ~" ) "*

BOOLEAN = TRUE | FALSE
4)补充说明的注意事项
其中,正则符号标识含义如下表:
在这里插入图片描述
在这里插入图片描述

空白、换行符和制表符在词法分析时可以忽略掉,但是字符串本身的空白、换行符和制表符不能忽略。
2. 词法分析程序课程设计要求
词法分析程序的设计与实现需要按照以下要求完成。

  1. 基于词法规则设计词法分析器(20分)
    画出确定的有穷自动机(确定化),并提供必要的文字说明。提交状态转换图.doc
  2. 词法分析程序的编程实现与测试(80分)
    (1) 编程实现词法分析器,提交可执行词法分析程序的源程序(语言不限,60分)
    编程实现词法分析程序,该词法分析程序能够读取测试输入文件中的源程序,并将其词法分析的结果即token序列或词法分析的所有错误信息输出到tokenOut.txt中,以便于检查你的词法分析程序的正确性。输出的错误信息要包括错误所在行数,错误类型等信息(同目录下有测试文件夹,共五大类测试输入)。
    (2) 提交所生成的词法分析程序的测试方案(20分).doc
    注:将状态转换图.doc、源程序、以及词法分析程序测试方案.doc文件放在一个文件夹下,按照“班级_学号_姓名”的命名方式打包提交。如果还有其它需要说明的问题须写在readme.doc中。
  1. 有关附加分的说明
    关于字符串,如果词法分析程序考虑转义字符(正规表达式的定义如下),则作为加分项目,可以选做。

STRING = " (ESCAPE_SEQUENCE | (~\ | ~") )* "

ESCAPE_SEQUENCE = \ ( b | t | n | f | r | " | \ )

二、解决方案

1.首先根据正则表达式画出状态转换图
在这里插入图片描述
2.根据状态转移方程确定状态(state)的个数以及标识符类型(TokenType)的个数,其中LT,GT代表<<和>>两种需要特殊处理的符号(连续判断两个字符)。
3.编码思路:
1)读取文本文件中的每一行,将其转为字符数组逐个付给字符变量判断,状态从START开始,到DONE为一组词的分析结束,将词和它的类型输出到文本文件,如果出现错误字符会输出相应的错误类型和所在行数。
2)代码如下:

import java.io.*;
import java.util.ArrayList;
/*
处理了转义字符
 */
public class AnalysisTokens {
   


    public static String[] keywords = new String[]{
   "struct","float","boolean","short","long","double","int8","int16","int32","int64","unit8",
            "unit16","unit32","unit64","char","unsigned"};
    public static String[] booleans = new String[]{
   "TRUE","FALSE"};
    //开始,ID,NUM,STRING,0,带下划线的ID,结束,错误,右移位,左移位
    public static enum STATE {
   START,INID,INNUM,STRING,ZERO,IN_ID,DONE,ERROR,GT,LT};
    public static enum TokenType {
   ID,LETTER,STRING,DIGIT,INTEGER,BOOLEAN,KEYWORD,ASSIGN};


    /**
     *
     * @param c
     *            char
     * @return if char is letter
     */
    public static Boolean isLetter(char c){
   
        //[a-z]|[A-Z]
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
            return true;
        return false;
    }
    /**
     *
     * @param c
     *            char
     * @return if char is digit
     */
    public static Boolean isDigit_with_0(char c){
   

        if (c >= '0' && c <= '9')
            return true;
        return false;
    }
    /**
     *
     * @param c
     *            char
     * @return if char is digit excpet 0
     */
    public static Boolean isDigit_without_0(char c){
   

        if (c >= '1' && c <= '9')
            return true;
        return false;
    }
    /**
     *
     * @param c
     *          char
     * @return if it is ESCAPE_SEQUENCE
     */
    public static Boolean isESCAPE_SEQUENCE(char c){
   

        if (c == 'b' || c == 't' || c == 'n' || c == 'f' || c == 'r' || c == '"' || c == '\\')
            return true;
        return false;
    }
    /**
     *
     * @param c
     *          char
     * @return if it is char or digit
     */
    public static Boolean isLetterOrDigit(char c){
   

        if(isDigit_with_0(c) || isLetter(c)){
   
            return true;
        }
        return  false;
    }
    /**
     *
     * @param c
     *          char
     * @return if it is assign
     */
    public static Boolean isAssign(char c){
   

        if (c == '{' || c == '}' || c == ';' || c == '[' || c == ']' || c == '*' || c == '+' || c == '-' || c 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值