簡體   English   中英

Java中用於加法和乘法的基本詞法分析器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM