我试图弄清楚为什么我的switch语句不能识别空格或“+”运算符。
我正在尝试通过字符串/流输入。
我有一个光标,它可以跟踪我们在字符串/流输入中的位置。在下面的代码中,程序将按预期工作(通过数字),直到光标达到值“2”,这意味着光标在字符串/流输入中的空白处。
我创建了一个原始字符串的子字符串,这样我就可以使用它来切换一个字符。
正如我所说的,当光标点击2,数字“10”已经过去了(输入是:“10 + 15 *(10 + 3 * 3 - 2)”),它给了我一个白色的空白。所以光标将无法识别空白,不会前进到“+”运算符。它甚至告诉我在错误中,“期望一个有效的令牌在位置:2”。
主要:
import Class.Parser;
import Class.Lexer;
import Model.Token;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
Lexer lexer = new Lexer("10 + 15 * (10 + 3 * 3 - 2)");
List <Token> tokens = lexer.getTokens();
}
}
Lexer类:
package Class;
import Model.Spec;
import Model.Token;
import Model.TokenType;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.ToIntFunction;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lexer {
private String _input;
private int _cursor;
public Lexer() {
this._cursor = 0;
}
public Lexer(String _Input) {
this._input = _Input;
this._cursor = 0;
}
public List<Token> getTokens() throws Exception {
List<Token> tokens = new ArrayList<>();
if (this._cursor < this._input.length() != true) {
return null;
}
String input = this._input.substring(this._cursor);
while (this._cursor < this._input.length()) {
switch (input) {
case "":
case "\n":
case "\t":
case "\s":
break;
case "+":
tokens.add(new Token(TokenType.PLUS, "+"));
break;
case "-":
tokens.add(new Token(TokenType.MINUS, "-"));
break;
case "*":
tokens.add(new Token(TokenType.MULTIPLY, "*"));
break;
case "/":
tokens.add(new Token(TokenType.DIVIDE, "/"));
break;
case "(":
tokens.add(new Token(TokenType.HAAKJEOPEN, "("));
break;
case ")":
tokens.add(new Token(TokenType.HAAKJESLUIT, ")"));
break;
default:
if (Character.isDigit(this._input.charAt(this._cursor))) {
StringBuilder number = new StringBuilder();
while (this._cursor < this._input.length() && Character.isDigit(this._input.charAt(this._cursor))) {
number.append(this._input.charAt(this._cursor));
this._cursor++;
}
tokens.add(new Token(TokenType.NUMERICAL, number.toString()));
this._cursor--;
}
else {
throw new Exception("Expected a valid token at position:" + " " + this._cursor);
}
}
this._cursor++;
}
tokens.add(new Token(TokenType.EOF, "EOF"));
return tokens;
}
}
提前感谢!如果信息丢失,让我知道!
1条答案
按热度按时间nvbavucw1#
因此,这些是修复问题的更改。我们正在查看getTokens()方法:
我把
在第一个while()循环中,并将其更改为: