用Java写一个词法分析器
时间: 2024-03-17 13:41:17 浏览: 17
好的,下面是一个简单的Java词法分析器示例,用于识别并分类输入的代码中的各种词法单元(如保留字、标识符、常数、运算符和分隔符)。
```
import java.util.*;
public class Lexer {
// 保留字列表
private static final String[] keywords = {"abstract", "boolean", "break", "byte", "case", "catch", "char", "class",
"const", "continue", "default", "do", "double", "else", "extends", "final",
"finally", "float", "for", "goto", "if", "implements", "import",
"instanceof", "int", "interface", "long", "native", "new", "package",
"private", "protected", "public", "return", "short", "static",
"strictfp", "super", "switch", "synchronized", "this", "throw", "throws",
"transient", "try", "void", "volatile", "while"};
// 分隔符列表
private static final String[] separators = {"{", "}", "(", ")", ";", ",", ".", "[", "]"};
// 运算符列表
private static final String[] operators = {"+", "-", "*", "/", "%", "<", "<=", ">", ">=", "==", "!=", "&&", "||",
"!", "&", "|", "^", "~", "<<", ">>", ">>>"};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
List<String> tokens = new ArrayList<>();
String currentToken = "";
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isWhitespace(ch)) {
// 遇到空格,将之前的词法单元存入列表中
if (!currentToken.equals("")) {
tokens.add(currentToken);
currentToken = "";
}
} else if (isSeparator(ch)) {
// 遇到分隔符,将之前的词法单元存入列表中,并添加分隔符
if (!currentToken.equals("")) {
tokens.add(currentToken);
currentToken = "";
}
tokens.add(String.valueOf(ch));
} else if (isOperator(ch)) {
// 遇到运算符,将之前的词法单元存入列表中,并添加运算符
if (!currentToken.equals("")) {
tokens.add(currentToken);
currentToken = "";
}
currentToken += ch;
if (i < input.length() - 1 && isOperator(input.charAt(i + 1))) {
// 如果后面还有运算符,继续添加
currentToken += input.charAt(i + 1);
i++;
}
tokens.add(currentToken);
currentToken = "";
} else {
// 其他情况,添加到当前的词法单元中
currentToken += ch;
}
}
// 处理最后一个词法单元
if (!currentToken.equals("")) {
tokens.add(currentToken);
}
// 输出词法单元列表
System.out.println(tokens.toString());
}
// 判断字符是否为分隔符
private static boolean isSeparator(char ch) {
for (String sep : separators) {
if (ch == sep.charAt(0)) {
return true;
}
}
return false;
}
// 判断字符是否为运算符
private static boolean isOperator(char ch) {
for (String op : operators) {
if (ch == op.charAt(0)) {
return true;
}
}
return false;
}
}
```
以上代码示例实现了一个简单的词法分析器,可以将输入的代码字符串拆分为一个个词法单元,并分类为保留字、标识符、常数、运算符和分隔符等。你可以根据需要进行修改和完善。