请用Java实现一个词法分析器
时间: 2024-02-09 14:10:50 浏览: 82
好的,以下是一个简单的Java词法分析器的实现:
```java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lexer {
private String input;
private int currentPosition;
public Lexer(String input) {
this.input = input;
this.currentPosition = 0;
}
private static final Pattern WHITESPACE = Pattern.compile("\\s");
private static final Pattern NUMBER = Pattern.compile("\\d+");
private static final Pattern OPERATOR = Pattern.compile("[+\\-*/]");
public Token getNextToken() {
if (currentPosition >= input.length()) {
return null;
}
Matcher matcher;
matcher = WHITESPACE.matcher(input.substring(currentPosition));
if (matcher.lookingAt()) {
currentPosition += matcher.end();
return getNextToken();
}
matcher = NUMBER.matcher(input.substring(currentPosition));
if (matcher.lookingAt()) {
String value = matcher.group();
currentPosition += value.length();
return new Token(Token.Type.NUMBER, value);
}
matcher = OPERATOR.matcher(input.substring(currentPosition));
if (matcher.lookingAt()) {
String value = matcher.group();
currentPosition += value.length();
return new Token(Token.Type.OPERATOR, value);
}
throw new RuntimeException("Invalid input: " + input.substring(currentPosition));
}
}
```
以上代码实现了一个简单的词法分析器,它能够处理数字和四则运算符号。在构造函数中传入输入字符串,然后通过`getNextToken()`方法逐个获取token。每个Token都有一个类型和对应的值,其中类型包括`NUMBER`和`OPERATOR`两种。
这个例子中,我们使用了正则表达式来匹配输入字符串中的数字和运算符。在`getNextToken()`方法中,先匹配空格符,如果匹配成功就跳过;然后匹配数字,如果匹配成功就返回`NUMBER`类型的Token;最后匹配运算符,如果匹配成功就返回`OPERATOR`类型的Token。如果输入字符串不匹配任何类型则抛出异常。
这只是一个简单的例子,实际上词法分析器的实现还需要考虑更多的情况,比如变量名、括号、关键字等等,但是基本思路都是一样的。
阅读全文