私は非常に単純な字句解析器を作りたいと思っていますが、ちょっと残っています。 私は2つの算術演算(加算と乗算)と2つの整数しか持っていないとしましょう。 2つのオペランドで加算または乗算が行われます(加算または乗算なので順序は関係ありません)。 例えば、入力"ADD 4 8"
として、4 + 8が期待されます。 以下は私がこれまで行ってきたことです。私はオペランドを抽出することができますが、奇妙なことにオペレータは"+"
または"*"
ではありません。 先に述べたように、私はどのように前進するのか本当に分かりませんし、単純な追加またはmulを実行します。あなたの助けに感謝します。入力のJavaでの加算と掛け算のための基本字句解析器
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"
出力:lex()
方法で
Token value: 5
Token type: OPERAND
Token value: 1
Token type: OPERAND
入力は何ですか?期待される成果は?観測される出力は何ですか?一般に、より複雑な式を分析する場合は、アルゴリズムを再帰的に設計することをお勧めします。 – Turing85
入力と出力を編集しました。少なくとも私は "+"がADDトークンとして認識されることを期待していましたが、そうではありません。さらなるステップは追加を実行することですが、私はまだ管理していません。 – loukios
これは単なる字句解析の問題ではありません。あなたは構文解析器と字句解析器が必要です。 「再帰的降下式構文解析器」またはDijkstra Shunting-yardアルゴリズムを調べる。 – EJP