词法分析器Java实现

话不多说,直接看代码:

package tyh.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class Word_analyis {
    //关键字数组
    private static String[] KeyWord = {"if", "else", "return", "while", "int", "float"};
    //运算符数组
    private static String[] Operator = {">", "<", "=", ">=", "<=", "!=", "==", "||", "&&", "/", "+", "-", "*"};
    private static String[] OneOperator = {">", "<", "=", "+", "-", "*", "/", "|", "&", "!"};
    //分界符数组
    private static String[] Boundaries = {"(", ")", "}", "{", ";"};

    //记录字符集读到什么位置
    private static int p = 0;
    //记录字符串
    private static String Word = "";
    //记录标识符id
    private static int id = 1;

    //读文件,返回字符数组
    public static char[] read(String fileName){
        File file = new File(fileName);
        char[] data = new char[255];
        try {
            FileReader fileReader = new FileReader(file);
            fileReader.read(data);
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }

    //判断是否是关键字
    public static boolean isKey(String word){
        return Arrays.asList(KeyWord).contains(word);
    }
    //判断是否是运算符
    public static boolean isOperator(String word){
        return Arrays.asList(Operator).contains(word);
    }
    public static boolean isOneOperator(char ch){
        String s = String.valueOf(ch);
        return Arrays.asList(OneOperator).contains(s);
    }
    //判断是否是分界符
    public static boolean isBoundaries(char ch){
        String s = String.valueOf(ch);
        return Arrays.asList(Boundaries).contains(s);
    }

    //判断此字符是否为空格或tab
    public static boolean isnull(char ch){
        if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'){
            return true;
        }
        return false;
    }
    //判断此字符是否为数字
    public static boolean isnum(char ch){
        if (ch >= '0' && ch <= '9'){
            return true;
        }
        return false;
    }
    //判断此字符是否为字母
    public static boolean isLetters(char ch){
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        char[] data = read("D:\\程序\\Maven\\maven-project\\Hbase-demo\\src\\main\\java\\tyh\\source.txt");
        System.out.println(data);
        System.out.println();
        while(data[p] != '#') {
            if (isnull(data[p])) {
                p++;
            } else if (isLetters(data[p])){
                Word += data[p];
                p++;
                while(isLetters(data[p]) || isnum(data[p])){
                    Word += data[p];
                    p++;
                }
                if (isKey(Word)){
                    System.out.println("<" + Word + ">" + "\t\t" + "关键字");
                }else{
                    System.out.println("<id " + id + ">" + "\t" + Word + "\t" + "标识符");
                    id++;
                }
                Word = "";
            }else if (isOneOperator(data[p])){
                Word += data[p];
                p++;
                while(isOneOperator(data[p])){
                    Word += data[p];
                    p++;
                }
                if (isOperator(Word)){
                    System.out.println("<" + Word + ">" + "\t\t" + "运算符");
                }
                Word = "";
            }else if(isnum(data[p])){
                while (isnum(data[p])|| (data[p] == '.' && isnum(data[(p + 1)]))){
                    Word += data[p];
                    p++;
                }
                System.out.println("<" + Word + ">" + "\t\t" + "常数");
                Word = "";
            }else if(isBoundaries(data[p])){
                System.out.println("<" + data[p] + ">" + "\t\t" + "分界符");
                p++;
            }else{
                System.out.println("<" + data[p] + ">" + "\t\t" + "无法识别");
                p++;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/tyh1579152915/article/details/109162288