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
,表示没有更多的词素了。 -
然后,使用正则表达式库中的
Pattern
和Matcher
来匹配不同类型的词素。首先使用\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,