基于java的简单词法分析程序

今天老师要我们写一个简单的词法分析程序,实现简单的词法分析。经过我一个下午的努力,下面的简单词法分析就出来了。(本人实力有限,目前只能做到这样了。🥺)

import java.io.FileReader;

/**
 * 基于Java词法分析程序
 * author:微笑伯爵
 * data:2021.10.26
 */
public class Compile {

    /**
     * 程序要求识别如下:
     *
     * 识别保留字:begin  end  if  then  else  while  do
     * 单词种别码为:1     2   3    4     5      6    7
     * <p>
     * 数字的种别码为:8
     * <p>
     * 单词种别码为:9
     * <p>
     * 特殊字符包括 : ,    ;    {   }   (    )
     * 种别码为:     10   11   12  13  14   15
     * <p>
     * 运算符包括: +   -   *   /    <    >   <=  =    >=  <>
     * 种别码为:   16  17   18  19   20  21  22  23   24  25
     */
    private static String[] key = {"begin", "end", "if", "then", "else", "while", "do"};//待识别的关键字数组
    private static String[] border = {",", ";", "{", "}", "(", ")"};//待识别的特殊字符数组
    private static String[] arithmetic = {"+", "-", "*", "/"};//待识别的算数运算数组
    private static String[] relation = {"<", ">", "<=", "=", ">=", "<>"};//待识别的逻辑运算数组
    private static String[] constNumber = new String[20];//用于存储用户自己定义的常数
    private static String[] label = new String[20];//用于存储用户自己定义的单词
    private static int constNum = 0;//动态记录用户定义的整形数个数
    private static int labelNum = 0;//动态记录用户定义的单词个数
    private static FileReader fileReader = null;//全局字符流

    public static void main(String[] args) throws Exception {
        String fileName = "D:\\Project\\JavaDemo\\text
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
词法分析是编译原理的一个重要内容,它的主要任务是将输入的源程序分割成一个一个的单词,同时识别出每个单词的类别,生成记号流作为后续语法分析的输入。在使用高级语言进行词法分析时,我们通常会使用正则表达式和有限自动机来实现。 下面是一个基于 Java简单词法分析器的示例代: ```java import java.util.regex.*; public class LexicalAnalyzer { private String input; // 输入的源程序 private int pos = 0; // 当前读取到的位置 // 定义正则表达式 private static final Pattern ID_PATTERN = Pattern.compile("[a-zA-Z][a-zA-Z0-9]*"); private static final Pattern NUM_PATTERN = Pattern.compile("[0-9]+"); private static final Pattern OP_PATTERN = Pattern.compile("[+\\-*/]"); // 构造函数 public LexicalAnalyzer(String input) { this.input = input; } // 获取下一个记号 public Token getNextToken() { while (pos < input.length()) { char c = input.charAt(pos); if (Character.isWhitespace(c)) { pos++; continue; // 跳过空白字符 } Matcher idMatcher = ID_PATTERN.matcher(input.substring(pos)); if (idMatcher.lookingAt()) { String lexeme = idMatcher.group(); pos += lexeme.length(); return new Token(TokenType.ID, lexeme); } Matcher numMatcher = NUM_PATTERN.matcher(input.substring(pos)); if (numMatcher.lookingAt()) { String lexeme = numMatcher.group(); pos += lexeme.length(); return new Token(TokenType.NUM, lexeme); } Matcher opMatcher = OP_PATTERN.matcher(input.substring(pos)); if (opMatcher.lookingAt()) { String lexeme = opMatcher.group(); pos += lexeme.length(); return new Token(TokenType.OP, lexeme); } throw new RuntimeException("Invalid token at position " + pos); } return new Token(TokenType.EOF, ""); // 返回结束标记 } // 测试代 public static void main(String[] args) { String input = "x = 1 + 2 * y"; LexicalAnalyzer lexer = new LexicalAnalyzer(input); Token token; do { token = lexer.getNextToken(); System.out.println(token); } while (token.getType() != TokenType.EOF); } } // 记号类型枚举 enum TokenType { ID, // 标识符 NUM, // 数字 OP, // 运算符 EOF // 结束标记 } // 记号类 class Token { private TokenType type; // 记号类型 private String lexeme; // 记号对应的字符串 public Token(TokenType type, String lexeme) { this.type = type; this.lexeme = lexeme; } public TokenType getType() { return type; } public String getLexeme() { return lexeme; } @Override public String toString() { return String.format("(%s, %s)", type, lexeme); } } ``` 在这个示例,我们定义了三个正则表达式分别用于匹配标识符、数字和运算符。在 `getNextToken()` 方法,我们使用 `Matcher` 类来进行匹配,如果匹配成功则返回相应的记号。如果无法匹配任何记号,则抛出异常。 `main()` 方法我们将输入的源程序作为参数传入词法分析器,并依次输出每个记号的类型和字符串。 当我们使用 `LexicalAnalyzer` 类进行词法分析时,可以按照以下步骤进行: 1. 创建 `LexicalAnalyzer` 类的实例,将源程序作为参数传入; 2. 重复调用 `getNextToken()` 方法直到返回的记号类型为 `EOF`; 3. 对于每个记号,根据其类型进行相应的处理。 这样就完成了一个简单的基于 Java词法分析器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⊙魏振⊙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值