博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java编写词法分析器
阅读量:6868 次
发布时间:2019-06-26

本文共 4819 字,大约阅读时间需要 16 分钟。

词法分析器就是通过扫描一段程序判断是否是关键字、标识符、常数、分界符、运算符。一般分为一符一种和经典五中;

这里我用的是经典五中,此词法分析器是用java编写的;

/*

保留字|关键字:1
操作符|运算符:2
分界符:3
标识符:4
常数:5
无识别:6
*/

主要代码为:

/** * 此程序是通过将文件的字符读取到字符数组中去,然后遍历数组,将读取的字符进行 * 分类并输出 * @author * */public class WordAnalyze {    private String keyWord[] = {"break","include","begin","end","if","else","while","switch"};    private char ch;    //判断是否是关键字    boolean isKey(String str)    {        for(int i = 0;i < keyWord.length;i++)        {            if(keyWord[i].equals(str))                return true;        }        return false;    }    //判断是否是字母    boolean isLetter(char letter)    {        if((letter >= 'a' && letter <= 'z')||(letter >= 'A' && letter <= 'Z'))            return true;        else            return false;    }    //判断是否是数字    boolean isDigit(char digit)    {        if(digit >= '0' && digit <= '9')            return true;        else            return false;    }    //词法分析    void analyze(char[] chars)    {        String arr = "";        for(int i = 0;i< chars.length;i++) {            ch = chars[i];            arr = "";            if(ch == ' '||ch == '\t'||ch == '\n'||ch == '\r'){}            else if(isLetter(ch)){                while(isLetter(ch)||isDigit(ch)){                        arr += ch;                    ch = chars[++i];                }                //回退一个字符                i--;                if(isKey(arr)){                    //关键字                    System.out.println(arr+"\t4"+"\t关键字");                }                else{                    //标识符                    System.out.println(arr+"\t4"+"\t标识符");                }            }            else if(isDigit(ch)||(ch == '.'))            {                while(isDigit(ch)||(ch == '.'&&isDigit(chars[++i])))                {                    if(ch == '.') i--;                    arr = arr + ch;                    ch = chars[++i];                }                //属于无符号常数                System.out.println(arr+"\t5"+"\t常数");            }            else switch(ch){                //运算符                case '+':System.out.println(ch+"\t2"+"\t运算符");break;                case '-':System.out.println(ch+"\t2"+"\t运算符");break;                case '*':System.out.println(ch+"\t2"+"\t运算符");break;                case '/':System.out.println(ch+"\t2"+"\t运算符");break;                //分界符                case '(':System.out.println(ch+"\t3"+"\t分界符");break;                case ')':System.out.println(ch+"\t3"+"\t分界符");break;                case '[':System.out.println(ch+"\t3"+"\t分界符");break;                case ']':System.out.println(ch+"\t3"+"\t分界符");break;                case ';':System.out.println(ch+"\t3"+"\t分界符");break;                case '{':System.out.println(ch+"\t3"+"\t分界符");break;                case '}':System.out.println(ch+"\t3"+"\t分界符");break;                //运算符                case '=':{                            ch = chars[++i];                            if(ch == '=')System.out.println("=="+"\t2"+"\t运算符");                            else {                                System.out.println("="+"\t2"+"\t运算符");                                i--;                            }                         }break;                case ':':{                            ch = chars[++i];                            if(ch == '=')System.out.println(":="+"\t2"+"\t运算符");                            else {                                System.out.println(":"+"\t2"+"\t运算符");                                i--;                            }                         }break;                case '>':{                            ch = chars[++i];                            if(ch == '=')System.out.println(">="+"\t2"+"\t运算符");                            else {                                System.out.println(">"+"\t2"+"\t运算符");                                i--;                            }                         }break;                case '<':{                            ch = chars[++i];                            if(ch == '=')System.out.println("<="+"\t2"+"\t运算符");                            else {                                System.out.println("<"+"\t2"+"\t运算符");                                i--;                            }                         }break;                //无识别                default: System.out.println(ch+"\t6"+"\t无识别符");            }        }    }public static void main(String[] args) throws Exception {    File file = new File("E:\\data.txt");//定义一个file对象,用来初始化FileReader    FileReader reader = new FileReader(file);//定义一个fileReader对象,用来初始化BufferedReader    int length = (int) file.length();    //这里定义字符数组的时候需要多定义一个,因为词法分析器会遇到超前读取一个字符的时候,如果是最后一个    //字符被读取,如果在读取下一个字符就会出现越界的异常    char buf[] = new char[length+1];    reader.read(buf);    reader.close();    new WordAnalyze().analyze(buf);    }}

 运行结果:

 

转载于:https://www.cnblogs.com/ya-qiang/p/8987869.html

你可能感兴趣的文章
Exchange Server 运维管理01:Exchange中Active Directory 有什么用?
查看>>
dhcp服务在企业中的应用
查看>>
linux系统管理之四:服务状态
查看>>
VMware View FAQ[一]
查看>>
【原创翻译】布尔值(boolean)
查看>>
三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器
查看>>
MySQL分库分表分表后数据的查询(5th)
查看>>
iOS-点击图片放大,再次点击返回原视图 类似查看相册的功能
查看>>
JAVA -- stateless4j StateMachine 使用浅析(二)
查看>>
oracle checkpoint
查看>>
centos 6.5 x64bit 快速安装openstack
查看>>
收藏的文章
查看>>
第二章链路层
查看>>
我的友情链接
查看>>
php mb_substr()函数的详细解释!
查看>>
谈谈技术规范的制定
查看>>
ubuntu12.04mtk编译环境安装
查看>>
Haproxy负载均衡比较
查看>>
inittab文件被删除的修复方法
查看>>
三种进制相互转化
查看>>