`
给一理由先
  • 浏览: 24377 次
  • 性别: Icon_minigender_1
  • 来自: 衡阳
文章分类
社区版块
存档分类
最新评论

java词法分析器【自己改编的】

阅读更多

SrcAnalyse.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.JButton;

public class SrcAnalyse extends Frame implements ActionListener{
        int row = 1;
        int line = 1;
        
        public static JButton button1=new JButton("打开文件");
        public static JButton button2=new JButton("开始分析");
        public static JButton button3=new JButton("退出");
        
        TextArea text = new TextArea(15,60);         
        TextArea analyse_text = new TextArea(15,60);   

        int begin = 0;
        int end = 0;
        
    
        FileDialog file_dialog_load = new FileDialog(this, "打开文件", FileDialog.LOAD);
        SrcAnalyse(){
             
                this.setLayout(new FlowLayout());

                
                this.add(text);
                
                this.add(button1);//打开
                this.add(button2);//分析
                this.add(button3);//退出
                
                this.add(analyse_text);
                analyse_text.setText("分析信息如下: \n");
                
                button1.addActionListener(this);
                button2.addActionListener(this);
                button3.addActionListener(this);
                
                this.setSize(500, 650);
                this.setResizable(false);//设为窗口不可变
                this.setLocation(400,150);
                
                text.setEditable(true);
                analyse_text.setEditable(false);
                
                
                this.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                                System.exit(0);
                        }
                });
                
                this.setVisible(true);
        }
        
        public static void main(String[] args) {
                SrcAnalyse compiler = new SrcAnalyse();
                compiler.setTitle("词法分析程序v1.0——(C语言版)                    Power by luosng007");
        }

        public void actionPerformed(ActionEvent e){
                if(e.getSource() == button3){
                        System.exit(0);
                }else if(e.getSource() == button1){
                        file_dialog_load.setVisible(true);
      
                        File myfile = new File(file_dialog_load.getDirectory(), file_dialog_load.getFile());
                        try{   
                                BufferedReader bufReader = new BufferedReader(new FileReader(myfile));
                                String content = "";
                                String str;
                           
                                while((str = bufReader.readLine()) != null){
                                        content += str + "\n";
                                        text.setText(content);
                                }
                        }catch(IOException ie){
                                System.out.println("IOexception occurs...");
                        }
                }else if(e.getSource() == button2){
        
                	analyse_text.setText("");
                        row = 0;
                        line = 1;
                        analyse();
                }
        }
/**词法分析*/
        public void analyse(){
                String analyse_info = analyse_text.getText();
                String content = text.getText();
                String content1 ="";
             
                if(content.equals("")){
                	analyse_info += "Text is empty! You havn't input any code!\n";
                        analyse_text.setText(analyse_info);
                }
                
                else{
                        int i = 0;
                        int N = content.length();
                       
                        int state = 0;
                        
                       System.out.println(end);
                        
                        for(i = 0; i < N; i++){
                                row++;
                                char code;
                                char c = content.charAt(i);//当前读取字符
                                code = c;
                                System.out.print(code);
                                switch(state){
                                        case 0:
                                               
                                                if(c == ',' || c == ' ' || c == '\t' || c == '{' || c =='}' || c == '(' || c == ')' || c == ';' || c == '[' || c == ']')
                                                   { 
                                                     
                                                        if(isDigit(content.charAt(i - 1)) && isDigit(content.charAt(begin))){
                                                                end = i;
                                                                analyse_text.append("info:0 数值表达式:    " + content.substring(begin, end) +'\n');
                                                                
                                                        }                                                                                 
                                                        state = 0;
                                                }
                                                else if(c == '+') state = 1;
                                                else if(c == '-') state = 2;
                                                else if(c == '*') state = 3;
                                                else if(c == '/') state = 4;
                                                else if(c == '!') state = 5;
                                                else if(c == '>') state = 6;
                                                else if(c == '<') state = 7;
                                                else if(c == '=') state = 8;
                                                else if(((int)c) == 10) state = 9;//输入为回车
                                               
                                                                                               
                                                else if(isLetter(c)) {
                                                        state = 10;
                                                        begin = i;
                                                }
                                               //isDigit(int) 
                                                else if(isDigit(c)) {
                                                        begin = i;
                                                        state = 11;
                                                }
                                                else if(c == '#') state = 12;
                                                else if(c == '&') state = 14;
                                                else if(c == '|') state = 15;
                                                else if(c == '"') state = 16;
                                                else analyse_text.append("line: " + line + " row: " + row + " error: '" + c + "' Undefined character! \n");
                                                
                                                break;
                                        case 1://标识符为 + 
                                                //row++;
                                                if(c == '+'){
                                                        state = 0;
                                                        analyse_text.append("info:1 运算符'++':\n");
                                                }
                                                else if(c == '='){
                                                        state = 0;
                                                        analyse_text.append("info:1 运算符'+=':\n");
                                                }else{
                                                        state = 0;
                                                        analyse_text.append("info:1 运算符 '+':\n");
                                                        i--;
                                                        row--;
                                                }
                                                break;
                                        case 2://标志符为 - 
                                                if(c == '-')
                                                	analyse_text.append("info:2 运算符'--':\n");
                                                else if(c == '=')
                                                	analyse_text.append("info:2 运算符'-=':\n");
                                                else{
                                                	analyse_text.append("info:2 运算符'-':\n");
                                                        i--;
                                                        row--;
                                                }
                                                state = 0;
                                                break;
                                        case 3://运算符 *
                                                if(c == '=')
                                                	analyse_text.append("info:3 运算符  '*=':\n");
                                                else{
                        	                        analyse_text.append("info:3 运算符  '*':\n");
                                                        i--;
                                                        row--;
                                                }
                                                state = 0;
                                                break;
                                        case 4://运算符 / 
                                                if(c == '/'){
                                                  if((c=content.charAt(i+1))=='*')
                                                   state=3;
                                                   
                                                  else{
                                                	  while((c) != '\n'){
                                                		  c=content.charAt(i);
                                                		  i++;
                                           }
                                     
                                      System.out.println("");
                                      c = content.charAt(i);
                                                        state = 0;
                                                        analyse_text.append("info:4 注释部分  //: \n");
                                                                                                          }
                                                }else if(c == '='){
                                                        state = 0;
                                                        analyse_text.append("info:4 运算符  /= :\n");
                                                }else{
                                                        state = 0;
                                                        analyse_text.append("info:4 运算符  / :\n");
                                                        i--;
                                                        row--;
                                                }
                                                
                                                break;
                                        case 5://运算符 ! 
                                                if(c == '='){
                                                	analyse_text.append("info:5 运算符  != :\n");
                                                        state = 0;
                                                }else{
                                                        state = 0;
                                                        i--;
                                                        row--;
                                                        analyse_text.append("info:5 运算符 !: \n");
                                                }
                                                
                                                break;
                                        case 6://运算符 >
                                                if(c == '='){
                                                	analyse_text.append("info:6 运算符  >= :\n");
                                                        state = 0;
                                                }else{
                                                        state = 0;
                                                        analyse_text.append("info:6 运算符   >: \n");
                                                }
                                                
                                                break;
                                        case 7://运算符 < 
                                                if(c == '='){
                                                	analyse_text.append("info:7 运算符 <= :\n");
                                                        state = 0;
                                                }else{
                                                        state = 0;
                                                        analyse_text.append("info:7 运算符  <: \n");
                                                }
                                                break;
                                        case 8://运算符 =
                                                if(c == '='){
                                                	analyse_text.append("info:8 运算符 == :\n");
                                                        state = 0;
                                                }else{
                                                        state = 0;
                                                        analyse_text.append("info:8 运算符 = :\n");
                                                }
                                                break;
                                        case 9://回车  
                                                 state = 0;
                                                 row = 1;
                                                 line ++;
                                                 analyse_text.append("info:9 回车 : \n");
                                                break;
                                        case 10:// 字母
                                                if(isLetter(c) || isDigit(c)){
                                                        state = 10;
                                                }else{
                                                        end = i;
                                                        String id = content.substring(begin, end);
                                                        if(isKey(id))
                                                        	analyse_text.append("info:关键字 : "+id+'\n');
                                                                //error_text.appendText("info  ? :   10" + id + '\n');
                                                        else
                                                        	analyse_text.append("info:标识符  :" + id + '\n');
                                                        i--;
                                                        row--;
                                                        state = 0;
                                                }
                                                
                                                break;
                                        case 11:// 数字
                                                if(c == 'e' || c == 'E')
                                                        state = 13;
                                                else if(isDigit(c) || c == '.'){
                                                       
                                                }else {
                                                        if(isLetter(c)){
                                                        	analyse_text.append("error: line " + line + " row " + row + " ????\n");
                                                        }
                                                        //i--;
                                                        //row--;
                                                        int temp = i;
                                                        i = find(i,content);
                                                        row += (i - temp);
                                                        state = 0;
                                                }
                                                break;
                                        case 12://标识符为#
                                                String id = "";
                                                while(c != '<'){
                                                        id += c;
                                                        i++;
                                                        c = content.charAt(i);
                                                        System.out.print(c);
                                                        
                                                }
                                                if(id.trim().equals("include")){
                                                        while(c != '>' && ( c != '\n')){
                                                                i++;
                                                                c = content.charAt(i);
                                                                System.out.print(c);
                                                        }
                                                        if(c == '>')
                                                        	analyse_text.append("info # :12 :  \n");
                                                   }else
                                                	   analyse_text.append("error: " + "line " + line + ", row " + row + " ?\n");
                                               
                                                state = 0;
                                                break;
                                        case 13:// 检测指数表示方式
                                                if(c == '+' || c == '-' || isDigit(c)){
                                                        i++;
                                                        c = content.charAt(i);
                                                        while(isDigit(c)){
                                                                i++;
                                                                c = content.charAt(i);
                                                        }
                                                        if(isLetter(c) || c == '.'){
                                                        	analyse_text.append("error line " + line + " row " + row + "指数格式错误!\n");
                                                                state = 0;
                                                                int temp = i;
                                                                i = find(i,content);
                                                                row += (i - temp);
                                                               
                                                        }else{
                                                                end = i;
                                                                analyse_text.append("info:13 指数: " + content.substring(begin, end) + '\n');
                                                        }
                                                       
                                                        state = 0;
                                                }
                                                break;
                                        case 14://&&
                                                if(c == '&')
                                                	analyse_text.append("info:14 '&' :   \n");
                                                else{
                                                        i--;
                                                        analyse_text.append("info:14 '&&' : \n");
                                                }
                                                state = 0;
                                                break;
                                        case 15://||
                                                if(c == '|')
                                                	analyse_text.append("info:15 '||': \n");
                                                else{
                                                        i--;
                                                        analyse_text.append("info:15 '|':  \n");
                                                }
                                                state = 0;
                                                break;
                                        case 16://""
                                        	analyse_text.append("info:16 引号 :"+ '"' + '\n');
                                                i--;
                                                state = 0;
                                                break;
                                }
                          
                        }
                      
                }
                
                analyse_text.append("分析完成  \r\n");

        }
/**判定是否字母*/
        boolean isLetter(char c){
                if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
                        return true;
                return false;
        }
/**判定是否数字*/
        boolean isDigit(char c){
                if(c >= '0' && c <= '9') return true;
                return false;
        }
/**判定是否关键字*/
        boolean isKey(String str){
                if(
                		str.equals("char") || str.equals("double") || str.equals("enum") || str.equals("float") 
                	||  str.equals("int") || str.equals("long") || str.equals("short") || str.equals("signed") 
                	|| str.equals("struct")||str.equals("void") || str.equals("unsigned") || str.equals("union") 
                	|| str.equals("for") || str.equals("do") || str.equals("while") || str.equals("break") 
                	|| str.equals("continue") || str.equals("if")||str.equals("else")||str.equals("goto")
                    || str.equals("switch") || str.equals("case") || str.equals("default") || str.equals("return") 
                    || str.equals("auto")||str.equals("extern")||str.equals("register")||str.equals("static")
                    ||str.equals("const")||str.equals("sizeof")||str.equals("typedef")||str.equals("volatile")
                    )
                        return true;
                return false;
        }

/**寻找分隔符空格、括号、回车*/
        int find(int begin, String str){
                if(begin >= str.length())
                        return str.length();
                for(int i = begin; i < str.length(); i++){
                        char c = str.charAt(i);
                        if(c == '\n' || c == ',' || c == ' ' || c == '\t' || c == '{' || c =='}' || c == '(' || c == ')' || c == ';' || c == '=' || c == '+'|| c == '-' || c == '*' || c == '/')
                                return i - 1;
                }
                return str.length();
        }
}
分享到:
评论

相关推荐

    java词法分析器java词法分析器.doc

    Java 词法分析器 Java 词法分析器是 Java 程序设计语言的词法分析工具,用于对 Java 源代码进行词法分析。以下是 Java 词法分析器的知识点: 1. Java 词法分析器的组成部分 Java 词法分析器由多个组成部分组成,...

    java词法分析器源代码

    Java词法分析器是编程语言解析过程中的关键组件,它主要负责将源代码文本转换成一系列有意义的符号或记号,这些符号可以被后续的语法分析器(也称为解析器)理解和处理。在这个特定的“java词法分析器源代码”压缩包...

    java词法分析器

    本词法分析器能分析出java中常见的大部分字符,比如说运算符,界符,常量等等。对一些错误的字符也能读取出来,比如说非法运算符,非法标识符,非法浮点型等等。另外,本词法分析器对java中的注释也进行了处理,解析...

    java 实现词法分析器以及语法分析器

    本文将详细介绍使用Java实现词法分析器和语法分析器的相关知识点。 词法分析,也称为扫描或Tokenization,是编译器前端的第一步。它的主要任务是读取源代码字符串,识别并生成一系列的符号或Token,这些Token代表了...

    基于java实现的语法分析器及词法分析器

    在这个项目中,我们关注的是一个基于Java实现的语法分析器和词法分析器。Java是一种广泛使用的编程语言,具有跨平台、面向对象和丰富的类库等特性,使得它成为构建这种复杂工具的理想选择。 首先,让我们深入了解...

    java词法分析器源码

    这个是java词法分析器,包含全部的源码,我以前提交的只有一些源代码,不好意思。和其他的词法分析器不同,这个包含了图形模拟功能。就是能够把整个字符匹配过程显示出来。 &lt;br&gt; 我希望大家使用了后,能够提出...

    JAVA版的JAVA词法分析器

    JAVA版的JAVA词法分析器是一种用于解析JAVA源代码的工具,它主要负责将源代码文本转换成一系列有意义的标记,这一过程被称为词法分析或扫描。词法分析器是编译器或解释器的第一步,它将源代码分解成词汇单元,为后续...

    Java词法分析器——C语言实现

    Java词法分析器是编程语言编译器或解释器的关键组成部分,它负责将源代码转换成可供解析器处理的标记序列。在这个特定的案例中,我们讨论的是一个使用C语言手动实现的Java词法分析器,而非依赖于像LEX这样的自动化...

    基于C语言的java词法分析器

    Java词法分析器是编程语言编译器或解释器的关键组成部分,主要负责将源代码转换成可供解析器处理的标记序列。在这个基于C语言实现的Java词法分析器中,我们探讨的核心技术包括C语言编程、正则表达式、有穷自动机...

    java 词法分析器

    Java 词法分析器是计算机科学领域中编程语言编译器或解释器的重要组成部分,它在编译原理课程中占有核心地位。词法分析器,也称为扫描器或 tokenizer,负责将源代码文本分解成一系列有意义的符号,这些符号被称为...

    简易java词法分析器

    本项目名为“简易java词法分析器”,它是一个基于Java实现的工具,用于分析Java源代码的词法结构。在这个项目中,开发者可能使用了类似于C++的编程技巧,因为C++也是一种常见的编程语言,它与Java有诸多相似之处。...

    java词法分析举例

    3. **词法分析器生成器**:如JFlex,这是一个用于生成Java词法分析器的工具。通过提供一套定义词法规则的规范文件(通常以`.flex`扩展名),JFlex能够自动生成一个Java类,该类可以读取输入源代码并产生相应的token...

    词法分析器Java语言编写(附实验报告)

    在Java语言中编写词法分析器,我们可以利用正则表达式库或者自定义的解析算法。正则表达式是定义词法规则的强大工具,能够方便地匹配各种字符模式。而自定义算法则可能涉及到状态机的设计,通过维护一系列的状态来...

    java词法分析器_ - Java - Java_开发文档.rar_java 词法分析_java词法分析_词法分析_词法分析 j

    10. **java词法分析器_ - Java - Java_开发文档.files**:这个文件夹通常包含与主文档相关的其他文件,如源代码、示例、图片等,对于深入理解Java词法分析可能会非常有用。 通过以上内容,我们可以看到Java词法分析...

    java词法分析器(C语言)

    Java词法分析器是编译器设计中的一个重要组成部分,它主要负责将源代码转换成一个个称为“标记”(Token)的单元,为后续的语法分析和语义分析提供基础。在C语言中实现一个Java词法分析器,需要对编译原理有深入的...

    编译原理实验词法分析器 java语言版

    本实验是基于Java语言实现的一个词法分析器,主要关注对小数和科学记数法的识别。 首先,我们需要了解词法分析的基本概念。词法分析器(也称为扫描器或词法规则器)的任务是从源代码中读取字符流,并根据预定义的...

    java_cifa.rar_java 词法分析_java 词法分析器_词法分析器 java

    在Java编程中,词法分析器(也称为扫描器或词法分析器)扮演着至关重要的角色,它从源代码文件中识别出一系列有意义的、独立的单元——记号(Token)。这些记号是程序语法结构的基本构建块,如关键字、标识符、...

Global site tag (gtag.js) - Google Analytics