private SyntaxTree.AST ParseFor() { var token = NextToken(); AssertTokenKind(TokenKind.For, token); if (lookahead[1].Kind == TokenKind.OpAssignment) { var ident = NextToken(); if (ident.Kind != TokenKind.Identifier) { throw new SyntaxException(ident, Properties.Resources.InvalidLeftOfAssignment); } AssertTokenKind(TokenKind.OpAssignment, NextToken()); var list = ParseExpr(); AssertTokenKind(TokenKind.EndOfLine, NextToken()); var block = new SyntaxTree.Block(token, ParseUntilTokenKind(TokenKind.End)); AssertTokenKind(TokenKind.End, NextToken()); return(new SyntaxTree.ForEach(token, ident, list, block)); } else { var cond = ParseExpr(); AssertTokenKind(TokenKind.EndOfLine, NextToken()); var block = new SyntaxTree.Block(token, ParseUntilTokenKind(TokenKind.End)); AssertTokenKind(TokenKind.End, NextToken()); return(new SyntaxTree.For(token, cond, block)); } }
private SyntaxTree.If ParseIfOrElif(TokenKind ifOrElif) { var token = NextToken(); AssertTokenKind(ifOrElif, token); var test = ParseExpr(); AssertTokenKind(TokenKind.EndOfLine, NextToken()); var block = new SyntaxTree.Block(token, ParseUntilTokenKind(TokenKind.End, TokenKind.Elif, TokenKind.Else)); return(new SyntaxTree.If(token, test, block, null)); }
private SyntaxTree.AST ParseBeginBlock() { var begin = NextToken(); AssertTokenKind(TokenKind.Begin, begin); AssertTokenKind(TokenKind.EndOfLine, NextToken()); var ast = new SyntaxTree.Block(begin, ParseUntilTokenKind(TokenKind.End)); AssertTokenKind(TokenKind.End, NextToken()); return(ast); }