用java写一个词法分析
时间: 2023-06-18 16:02:37 浏览: 44
好的,下面是一个简单的 Java 词法分析器的示例代码:
```java
import java.util.ArrayList;
import java.util.List;
public class Lexer {
private final String input;
private int position;
private final List<Token> tokens;
public Lexer(String input) {
this.input = input;
this.position = 0;
this.tokens = new ArrayList<>();
}
public List<Token> tokenize() {
while (position < input.length()) {
char currentChar = input.charAt(position);
if (Character.isDigit(currentChar)) {
tokenizeNumber();
} else if (Character.isLetter(currentChar)) {
tokenizeIdentifier();
} else if (currentChar == '+') {
tokens.add(new Token(TokenType.PLUS, "+"));
position++;
} else if (currentChar == '-') {
tokens.add(new Token(TokenType.MINUS, "-"));
position++;
} else if (currentChar == '*') {
tokens.add(new Token(TokenType.ASTERISK, "*"));
position++;
} else if (currentChar == '/') {
tokens.add(new Token(TokenType.SLASH, "/"));
position++;
} else if (currentChar == '(') {
tokens.add(new Token(TokenType.LEFT_PAREN, "("));
position++;
} else if (currentChar == ')') {
tokens.add(new Token(TokenType.RIGHT_PAREN, ")"));
position++;
} else {
throw new RuntimeException("Invalid character: " + currentChar);
}
}
return tokens;
}
private void tokenizeNumber() {
StringBuilder sb = new StringBuilder();
while (position < input.length() && Character.isDigit(input.charAt(position))) {
sb.append(input.charAt(position));
position++;
}
tokens.add(new Token(TokenType.NUMBER, sb.toString()));
}
private void tokenizeIdentifier() {
StringBuilder sb = new StringBuilder();
while (position < input.length() && Character.isLetter(input.charAt(position))) {
sb.append(input.charAt(position));
position++;
}
tokens.add(new Token(TokenType.IDENTIFIER, sb.toString()));
}
}
```
这个词法分析器可以识别简单的加减乘除表达式和标识符,它将输入字符串转换为一系列的 Token 对象。Token 类型定义如下:
```java
public enum TokenType {
NUMBER,
IDENTIFIER,
PLUS,
MINUS,
ASTERISK,
SLASH,
LEFT_PAREN,
RIGHT_PAREN
}
```
Token 类定义如下:
```java
public class Token {
private final TokenType type;
private final String value;
public Token(TokenType type, String value) {
this.type = type;
this.value = value;
}
public TokenType getType() {
return type;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return String.format("(%s, %s)", type, value);
}
}
```
下面是一个简单的测试程序:
```java
public class Main {
public static void main(String[] args) {
Lexer lexer = new Lexer("1+2*3");
List<Token> tokens = lexer.tokenize();
System.out.println(tokens);
}
}
```
输出结果为:
```
[(NUMBER, 1), (PLUS, +), (NUMBER, 2), (ASTERISK, *), (NUMBER, 3)]
```