java实现的简单词法分析器

一个简单的词法分析器

  词法分析(Lexical Analysis) 是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。

有关原理的介绍参考http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html

这里就不多说了。

下面直接代码,相关注释在代码中均已经给出,对字符串的处理完全按照自己的思路编写的。

其中读取的是E盘下的test.txt文本文档:

运行结果如下:

public class Word {
    /**
    *1~20号为关键字,用下标表示,i+1就是其机器码;21~40号为操作符,用下标表示,i+21就是其机器码;41~60号为分界符,
    *  用下标表示,i+41就是其机器码;用户自定义的标识符,其机器码为51;常数的机器码为52;
    *不可以识别的标识符,其机器码为0
    **/
    //关键字
    private String keyword[]={"int","long","char","short","float","double",
            "if","else","for","while","return","break","continue","switch","case",
            "default","void","struct","static","do"};
    //运算符
    private String operator[]={"+","-","*","/","%","=",">","<","!",
            "==","!=",">=","<=","++","--","&","&&","||","[","]"};
    //分界符
    private String delimiter[]={",",";","(",")","{","}","\‘","\"",":","#"};
    //是否为数字
    public boolean isDigit(String str){
        char ch;
        if(str==""){
            return false;
        }
        for(int i=0;i<str.length();i++){
        ch=str.charAt(i);
        if(ch<‘0‘||ch>‘9‘){
        return false;
        }
        }
        return true;
    }
    //是否为字母或字符串
    public boolean isLetter(String str){
        char ch;
        if(str==""){
            return false;
        }
        for(int i=0;i<str.length();i++){
            ch=str.charAt(i);
            if(ch<‘A‘||ch>‘z‘||(ch>‘Z‘&&ch<‘a‘)){
                return false;
            }
        }
        return true;
        
    }
    //判断是否为运算符
    public boolean isOperator(String str){
        char ch;
        char ch2;
        //非运算符
        if(str==""||str.length()==0||str.length()>2){
            return false;
        }
        if(str.length()==1){
            //一个元算符
            for(int i=0;i<operator.length;i++){
                if(str.equals(operator[i])){
                    return true;
                }
            }
            return false;
        }else if(str.length()==2){
            //两个运算符
            ch=str.charAt(0);
            ch2=str.charAt(1);
            if(ch2==‘=‘&&(ch==‘!‘||ch==‘>‘||ch==‘<‘||ch==‘=‘)){
                return true;
            }else if(ch==‘+‘&&ch2==‘+‘){
                return true;
            }else if(ch==‘-‘&&ch2==‘-‘){
                return true;
            }else if(ch==‘|‘&&ch2==‘|‘){
                return true;
            }else if(ch==‘&‘&&ch2==‘&‘){
                return true;
            }else{
                return false;
            }
        }
        return true;
        
    }
    //判断是否为标识符(此处标识符包含了关键字,下面获取机器码需要去掉关键字)
    public boolean isIdentifier(String str){
        if(str==""){
            return false;
        }else if(str.length()==1){
            if(isLetter(str)||str=="_"){
                return true;
            }else{
                return false;
            }
        }else{
            char ch=str.charAt(0);
            String str2=str.substring(1, str.length()-1);
            String str3;
            if((ch>‘a‘&&ch<‘z‘)||(ch>‘A‘&&ch<‘Z‘)||ch==‘_‘){
                for(int i=0;i<str2.length();i++){
                    str3=str2.substring(i, i+1);
                    if(!(isDigit(str3)||isLetter(str3))){
                        return f

时间: 2024-10-13 22:44:30

java实现的简单词法分析器的相关文章

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

编译原理简单词法分析器(first,follow,分析表)源码下载

编译原理(简单词法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8.zip

二、Java语言的简单认识及Hello World示例

1. Java语言的简单认识 (1) Java有三个版本: a. JAVA SE (以前称J2SE):Standard Environment 标准版本: b. JAVA EE (以前称J2EE):Enterprise Environment 企业版: c. JAVA ME (以前称J2ME):Eicro Environment 微型版; (2) Java的安装目录 在前一讲中,提到安装目录中有两个文件夹,分别是jdk1.7.0_45和jre7.在"jdk1.7.0_45"文件夹的bi

java设计之简单的JAVA计算器

做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子....   ---> 代码: 1 package dialog_color; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.Container; 6 import java.awt.FlowLayout; 7 import jav

利用java实现一个简单的远程监控程序

一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端,而且程序保持启动. (2) 被监控端获取本机的屏幕截屏发图给监控端. (3) 监控端在本地窗口中显示被监控端发送过来的图像. (4) (2)(3)步骤重复执行,这时在监控端即可实时监视到被监控端的桌面操作了. 功能二,远程控制 (1) 必须要有监控端与被监控端,而且程序保持启动. (2) 在监控端监

Java发邮件简单实现

给出一个Java发送邮件的简单实现. 下载 Java代码   1.  接口 public interface MailSendServDu { public void sendEmail(String addressee, String subject, String content); } 2.  实现 import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.Mime

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (

java反射机制简单介绍

1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2.java反射的基础是Class类(注意不是小写的class),Class类实例代表着内存中的一份字节码.常见的获取Class类对象的方法例如以下(第一种为对象的方法,另外一种为类的方法): Dog dog = new Dog(); Class dogClass = dog.getClass();

java.util.Scanner简单应用

import java.util.Scanner; import java.io.*; public class FileScannerTest{ public static void main(String args[]){ //**************Scanner 的一般用 //1.public Scanner(InputStream source),利用InputStream 对象进行构造 Scanner myScanner1 = new Scanner(System.in); wh