用java来实现词法分析器
时间: 2024-05-17 21:19:01 浏览: 16
好的,我可以为您提供一个简单的Java实现示例:
首先,我们需要定义一个Token类来表示标记:
```java
public class Token {
private TokenType type;
private String value;
public Token(TokenType type, String value) {
this.type = type;
this.value = value;
}
public TokenType getType() {
return type;
}
public String getValue() {
return value;
}
}
```
然后,我们需要定义一个枚举类型来表示标记类型:
```java
public enum TokenType {
INTEGER,
PLUS,
MINUS,
MULTIPLY,
DIVIDE,
LPAREN,
RPAREN,
EOF
}
```
接下来,我们需要定义一个词法分析器类来扫描输入字符串并产生标记:
```java
public class Lexer {
private String input;
private int position;
public Lexer(String input) {
this.input = input;
this.position = 0;
}
private char peek() {
if (position >= input.length()) {
return '\0';
}
return input.charAt(position);
}
private void advance() {
position++;
}
private void skipWhiteSpace() {
while (Character.isWhitespace(peek())) {
advance();
}
}
private int readInteger() {
int start = position;
while (Character.isDigit(peek())) {
advance();
}
return Integer.parseInt(input.substring(start, position));
}
public Token getNextToken() {
while (peek() != '\0') {
if (Character.isWhitespace(peek())) {
skipWhiteSpace();
continue;
}
if (Character.isDigit(peek())) {
return new Token(TokenType.INTEGER, Integer.toString(readInteger()));
}
switch (peek()) {
case '+':
advance();
return new Token(TokenType.PLUS, "+");
case '-':
advance();
return new Token(TokenType.MINUS, "-");
case '*':
advance();
return new Token(TokenType.MULTIPLY, "*");
case '/':
advance();
return new Token(TokenType.DIVIDE, "/");
case '(':
advance();
return new Token(TokenType.LPAREN, "(");
case ')':
advance();
return new Token(TokenType.RPAREN, ")");
default:
throw new IllegalArgumentException("Invalid character: " + peek());
}
}
return new Token(TokenType.EOF, "");
}
}
```
现在我们可以使用Lexer类来扫描输入字符串并产生标记:
```java
public static void main(String[] args) {
String input = "3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3";
Lexer lexer = new Lexer(input);
Token token;
do {
token = lexer.getNextToken();
System.out.println(token.getType() + ": " + token.getValue());
} while (token.getType() != TokenType.EOF);
}
```
输出结果将是:
```
INTEGER: 3
PLUS: +
INTEGER: 4
MULTIPLY: *
INTEGER: 2
DIVIDE: /
LPAREN: (
INTEGER: 1
MINUS: -
INTEGER: 5
RPAREN: )
POWER: ^
INTEGER: 2
POWER: ^
INTEGER: 3
EOF:
```
希望这个简单的示例代码可以帮助您了解如何用Java实现词法分析器。