2016-05-17 12 views
0

私は非常に単純な字句解析器を作りたいと思っていますが、ちょっと残っています。 私は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 
+0

入力は何ですか?期待される成果は?観測される出力は何ですか?一般に、より複雑な式を分析する場合は、アルゴリズムを再帰的に設計することをお勧めします。 – Turing85

+0

入力と出力を編集しました。少なくとも私は "+"がADDトークンとして認識されることを期待していましたが、そうではありません。さらなるステップは追加を実行することですが、私はまだ管理していません。 – loukios

+0

これは単なる字句解析の問題ではありません。あなたは構文解析器と字句解析器が必要です。 「再帰的降下式構文解析器」またはDijkstra Shunting-yardアルゴリズムを調べる。 – EJP

答えて

0

、あなたは文字位置各トークンのための余分な時間が増加しています。トークンを追加した後にインクリメントしますが、forループにインクリメントがあります。

たとえば、入力が「5 + 1」でOPERANDとして「5」が追加され、それに応じて位置が更新され、forループがスキップして「+」、次の文字が「1」、別のオペランドとして追加されます。

+0

ありがとう!私はそれを見落とした。最後のトークン "1"が考慮されていないことに気が付いたので、なぜそれを見つけることができますか? – loukios

+0

@ loukiosいいえ。私は現在あなたの質問でコードを取りました。for(int i = 0; i erickson