Java 实现《编译原理》简单词法分析功能

2020-12-13 01:56

阅读:389

标签:lin   并保存   port   trim   ram   des   out   ror   编译   

Java 实现《编译原理》简单词法分析功能

简易词法分析功能

要求及功能

(1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去)

{
  int a, b;
  a = 10;
  if(a>=1){
    b = a + 20;
  }
}

(2)词法识别分析表
单词类别|单词自身值|内部编码
-|-|-
关键字| int、for、while、do、return、break、continue| 1
标识符| 除关键字外的以字母开头,后跟字母、数字的字符序列| 2
常数| 无符号整型数| 3
运算符| +、-、*、/、>、=、 界限符| ,、;、{、}、(、)| 5
换行符|\n| 6

(3)输出结果:

(5,{)
(6,\n)
(1,int)
(2,a)
(5,,)
(2,b)
(5,;)
(6,\n)
(2,a)
(4,=)
(3,10)
(5,;)
(6,\n)
(2,if)
(5,()
(2,a)
(4,>=)
(3,1)
(5,))
(5,{)
(6,\n)
(2,b)
(4,=)
(2,a)
(4,+)
(3,20)
(5,;)
(6,\n)
(5,})
(6,\n)
(5,})
(6,\n)
(0,#)

并保存成新的 txt 文件

编程实现

(1)程序文件目录:

技术图片

(2)Word.java 文件:

package com.java997.analyzer.lexical;

/**
 * 

* 表示识别后的词实体类 * * @author XiaoPengwei * @since 2019-06-13 */ public class Word { /** * 种别码 */ private int typeNum; /** * 扫描得到的词 */ private String word; public int getTypeNum() { return typeNum; } public void setTypeNum(int typeNum) { this.typeNum = typeNum; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } }

(3)CodeScanner.java 文件:

package com.java997.analyzer.lexical;

/**
 * 

* 字符扫描 * * @author XiaoPengwei * @since 2019-06-13 */ public class CodeScanner { private static String _KEY_WORD_END = "end string of string"; private int charNum = 0; private Word word; private char[] input = new char[255]; private char[] token = new char[255]; private int p_input = 0; private int p_token = 0; private char ch; /** * 关键字数组 */ private String[] rwtab = {"int", "if", "while", "do", "return", "break", "continue", _KEY_WORD_END}; /** * 逻辑运算数组 */ private String[] logicTab = {"==",">=","= 'a' && ch = 'A' && ch = '0' && ch ' || ch == '

(4)MainAnalyzer.java 文件:

package com.java997.analyzer.lexical;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * 

* 执行主程序 * * @author XiaoPengwei * @since 2019-06-13 */ public class MainAnalyzer { private File inputFile; private File outputFile; private String fileContent; private ArrayList list = new ArrayList(); /** * 构造方法 * * @param input * @param output * @author XiaoPengwei */ public MainAnalyzer(String input, String output) { //实例化输入文件 inputFile = new File(input); //实例化输出文件 outputFile = new File(output); } /** * 从指定的 txt 文件中读取源程序文件内容 * * @return java.lang.String */ public String getContent() { StringBuilder stringBuilder = new StringBuilder(); try (Scanner reader = new Scanner(inputFile)) { while (reader.hasNextLine()) { String line = reader.nextLine(); stringBuilder.append(line + "\n"); System.out.println(line); } System.out.println("Successful reading of files:" + inputFile.getName()); } catch (FileNotFoundException e) { e.printStackTrace(); } return fileContent = stringBuilder.toString(); } /** * 然后扫描程序,在程序结束前将扫描到的词添加到 list 中 * 最后把扫描结果保存到指定的文件中 * * @param fileContent * @return void */ public void analyze(String fileContent) { int over = 1; Word word = new Word(); //调用扫描程序 CodeScanner scanner = new CodeScanner(fileContent.toCharArray()); System.out.println("The result:"); while (over != 0) { word = scanner.scan(); System.out.println("(" + word.getTypeNum() + "," + word.getWord() + ")"); list.add(word); over = word.getTypeNum(); } saveResult(); } /** * 将结果写入到到指定文件中 * 如果文件不存在,则创建一个新的文件 * 用一个 foreach 循环将 list 中的项变成字符串写入到文件中 */ public void saveResult() { //创建文件 if (!outputFile.exists()) { try { outputFile.createNewFile(); } catch (IOException e1) { e1.printStackTrace(); } } //写入文件 try (Writer writer = new FileWriter(outputFile)) { for (Word word : list) { writer.write("(" + word.getTypeNum() + " ," + word.getWord() + ")\n"); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { //注意输入文件路径/名称必须对, 输出文件可以由程序创建 MainAnalyzer analyzer = new MainAnalyzer("D:\\analyzer\\src\\main\\java\\com\\java997\\analyzer\\lexical\\input.txt", "D:\\analyzer\\src\\main\\java\\com\\java997\\analyzer\\lexical\\output.txt"); analyzer.analyze(analyzer.getContent()); } }

(5)input.txt 文件:

{
  int a, b;
  a = 10;
  if(a>=1){
    b = a + 20;
  }
}
#

执行测试

技术图片

Java 实现《编译原理》简单词法分析功能

标签:lin   并保存   port   trim   ram   des   out   ror   编译   

原文地址:https://www.cnblogs.com/xpwi/p/11020366.html


评论


亲,登录后才可以留言!