public DList<Statement, BlockStatement> ParseProgram (ref List<Comment> Comments, ref BindingInfo BindingInfo) { Init (); DList<Statement, BlockStatement> result = new DList<Statement, BlockStatement> (); while (current.Kind != Token.Type.EndOfInput) { if (current.Kind == Token.Type.function) result.Append (ParseFunctionDeclaration ()); else result.Append (ParseStatement ()); Next (); } Comments = lexer.Comments; return result; }
private SwitchStatement ParseSwitch () { Token start = current; Next(); CheckSyntaxExpected(Token.Type.LeftParenthesis); Token leftParen = current; Next (); Expression Value = ParseExpression(); CheckSyntaxExpected(Token.Type.RightParenthesis); Token rightParen = current; Next(); CheckSyntaxExpected (Token.Type.LeftBrace); Token leftBrace = current; Next (); withinSwitch++; DList<CaseClause, SwitchStatement> cases = new DList<CaseClause, SwitchStatement> (); bool defaultFlag = false; while (current.Kind == Token.Type.@case || current.Kind == Token.Type.@default) { if (current.Kind == Token.Type.@case) cases.Append (ParseValueCaseClause ()); else { if (defaultFlag) Error (DiagnosticCode.SwitchHasMultipleDefaults, new TextSpan (start, current)); cases.Append (ParseDefaultCaseClause ()); defaultFlag = true; } } withinSwitch--; CheckSyntaxExpected (Token.Type.RightBrace); SwitchStatement switchStatement = new SwitchStatement (Value, cases, new TextSpan (start, current), new TextSpan (start, rightParen), new TextPoint (leftParen.StartPosition), new TextPoint (rightParen.StartPosition), new TextPoint (leftBrace.StartPosition)); cases.Parent = switchStatement; return switchStatement; }
private ValueCaseClause ParseValueCaseClause () { Token start = current; Next (); Expression expression = ParseExpression (); CheckSyntaxExpected (Token.Type.Colon); Token colon = current; Next (); DList<Statement, CaseClause> children = new DList<Statement, CaseClause> (); do { if (current.Kind == Token.Type.@case || current.Kind == Token.Type.@default || current.Kind == Token.Type.RightBrace || current.Kind == Token.Type.EndOfInput) break; children.Append (ParseStatement ()); Next (); } while (true); ValueCaseClause result = new ValueCaseClause (expression, children, new TextSpan (start, current), new TextSpan (start, colon), new TextPoint (colon.StartPosition)); children.Parent = result; return result; }
private BlockStatement ParseBlock () { Token start = current; DList<Statement,BlockStatement> children = new DList<Statement,BlockStatement>(); CheckSyntaxExpected (Token.Type.LeftBrace); Next (); List<Statement> statements = ParseListStatement (); foreach (Statement statement in statements) children.Append (statement); CheckSyntaxExpected (Token.Type.RightBrace); BlockStatement block = new BlockStatement (children, new TextSpan (start, current)); children.Parent = block; return block; }