public Declaration Parse(LoonyParser parser, LoonyToken token) { var start = token; var name = parser.Take(LoonyTokenType.Identifier); var parameters = new List <FuncDeclaration.Parameter>(); TypeBase returnType = null; parser.Take(LoonyTokenType.LeftParen); if (!parser.MatchAndTake(LoonyTokenType.RightParen)) { do { var paramName = parser.Take(LoonyTokenType.Identifier); parser.Take(LoonyTokenType.Colon); var paramType = parser.ParseType(); parameters.Add(new FuncDeclaration.Parameter(paramName, paramType)); } while (parser.MatchAndTake(LoonyTokenType.Comma)); parser.Take(LoonyTokenType.RightParen); } if (parser.MatchAndTake(LoonyTokenType.Colon)) { returnType = parser.ParseType(); } var body = parser.ParseBlock(false); var end = parser.Previous; return(new FuncDeclaration(start, end, name, parameters, returnType, body)); }
private static TypeBase Parse(string type) { var lexer = new LoonyLexer(type); var parser = new LoonyParser(lexer); return(parser.ParseType()); }
public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon) { trailingSemicolon = true; var value = parser.ParseExpression(); return new ReturnStatement(token, parser.Previous, value); }
public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon) { trailingSemicolon = true; var name = parser.Take(LoonyTokenType.Identifier).Contents; TypeBase type = null; Expression initializer = null; if (parser.MatchAndTake(LoonyTokenType.Colon)) { type = parser.ParseType(); } if (type == null) { parser.Take(LoonyTokenType.Assign); initializer = parser.ParseExpression(); } else if (parser.MatchAndTake(LoonyTokenType.Assign)) { initializer = parser.ParseExpression(); } return(new VariableStatement(token, parser.Previous, name, type, initializer)); }
public Expression Parse(LoonyParser parser, LoonyToken token) { var expression = parser.ParseExpression(); parser.Take(LoonyTokenType.RightParen); return(expression); }
public Declaration Parse(LoonyParser parser, LoonyToken token) { var start = token; var name = parser.Take(LoonyTokenType.Identifier); var parameters = new List<FuncDeclaration.Parameter>(); TypeBase returnType = null; parser.Take(LoonyTokenType.LeftParen); if (!parser.MatchAndTake(LoonyTokenType.RightParen)) { do { var paramName = parser.Take(LoonyTokenType.Identifier); parser.Take(LoonyTokenType.Colon); var paramType = parser.ParseType(); parameters.Add(new FuncDeclaration.Parameter(paramName, paramType)); } while (parser.MatchAndTake(LoonyTokenType.Comma)); parser.Take(LoonyTokenType.RightParen); } if (parser.MatchAndTake(LoonyTokenType.Colon)) returnType = parser.ParseType(); var body = parser.ParseBlock(false); var end = parser.Previous; return new FuncDeclaration(start, end, name, parameters, returnType, body); }
public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon) { trailingSemicolon = true; var value = parser.ParseExpression(); return(new ReturnStatement(token, parser.Previous, value)); }
static void Main() { const string source = @" func main(argc: int, argv: **char): int { var x = 10 + (20 * 30 ^ 40 * 50); return x * 3 + 1; } "; Console.WriteLine("-- Source --"); Console.WriteLine(source); Console.WriteLine(); var lexer = new LoonyLexer(source); var parser = new LoonyParser(lexer); var document = parser.ParseAll(); Console.WriteLine("-- AST --"); var printer = new AstPrintVisitor(Console.Out); printer.Visit(document); Console.WriteLine(); Console.WriteLine(); /*var simplify = new AstSimplifyTransform(); * document = simplify.Visit(document); * * Console.WriteLine("-- Simplified AST --"); * printer.Visit(document); * Console.WriteLine(); * Console.WriteLine();*/ Console.WriteLine("-- Assembly --"); var assembler = new Assembler(); var compiler = new AstCompileVisitor(assembler); compiler.Visit(document); assembler.Compile(Console.Out); Console.ReadLine(); }
public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon) { trailingSemicolon = true; var name = parser.Take(LoonyTokenType.Identifier).Contents; TypeBase type = null; Expression initializer = null; if (parser.MatchAndTake(LoonyTokenType.Colon)) type = parser.ParseType(); if (type == null) { parser.Take(LoonyTokenType.Assign); initializer = parser.ParseExpression(); } else if (parser.MatchAndTake(LoonyTokenType.Assign)) { initializer = parser.ParseExpression(); } return new VariableStatement(token, parser.Previous, name, type, initializer); }
public Expression Parse(LoonyParser parser, LoonyToken token) { var value = int.Parse(token.Contents); return(new NumberExpression(token, value)); }
public Expression Parse(LoonyParser parser, LoonyToken token) { var value = int.Parse(token.Contents); return new NumberExpression(token, value); }
public Expression Parse(LoonyParser parser, Expression left, LoonyToken token) { var right = parser.ParseExpression(Precedence - (_isRight ? 1 : 0)); return new BinaryOperatorExpression(token, left, right); }
public Expression Parse(LoonyParser parser, LoonyToken token) { return(new IdentifierExpression(token, token.Contents)); }
public Expression Parse(LoonyParser parser, LoonyToken token) { return new IdentifierExpression(token, token.Contents); }
public Expression Parse(LoonyParser parser, LoonyToken token) { var expression = parser.ParseExpression(); parser.Take(LoonyTokenType.RightParen); return expression; }
public Expression Parse(LoonyParser parser, Expression left, LoonyToken token) { var right = parser.ParseExpression(Precedence - (_isRight ? 1 : 0)); return(new BinaryOperatorExpression(token, left, right)); }