[英]Basic lexical analyzer for addition and multiplication in Java
我想做一个非常简单的词法分析器,但是有点卡住了。 假设我只有两个算术运算(加法和乘法)和两个整数。 用两个操作数进行加法或乘法(顺序无关紧要,因为它是加法或乘法)。 例如,预期输入4 + 8作为输入"ADD 4 8"
。 以下是到目前为止我所做的。 我可以提取操作数,但奇怪的是,运算符不是"+"
或"*"
。 如前所述,我真的不知道该如何前进,并执行简单的添加或多步操作。谢谢您的帮助。
private static enum Type {
ADD, MUL, OPERAND
}
private static class Token<TokenType, TokenValue> {
private final TokenType type;
private final TokenValue value;
public Token(TokenType t, TokenValue value) {
this.type = t;
this.value = value;
}
public String toString() {
return "Token value: " + this.value + "\n" + "Token type: " + this.type;
}
}
private static String getOperand(String operand, int index) {
int i = index;
while (i < operand.length()) {
if (Character.isDigit(operand.charAt(i))) {
i++;
} else {
return operand.substring(index, i);
}
}
return operand.substring(index, i);
}
private static ArrayList<Token<Type, String>> lex(String expression) {
ArrayList<Token<Type, String>> tokens = new ArrayList<>();
for (int i = 0; i < expression.length(); i++) {
char currChar = expression.charAt(i);
switch (currChar) {
case '+':
tokens.add(new Token<>(Type.ADD, String.valueOf(currChar)));
i++;
break;
case '*':
tokens.add(new Token<>(Type.MUL, String.valueOf(currChar)));
i++;
break;
default:
if (Character.isWhitespace(currChar)) {
i++;
} else {
String operand = getOperand(expression, i);
i += operand.length();
tokens.add(new Token<>(Type.OPERAND, operand));
}
break;
}
}
return tokens;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Please enter an expression: ");
String input = scan.nextLine();
ArrayList<Token<Type, String>> tokens = lex(input);
for (Token token : tokens) {
System.out.println(token);
}
}
输入示例: "5+1"
输出:
Token value: 5
Token type: OPERAND
Token value: 1
Token type: OPERAND
在lex()
方法中,您要为每个标记增加字符位置额外的时间。 您在添加令牌后增加了,但是for
循环中也有增加。
例如,如果您输入的是“ 5 + 1”,则将“ 5”添加为OPERAND,相应地更新位置,然后for
循环跳过“ +”,下一个字符为“ 1”,并添加为另一个操作数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.