/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": StringExpression.Interpret()"); // 現在のトークンをチェック Token <TokenType> token = context.Current; CheckTokenExists(token); CheckTokenType(token, TokenType.String); // ", ' を取り除く string pattern = token.Text; if (pattern[0] == '"') { pattern = pattern.Trim('"'); } else if (pattern[0] == '\'') { pattern = pattern.Trim('\''); } // トークンのバターンを登録する context.AddTokenizerPattern(pattern, pattern); // 戻り値 GeneratedExpression exp = ExpressionFactory.CreateTerminal(pattern); context.PushExpression(exp); //GeneratedExpression = ExpressionFactory.CreateTerminal(pattern); }
/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": ExceptionExpression.Interpret()"); // 戻り値の準備 StringBuilder pattern = new StringBuilder(); GeneratedExpression exp = ExpressionFactory.CreateException(); // 最初のトークンをチェック Token <TokenType> token = context.Current; CheckTokenExists(token); CheckFirstToken(token); pattern.Append(token.Text); // 2 番目のトークンをチェック token = context.Next(); CheckTokenExists(token); DebugLog(": ExceptionExpression: (" + token.Type + ")"); switch (token.Type) { case TokenType.String: exp.AddExpression( ParseTerminal(context) ); pattern.Append(token.Text); token = context.Next(); break; default: ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } CheckTokenExists(token); if (token.IsLast) { //ThrowParseException(ErrorMessages.UnexpectedToken, token); } // 戻り値 exp.Name = pattern.ToString(); context.PushExpression(exp); //GeneratedExpression.Name = pattern; }
/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": FieldExpression.Interpret()"); // 名前 Token <TokenType> token = context.Current; CheckTokenExists(token); CheckTokenType(token, TokenType.Name); if (token.Text == string.Empty) { ThrowParseException( ErrorMessages.UnexpectedToken, token ); } string name = token.Text; // イコール token = context.Next(); CheckTokenExists(token); CheckTokenType(token, TokenType.Equal); // 式の右辺 token = context.Next(); CheckTokenExists(token); GeneratedExpression exp = ParseRight(context); exp.Name = name; // セミコロン token = context.Current; CheckTokenExists(token); CheckTokenType(token, TokenType.Semicolon); // 次に進めておく token = context.Next(); //CheckTokenExists(token); // 戻り値 context.PushExpression(exp); //GeneratedExpression = exp.GeneratedExpression; }
/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": EBNFExpression.Interpret()"); // 戻り値の準備 GeneratedExpression root = ExpressionFactory.CreateRoot(); // フィールドの繰り返し while (context.Current != null) { GeneratedExpression exp = ParseField(context); // 名前が付いていない場合はエラー if (exp.Name == string.Empty) { ThrowParseException( ErrorMessages.NameNotFound, context.Current ); } // リストに追加する root.AddExpression(exp); context.Fields.Add(exp.Name, exp); } // 終端に文字が残っている場合 if (context.Next() != null) { ThrowParseException( ErrorMessages.UnexpectedToken, context.Current ); } // 戻り値 context.Root = root; }
/// <summary> /// コンストラクタ. /// </summary> /// <param name="tokenizer">生成された Tokenizer.</param> /// <param name="fields">生成された Expression のリスト.</param> /// <param name="expession">生成されたパーサのルート.</param> public GeneratedParser(Tokenizer <TokenType> tokenizer, Dictionary <string, GeneratedExpression> fields, GeneratedExpression expession) { this.tokenizer = tokenizer; this.fields = fields; this.expession = expession; }
/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": OptionExpression.Interpret()"); // 戻り値の準備 StringBuilder pattern = new StringBuilder(); GeneratedExpression exp = ExpressionFactory.CreateOption(); // 最初のトークンをチェック Token <TokenType> token = context.Current; CheckTokenExists(token); CheckFirstToken(token); pattern.Append(token.Text); // 2 番目のトークンをチェック token = context.Next(); CheckTokenExists(token); bool loop = true; while (loop) { DebugLog(": OptionExpression: (" + token.Text + ")"); switch (token.Type) { case TokenType.String: case TokenType.Name: Token <TokenType> nextToken = token.Next; if (nextToken != null && nextToken.Type == TokenType.Or) { GeneratedExpression orExp = ParseOr(context); exp.AddExpression(orExp); pattern.Append(orExp.Name); token = context.Current; CheckTokenExists(token); } break; } if (token.IsLast) { ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } switch (token.Type) { case TokenType.CloseBracket: loop = false; pattern.Append(token.Text); token = context.Next(); break; case TokenType.String: exp.AddExpression( ParseTerminal(context) ); pattern.Append(token.Text); token = context.Next(); break; case TokenType.Name: exp.AddExpression( ParseNonterminal(context, token.Text) ); pattern.Append(token.Text); token = context.Next(); break; case TokenType.OpenBrace: GeneratedExpression loopExp = ParseLoop(context); exp.AddExpression(loopExp); pattern.Append(loopExp.Name); token = context.Current; break; default: ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } CheckTokenExists(token); if (token.IsLast) { ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } } // 戻り値 exp.Name = pattern.ToString(); context.PushExpression(exp); }
/// <summary> /// 評価用メソッド. /// </summary> /// <param name="context">コンテキストオブジェクト.</param> public override void Interpret(EBNFContext context) { DebugLog(": RightExpression.Interpret()"); // 戻り値の準備 GeneratedExpression exp = ExpressionFactory.CreateField(); // 最初のトークンをチェック Token <TokenType> token = context.Current; CheckTokenExists(token); CheckFirstToken(token); bool loop = true; while (loop) { DebugLog(": RightExpression: (" + token.Type + ")"); switch (token.Type) { case TokenType.String: case TokenType.Name: Token <TokenType> nextToken = token.Next; if (nextToken != null && nextToken.Type == TokenType.Or) { GeneratedExpression orExp = ParseOr(context); exp.AddExpression(orExp); token = context.Current; CheckTokenExists(token); } break; } if (token.IsLast) { //ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } switch (token.Type) { case TokenType.String: exp.AddExpression( ParseTerminal(context) ); token = context.Next(); break; case TokenType.Name: exp.AddExpression( ParseNonterminal(context, token.Text) ); token = context.Next(); break; case TokenType.OpenParen: exp.AddExpression( ParseGroup(context) ); token = context.Current; break; case TokenType.OpenBrace: exp.AddExpression( ParseLoop(context) ); token = context.Current; break; case TokenType.OpenBracket: exp.AddExpression( ParseOption(context) ); token = context.Current; break; case TokenType.Comma: CheckComma(token); token = context.Next(); break; case TokenType.Semicolon: loop = false; break; default: ThrowParseException(ErrorMessages.UnexpectedToken, token); break; } CheckTokenExists(token); if (token.IsLast) { break; } } // 戻り値 context.PushExpression(exp); }
/// <summary> /// Expression の処理内で戻り値をプッシュする. /// </summary> /// <param name="expression"></param> public void PushExpression(GeneratedExpression expression) { ExpressionStack.Push(expression); }