public static bool TryParseNode(Genero4glParser parser, out PromptDisplayAttribute node) { node = new PromptDisplayAttribute(); node.StartIndex = parser.Token.Span.Start; bool result = true; switch (parser.PeekToken().Kind) { case TokenKind.BlackKeyword: case TokenKind.BlueKeyword: case TokenKind.CyanKeyword: case TokenKind.GreenKeyword: case TokenKind.MagentaKeyword: case TokenKind.RedKeyword: case TokenKind.WhiteKeyword: case TokenKind.YellowKeyword: case TokenKind.BoldKeyword: case TokenKind.DimKeyword: case TokenKind.InvisibleKeyword: case TokenKind.NormalKeyword: case TokenKind.ReverseKeyword: case TokenKind.BlinkKeyword: case TokenKind.UnderlineKeyword: parser.NextToken(); break; default: result = false; break; } return(result); }
public static bool TryParseNode(Genero4glParser parser, out PromptStatement node, IModuleResult containingModule, List <Func <PrepareStatement, bool> > prepStatementBinders, Func <ReturnStatement, ParserResult> returnStatementBinder = null, Action <IAnalysisResult, int, int> limitedScopeVariableAdder = null, List <TokenKind> validExitKeywords = null, IEnumerable <ContextStatementFactory> contextStatementFactories = null, HashSet <TokenKind> endKeywords = null) { node = null; bool result = false; if (parser.PeekToken(TokenKind.PromptKeyword)) { result = true; node = new PromptStatement(); parser.NextToken(); node.StartIndex = parser.Token.Span.Start; node.DisplayAttributes = new List <PromptDisplayAttribute>(); node.ControlAttributes = new List <PromptControlAttribute>(); ExpressionNode question; if (FglExpressionNode.TryGetExpressionNode(parser, out question)) { node.Question = question; } else { parser.ReportSyntaxError("Invalid question expression found in prompt statement."); } // get the optional display attributes if (parser.PeekToken(TokenKind.AttributesKeyword) || parser.PeekToken(TokenKind.AttributeKeyword)) { parser.NextToken(); if (parser.PeekToken(TokenKind.LeftParenthesis)) { parser.NextToken(); PromptDisplayAttribute attrib; while (PromptDisplayAttribute.TryParseNode(parser, out attrib)) { node.DisplayAttributes.Add(attrib); if (!parser.PeekToken(TokenKind.Comma)) { break; } parser.NextToken(); } if (parser.PeekToken(TokenKind.RightParenthesis)) { parser.NextToken(); } else { parser.ReportSyntaxError("Expecting right-paren in prompt display attributes section."); } } else { parser.ReportSyntaxError("Expecting left-paren in prompt display attributes section."); } } if (parser.PeekToken(TokenKind.ForKeyword)) { parser.NextToken(); } else { parser.ReportSyntaxError("Expected \"for\" keyword in prompt statement."); } if (parser.PeekToken(TokenKind.CharKeyword) || parser.PeekToken(TokenKind.CharacterKeyword)) { parser.NextToken(); } FglNameExpression varName; if (FglNameExpression.TryParseNode(parser, out varName)) { node.VariableName = varName; } else { parser.ReportSyntaxError("Invalid variable name found in prompt statement."); } if (parser.PeekToken(TokenKind.HelpKeyword)) { parser.NextToken(); ExpressionNode helpNumber; if (FglExpressionNode.TryGetExpressionNode(parser, out helpNumber)) { node.HelpNumber = helpNumber; } else { parser.ReportSyntaxError("Invalid help number found in prompt statement."); } } // get the optional control attributes if (parser.PeekToken(TokenKind.AttributesKeyword) || parser.PeekToken(TokenKind.AttributeKeyword)) { parser.NextToken(); if (parser.PeekToken(TokenKind.LeftParenthesis)) { parser.NextToken(); PromptControlAttribute attrib; while (PromptControlAttribute.TryParseNode(parser, out attrib)) { node.ControlAttributes.Add(attrib); if (!parser.PeekToken(TokenKind.Comma)) { break; } parser.NextToken(); } if (parser.PeekToken(TokenKind.RightParenthesis)) { parser.NextToken(); } else { parser.ReportSyntaxError("Expecting right-paren in prompt control attributes section."); } } else { parser.ReportSyntaxError("Expecting left-paren in prompt control attributes section."); } } List <TokenKind> validExits = new List <TokenKind>(); if (validExitKeywords != null) { validExits.AddRange(validExitKeywords); } validExits.Add(TokenKind.PromptKeyword); HashSet <TokenKind> newEndKeywords = new HashSet <TokenKind>(); if (endKeywords != null) { newEndKeywords.AddRange(endKeywords); } newEndKeywords.Add(TokenKind.PromptKeyword); bool hasControlBlocks = false; PromptControlBlock controlBlock; prepStatementBinders.Insert(0, node.BindPrepareCursorFromIdentifier); while (PromptControlBlock.TryParseNode(parser, out controlBlock, containingModule, prepStatementBinders, returnStatementBinder, limitedScopeVariableAdder, validExitKeywords, contextStatementFactories) && controlBlock != null) { node.Children.Add(controlBlock.StartIndex, controlBlock); hasControlBlocks = true; if (parser.PeekToken(TokenKind.EndOfFile) || (parser.PeekToken(TokenKind.EndKeyword) && parser.PeekToken(TokenKind.PromptKeyword, 2))) { break; } } prepStatementBinders.RemoveAt(0); if (hasControlBlocks) { if (!(parser.PeekToken(TokenKind.EndKeyword) && parser.PeekToken(TokenKind.PromptKeyword, 2))) { parser.ReportSyntaxError("A prompt block must be terminated with \"end prompt\"."); } else { parser.NextToken(); // advance to the 'end' token parser.NextToken(); // advance to the 'prompt' token node.EndIndex = parser.Token.Span.End; } } } return(result); }