Example #1
0
        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);
                }
            }
        }
Example #2
0
 public static AstNode Parse(Parser.Parser parser)
 {
     return(ParseAssignment(parser));
 }
Example #3
0
        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);
            }
        }
Example #4
0
 private static AstNode ParseFunctionCall(Parser.Parser parser)
 {
     return(ParseFunctionCall(parser, ParseTerm(parser)));
 }
Example #5
0
        public static AstNode Parse(Parser.Parser parser)
        {
            parser.ExpectToken(TokenType.Identifier);

            return(new ReturnNode(StatementNode.Parse(parser)));
        }