JAVA中的Switch语句不识别空格

3yhwsihp  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(126)

我试图弄清楚为什么我的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;
    }
}

提前感谢!如果信息丢失,让我知道!

nvbavucw

nvbavucw1#

因此,这些是修复问题的更改。我们正在查看getTokens()方法:

public List<Token> getTokens() throws Exception {
        List<Token> tokens = new ArrayList<>();
        if (this._cursor < this._input.length() != true) {
            return null;
        }
        while (this._cursor < this._input.length()) {
            char input = this._input.charAt(this._cursor);
            switch (input) {
                case ' ':
                case '\n':
                case '\t':
                    break;
                case '+':
//                    token = new Token(TokenType.PLUS, input);
                    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);
                    }
                    break;
            }
            this._cursor++;
        }
        tokens.add(new Token(TokenType.EOF, "EOF"));
        return tokens;
    }
}

我把

String input = this._input.substring(this._cursor);

在第一个while()循环中,并将其更改为:

char input = this._input.charAt(this._cursor);

相关问题