public static void Main(string[] args) { preformSetUp(args); List<Token> tokens = new Lexer(options.Code).Tokenize(); if (options.Debug) Debug.PrintTokens(tokens); Parser.Parser hassiumParser = new Parser.Parser(tokens); AstNode ast = hassiumParser.Parse(); try { new Interpreter(new SemanticAnalyser(ast).Analyse(), ast).Execute(); } catch (Exception e) { Console.WriteLine("ERROR: " + e.Message); Console.WriteLine("Press Y to show full stack trace"); if (Console.ReadKey(true).Key == ConsoleKey.Y) { Console.WriteLine(e); } } }
public static AstNode Parse(Parser.Parser parser) { return(ParseAssignment(parser)); }
private static AstNode ParseEquality(Parser.Parser parser) { AstNode left = ParseAdditive(parser); if (parser.AcceptToken(TokenType.Comparison, "=")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.Equals, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "!=")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.NotEqualTo, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "<")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.LessThan, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, ">")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.GreaterThan, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "<=")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.LesserOrEqual, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, ">=")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.GreaterOrEqual, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "&&")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.And, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "&&")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.And, left, right)); } else if (parser.AcceptToken(TokenType.Comparison, "||")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.Or, left, right)); } else if (parser.AcceptToken(TokenType.Operation, "^")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.Xor, left, right)); } else if (parser.AcceptToken(TokenType.Operation, "<<")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.BitshiftLeft, left, right)); } else if (parser.AcceptToken(TokenType.Operation, ">>")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.BitshiftRight, left, right)); } else if (parser.AcceptToken(TokenType.Operation, "&")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.BitwiseAnd, left, right)); } else if (parser.AcceptToken(TokenType.Operation, "|")) { var right = ParseEquality(parser); return(new BinOpNode(BinaryOperation.BitwiseOr, left, right)); } else { return(left); } }
private static AstNode ParseFunctionCall(Parser.Parser parser) { return(ParseFunctionCall(parser, ParseTerm(parser))); }
public static AstNode Parse(Parser.Parser parser) { parser.ExpectToken(TokenType.Identifier); return(new ReturnNode(StatementNode.Parse(parser))); }