public static bool TryParseNode(Genero4glParser parser, out PrepareStatement defNode, IModuleResult containingModule) { defNode = null; bool result = false; if (parser.PeekToken(TokenKind.PrepareKeyword)) { result = true; defNode = new PrepareStatement(); parser.NextToken(); defNode.StartIndex = parser.Token.Span.Start; if (parser.PeekToken(TokenCategory.Identifier) || parser.PeekToken(TokenCategory.Keyword)) { parser.NextToken(); defNode.Identifier = parser.Token.Token.Value.ToString(); if (parser.PeekToken(TokenKind.FromKeyword)) { parser.NextToken(); ExpressionNode exprNode; if (FglExpressionNode.TryGetExpressionNode(parser, out exprNode) && exprNode != null) { defNode.Children.Add(exprNode.StartIndex, exprNode); defNode.EndIndex = exprNode.EndIndex; defNode.IsComplete = true; containingModule.BindCursorResult(defNode, parser); } else { parser.ReportSyntaxError("SQL prepare statement must specify an expression to prepare."); } } else { parser.ReportSyntaxError("SQL prepare statement is missing keyword \"from\"."); } } else { parser.ReportSyntaxError("SQL prepare statement must specify an identifier to prepare."); } } return(result); }
public static bool TryParseNode(Genero4glParser parser, out DeclareStatement defNode, IModuleResult containingModule) { defNode = null; bool result = false; if (parser.PeekToken(TokenKind.DeclareKeyword)) { result = true; defNode = new DeclareStatement(); parser.NextToken(); defNode.StartIndex = parser.Token.Span.Start; defNode._prepStatementResolver = containingModule.PreparedCursorResolver; if (parser.PeekToken(TokenCategory.Identifier) || parser.PeekToken(TokenCategory.Keyword)) { parser.NextToken(); defNode.Identifier = parser.Token.Token.Value.ToString(); if (parser.PeekToken(TokenKind.ScrollKeyword)) { parser.NextToken(); defNode.Scroll = true; } if (parser.PeekToken(TokenKind.CursorKeyword)) { parser.NextToken(); if (parser.PeekToken(TokenKind.WithKeyword)) { parser.NextToken(); if (parser.PeekToken(TokenKind.HoldKeyword)) { parser.NextToken(); defNode.WithHold = true; } else { parser.ReportSyntaxError("SQL declare statement missing \"hold\" keyword."); } } if (parser.PeekToken(TokenKind.FromKeyword)) { parser.NextToken(); // We have a string expression declare ExpressionNode exprNode; if (FglExpressionNode.TryGetExpressionNode(parser, out exprNode) /* && exprNode is StringExpressionNode*/ && exprNode != null) { defNode.Children.Add(exprNode.StartIndex, exprNode); defNode.EndIndex = exprNode.EndIndex; containingModule.BindCursorResult(defNode, parser); } else { parser.ReportSyntaxError("String expression not found for SQl declare statement"); } } else if (parser.PeekToken(TokenKind.ForKeyword)) { parser.NextToken(); if (parser.PeekToken(TokenKind.SqlKeyword)) { // we have a sql block declare SqlBlockNode sqlBlock; if (SqlBlockNode.TryParseSqlNode(parser, out sqlBlock) && sqlBlock != null) { defNode.Children.Add(sqlBlock.StartIndex, sqlBlock); defNode.EndIndex = sqlBlock.EndIndex; defNode.IsComplete = true; containingModule.BindCursorResult(defNode, parser); } } else if (parser.PeekToken(TokenKind.SelectKeyword)) { // we have a static sql select statement FglStatement sqlStmt; bool dummy; if (SqlStatementFactory.TryParseSqlStatement(parser, out sqlStmt, out dummy, TokenKind.SelectKeyword) && sqlStmt != null) { defNode.Children.Add(sqlStmt.StartIndex, sqlStmt); defNode.EndIndex = sqlStmt.EndIndex; defNode.IsComplete = true; containingModule.BindCursorResult(defNode, parser); } else { parser.ReportSyntaxError("Static SQL declare statement must specify a SELECT statement."); } } else if (parser.PeekToken(TokenCategory.Identifier) || parser.PeekToken(TokenCategory.Keyword)) { // we have a prepared statment parser.NextToken(); defNode.PreparedStatementId = parser.Token.Token.Value.ToString(); defNode.EndIndex = parser.Token.Span.End; defNode.IsComplete = true; containingModule.BindCursorResult(defNode, parser); } else { parser.ReportSyntaxError("Invalid token found in SQL declare statment."); } } else { parser.ReportSyntaxError("SQL declare statement must have either \"for\" or \"from\" keyword."); } } else { parser.ReportSyntaxError("SQL declare statement missing \"cursor\" keyword."); } } else { parser.ReportSyntaxError("SQL declare statement must specify an identifier to declare."); } } return(result); }