/// <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(": 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="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); }