public static ReversePolishNotation Convert(string expression) { var tokenizer = new Tokenizer(expression); var result = new List<string>(); tokenizer.Next(); ParseExpression(tokenizer, result); return new ReversePolishNotation(result); }
private static void ParseFactor(Tokenizer tokenizer, List<string> result) { var not = ""; var token = tokenizer.Current; if (token.IsNot()) { not = token; token = tokenizer.Next(); } if (token.IsBegginingParenthesis()) { tokenizer.Skip(); // '(' をスキップ var next = tokenizer.Current; if (next.IsOperator()) { throw new InvalidExpressionException("左かっこと演算子が連続しています。"); } ParseExpression(tokenizer, result); if (!tokenizer.Current.IsClosingParenthesis()) { throw new InvalidExpressionException("かっこが閉じられていません。"); } tokenizer.Skip(); // ')' をスキップ } else { ParseElement(tokenizer, result); } if (!string.IsNullOrEmpty(not)) { result.Add(not); } }
private static void ParseExpression(Tokenizer tokenizer, List<string> result) { ParseFactor(tokenizer, result); for (var token = tokenizer.Current; token.IsOperator(); token = tokenizer.Current) { var next = tokenizer.Next(); if (next == null) { throw new InvalidExpressionException("式が終了していません。"); } if (next.IsOperator()) { throw new InvalidExpressionException("演算子が重複しています。"); } if (next.IsClosingParenthesis()) { throw new InvalidExpressionException("演算子と右かっこが連続しています。"); } ParseFactor(tokenizer, result); result.Add(token); } }
private static void ParseElement(Tokenizer tokenizer, List<string> result) { var token = tokenizer.Current; result.Add(token); tokenizer.Next(); }