栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于java的简单词法分析程序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于java的简单词法分析程序

今天老师要我们写一个简单的词法分析程序,实现简单的词法分析。经过我一个下午的努力,下面的简单词法分析就出来了。(本人实力有限,目前只能做到这样了。梁)

import java.io.FileReader;


public class Compile {

    
    private static String[] key = {"begin", "end", "if", "then", "else", "while", "do"};//待识别的关键字数组
    private static String[] border = {",", ";", "{", "}", "(", ")"};//待识别的特殊字符数组
    private static String[] arithmetic = {"+", "-", "*", "/"};//待识别的算数运算数组
    private static String[] relation = {"<", ">", "<=", "=", ">=", "<>"};//待识别的逻辑运算数组
    private static String[] constNumber = new String[20];//用于存储用户自己定义的常数
    private static String[] label = new String[20];//用于存储用户自己定义的单词
    private static int constNum = 0;//动态记录用户定义的整形数个数
    private static int labelNum = 0;//动态记录用户定义的单词个数
    private static FileReader fileReader = null;//全局字符流

    public static void main(String[] args) throws Exception {
        String fileName = "D:\Project\JavaDemo\text";//要识别的程序的地址
        fileReader = new FileReader(fileName);//获得文件字符流
        int number = fileReader.read();//用来存放从文件中读到的字符的ASCII码,主要利于后面的文件尾部的判断
        
        while (number != -1) {
            char c = (char) number;//用来存放从文件中读到的字符
            if (Character.isLetter(c))//当读到的第一个字符是字母,调用alphaProcess方法
                number = alphaProcess(c);
            else if (Character.isDigit(c))//当读到的第一个字符是数字时,调用digitProcess方法
                number = digitProcess(c);
            else number = otherProcess(c);//当读到的第一个字符是其他类型时,调用otherProcess方法
        }
    }

    
    private static int search(String searchChar, int wordType) {
        int i;//字符串在字符串数组中的位置
        
        switch (wordType) {
            case 1://识别关键字
            {
                for (i = 0; i < 7; i++) {
                    if ((key[i].equals(searchChar)))
                        return (i + 1);
                }
                return 0;
            }
            case 2: //识别特殊字符
            {
                for (i = 0; i < 6; i++) {
                    if (border[i].equals(searchChar))
                        return (i + 10);
                }
                return 0;
            }
            case 3://识别算数运算符
            {
                for (i = 0; i < 3; i++) {
                    if (arithmetic[i].equals(searchChar)) {
                        return (i + 16);
                    }
                }
                return 0;
            }
            case 4://识别逻辑运算符
            {
                for (i = 0; i < 5; i++) {
                    if (relation[i].equals(searchChar)) {
                        return (i + 20);
                    }
                }
                return 0;
            }
            case 5://识别数字,有则识别,没有则添加
            {
                for (i = 0; i < constNum; i++) {
                    if (constNumber[i].equals(searchChar)) {
                        return (i + 1);
                    }
                }
                constNumber[i] = searchChar;//存放用户新定义的数字
                constNum++;
                return i;
            }
            case 6: //识别自定义字符串,有择识别,没有则添加
            {
                for (i = 0; i < labelNum; i++) {
                    if (label[i].equals(searchChar)) {
                        return (i + 1);
                    }
                }
                label[i] = searchChar;//存放用户新定义的单词
                labelNum++;
                return i;
            }
            default:
                return 0;
        }
    }

    
    private static int alphaProcess(char buffer) throws Exception {
        int aType;//这个字符串的种别码
        int number = 0;//字符的ASCII码值
        int i = -1;//指针,指向字符应放的位置
        char[] alphaTp = new char[20];//存放读到的这个字符串
        
        while (Character.isLetter(buffer) || Character.isDigit(buffer)) {
            alphaTp[++i] = buffer;
            number = fileReader.read();
            buffer = (char) number;
        }
        alphaTp[i + 1] = '';//字符串的结束标志
        //1、用来识别关键字
        String searchChar = new String(alphaTp).toLowerCase().trim();
        if ((aType = search(searchChar, 1)) != 0) {
            System.out.println(String.format("(%d,%s)", aType, searchChar));
        }
        //2、用来识别自定义字符串
        else {
            aType = search(searchChar, 6);
            System.out.println(String.format("(9,%d,%s)", aType, searchChar));
        }
        return number;
    }

    
    private static int digitProcess(char buffer) throws Exception {
        int i = -1;//指针,用于定位存放字符的位置
        int number = 0;//字符的ASCII码值
        char[] digitTp = new char[20];//用来存放读到的数字
        
        while (Character.isDigit(buffer)) {
            digitTp[++i] = buffer;
            number = fileReader.read();
            buffer = (char) number;
        }
        digitTp[i + 1] = '';//字符串结束标志
        //调用查询方法 ,查询这个数字在数组中的位置
        String searchChar = new String(digitTp).toLowerCase().trim();
        int digitType = search(searchChar, 5);
        System.out.println(String.format("(8,%d,%s)", digitType, searchChar));
        return number;
    }

    
    private static int otherProcess(char buffer) throws Exception {
        char[] otherTp = new char[20];//用来存放读到的字符串
        int number = 0;//字符的ASCII码值
        int oType, oTypeTp;
        
        otherTp[0] = buffer;
        otherTp[1] = '';
        String searchChar = new String(otherTp).toLowerCase().trim();
        if ((oType = search(searchChar, 3)) != 0) {
            System.out.println(String.format("(%d,%s)", oType, searchChar));
            number = fileReader.read();
            return number;
        }
        
        if ((oType = search(searchChar, 4)) != 0) {
            
            number = fileReader.read();
            buffer = (char) number;
            otherTp[1] = buffer;
            otherTp[2] = '';
            
            if ((oTypeTp = search(searchChar, 4)) != 0) {
                System.out.println(String.format("(%d,%s)", oTypeTp, searchChar));
                return number;
            } else {
             
                otherTp[1] = '';
                System.out.println(String.format("(%d,%s)", oType, searchChar));
                return number;
            }
        }
        
        if ((oType = search(searchChar, 2)) != 0) {
            System.out.println(String.format("(%d,%s)", oType, searchChar));
            number = fileReader.read();
            return number;
        }
        
        if ((buffer != 'n') && (buffer != ' ')) {
            number = fileReader.read();
        }
        return number;
    }
}

输入:

 输出:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号