Java词法分析程序简介

什么是词法分析?

在计算机科学中,词法分析(Lexical Analysis)是将一段文本分割为一个个单独的词素(Token)的过程。词素是程序中的最小语法单位,比如关键字、标识符、运算符、常量等。词法分析是编译过程中的第一个阶段,其目的是将源代码转化为有意义的词汇单位,以供后续的语法分析和语义分析使用。

Java词法分析程序示例

下面是一个简单的Java词法分析程序示例,使用了Java语言自带的正则表达式库:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Lexer {
    private String input;
    private int currentPos;

    public Lexer(String input) {
        this.input = input;
        this.currentPos = 0;
    }

    public Token getNextToken() {
        if (currentPos >= input.length()) {
            return null;
        }

        Pattern pattern = Pattern.compile("\\s+");
        Matcher matcher = pattern.matcher(input);
        matcher.region(currentPos, input.length());
        if (matcher.lookingAt()) {
            currentPos = matcher.end();
            return getNextToken();
        }

        pattern = Pattern.compile("\\b(\\w+)\\b");
        matcher = pattern.matcher(input);
        matcher.region(currentPos, input.length());
        if (matcher.lookingAt()) {
            currentPos = matcher.end();
            return new Token("IDENTIFIER", matcher.group(1));
        }

        pattern = Pattern.compile("\\d+");
        matcher = pattern.matcher(input);
        matcher.region(currentPos, input.length());
        if (matcher.lookingAt()) {
            currentPos = matcher.end();
            return new Token("NUMBER", matcher.group());
        }

        pattern = Pattern.compile("[+\\-*/]");
        matcher = pattern.matcher(input);
        matcher.region(currentPos, input.length());
        if (matcher.lookingAt()) {
            currentPos = matcher.end();
            return new Token("OPERATOR", matcher.group());
        }

        currentPos++;
        return new Token("UNKNOWN", input.substring(currentPos - 1, currentPos));
    }
}

class Token {
    private String type;
    private String value;

    public Token(String type, String value) {
        this.type = type;
        this.value = value;
    }

    public String getType() {
        return type;
    }

    public String getValue() {
        return value;
    }
}

以上代码实现了一个简单的词法分析器,可以将输入的字符串分割为不同类型的词素,比如标识符、数字、运算符等。

代码解析

  • Lexer类是词法分析器的主要部分,它接受一个输入字符串,并提供getNextToken()方法来获取下一个词素。在类的构造函数中,初始化了输入字符串和当前位置。

  • getNextToken()方法首先检查当前位置是否已经超过输入字符串的长度,如果是,则返回null,表示没有更多的词素了。

  • 然后,使用正则表达式库中的PatternMatcher来匹配不同类型的词素。首先使用\s+匹配空白字符,并跳过它们。然后,使用\b(\w+)\b匹配标识符,并返回一个IDENTIFIER类型的词素。接着,使用\d+匹配数字,并返回一个NUMBER类型的词素。最后,使用[+\-*/]匹配运算符,并返回一个OPERATOR类型的词素。如果没有匹配到任何类型的词素,则返回一个UNKNOWN类型的词素。

  • Token类表示一个词素,它包含一个类型和一个值。

如何使用词法分析程序

使用以上的词法分析程序很简单,只需要创建一个Lexer对象,并调用其getNextToken()方法来逐个获取词素即可。下面是一个示例:

public class Main {
    public static void main(String[] args) {
        String input = "int x = 10 + 20;";
        Lexer lexer = new Lexer(input);

        Token token;
        while ((token = lexer.getNextToken()) != null) {
            System.out.println("Type: " + token.getType() + ", Value: " + token.getValue());
        }
    }
}

以上示例将输出如下结果:

Type: IDENTIFIER, Value: int
Type: IDENTIFIER, Value: x
Type: OPERATOR,