private AssemblyOperationFormat ParseAssemblyOperationFormat()
        {
            var kw = NextToken();

            if (!kw.IsKeyword(Keyword.Format))
            {
                _stream.Previous();

                return(null);
            }

            var allowedVals = new HashSet <string>()
            {
                "8", "16", "32"
            };

            var t = NextToken();

            AssertLiteral(t);
            if (!allowedVals.Contains(t.Value))
            {
                throw SyntaxError.Make(SyntaxErrorMessages.INVALID_TOKEN, t);
            }

            var node = new AssemblyOperationFormat(t);

            node.PropagatePosition(kw.Position);

            return(node);
        }
        private VarType ParseType(bool assert = true)
        {
            var t = NextToken();

            var allowedTypes = new HashSet <string>()
            {
                Keyword.Int, Keyword.Short, Keyword.Byte
            };

            if (t.Type != TokenType.Keyword || !allowedTypes.Contains(t.Value))
            {
                _stream.Previous();

                if (assert)
                {
                    throw SyntaxError.Make(SyntaxErrorMessages.TYPE_EXPECTED, t);
                }

                return(null);
            }

            var node = new VarType(t);

            return(node);
        }
        private Statement ParseStatement()
        {
            var label = ParseLabel();

            var inner = TryExtractVariants(new Func <AstNode>[] {
                ParseAssemblyBlock,
                ParseExtensionStatement,
            });

            if (label == null && inner == null)
            {
                return(null);
            }
            if (label != null && inner == null)
            {
                var t = NextToken();

                throw SyntaxError.Make(SyntaxErrorMessages.STATEMENT_EXPECTED, t);
            }

            var node = new Statement();

            if (label != null)
            {
                node.AddChild(node);
            }
            node.AddChild(inner);

            return(node);
        }
 protected void AssertRegister(Token received)
 {
     if (received.Type != TokenType.Register)
     {
         throw SyntaxError.Make(SyntaxErrorMessages.REGISTER_EXPECTED, received);
     }
 }
        public ProgramRaw ParseProgram()
        {
            var node = new ProgramRaw();

            while (_stream.HasTokens())
            {
                var nextNode = TryExtractVariants(new Func <AstNode>[] {
                    ParseAnnotation,
                    ParseData,
                    ParseModule,
                    ParseRoutine,
                    ParseCode,
                });

                if (nextNode != null)
                {
                    node.AddChild(nextNode);
                }
                else
                {
                    throw SyntaxError.Make(SyntaxErrorMessages.INVALID_TOKEN, NextToken());
                }
            }

            return(node);
        }
 protected void AssertLiteral(Token received)
 {
     if (received.Type != TokenType.Number)
     {
         throw SyntaxError.Make(SyntaxErrorMessages.LITERAL_EXPECTED, received);
     }
 }
 protected void AssertIdentifier(Token received)
 {
     if (received.Type != TokenType.Identifier)
     {
         throw SyntaxError.Make(SyntaxErrorMessages.IDENTIFIER_EXPECTED, received);
     }
 }
 protected void AssertOperator(string expected, Token received)
 {
     if (!received.IsOperator(expected))
     {
         throw SyntaxError.Make(SyntaxErrorMessages.UNEXPECTED_TOKEN, expected, received);
     }
 }
        protected void AssertTokenExist(Token token)
        {
            if (token == null)
            {
                var last = _stream.Last();

                // Next char position
                var start = last.Position.Start.ToTuple();
                var end   = last.Position.End.ToTuple();
                start.Item2 += 1;
                end.Item2   += 1;
                var prettyPos = new Position(start, end);

                throw SyntaxError.Make(SyntaxErrorMessages.UNEXPECTED_EOS(), prettyPos);
            }
        }
Exemplo n.º 10
0
        private Operand ParseOperand()
        {
            var operand = TryExtractVariants(new Func <AstNode>[] {
                ParseReceiver,
                ParseReference,
                () => ParseLiteral(false),
            });

            if (operand == null)
            {
                var t = NextToken();

                throw SyntaxError.Make(SyntaxErrorMessages.OPERAND_EXPECTED, t);
            }

            var node = new Operand();

            node.AddChild(operand);

            return(node);
        }
Exemplo n.º 11
0
        private Swap ParseSwap()
        {
            var tx = _stream.Fixate();

            var arg0 = ParsePrimary();

            if (arg0 == null)
            {
                return(null);
            }

            var t = NextToken();

            if (!t.IsOperator(Operator.AssignSwap))
            {
                _stream.Rollback(tx); // Undo operator and 'primary' read

                return(null);
            }

            var node = new Swap();

            node.AddChild(arg0);

            var arg1 = ParsePrimary();

            if (arg1 == null)
            {
                throw SyntaxError.Make(SyntaxErrorMessages.PRIMARY_EXPECTED, t);
            }
            node.AddChild(arg1);

            t = NextToken();
            AssertDelimiter(Delimiter.Semicolon, t);

            return(node);
        }
Exemplo n.º 12
0
        private AssemblyOperation ParseAssemblyOperation()
        {
            var asterisk = NextToken(false);

            if (asterisk.IsOperator(Operator.Asterisk))
            {
                _stream.Next();
            }
            else
            {
                asterisk = null;
            }

            var reg = ParseRegister();

            var allowedOps = new HashSet <string>()
            {
                Operator.Assign,
                Operator.AssignPlus,
                Operator.AssignMinus,
                Operator.AssignShiftRight,
                Operator.AssignShiftLeft,
                Operator.AssignOr,
                Operator.AssignAnd,
                Operator.AssignXor,
                Operator.AssignLess,
                Operator.AssignGreater,
                Operator.AssignCond
            };
            var op = NextToken();

            if (op.Type != TokenType.Operator || !allowedOps.Contains(op.Value))
            {
                throw SyntaxError.Make(SyntaxErrorMessages.INVALID_TOKEN, op);
            }

            var node = new AssemblyOperation(op);

            if (asterisk != null)
            {
                var deref = new Dereference(asterisk);
                deref.AddChild(reg);

                node.AddChild(deref);
            }
            else
            {
                node.AddChild(reg);

                asterisk = NextToken(false);
                if (asterisk.IsOperator(Operator.Asterisk))
                {
                    _stream.Next();
                }
                else
                {
                    asterisk = null;
                }
            }

            // If we have two dereferences in the statement ParseRegister will fail
            reg = ParseRegister();

            if (asterisk != null)
            {
                var deref = new Dereference(asterisk);
                deref.AddChild(reg);

                node.AddChild(deref);
            }
            else
            {
                node.AddChild(reg);
            }

            if (!op.IsOperator(Operator.Assign) && asterisk != null)
            {
                throw SyntaxError.Make(SyntaxErrorMessages.INVALID_ASM_DEREFERENCE_USE(), node.Position);
            }

            return(node);
        }