Esempio n. 1
0
        private AST ParseAssignment(AST node)
        {
            while (_lexer.CurrentToken.Type == TokenType.Assign)
            {
                if (node.GetType() == typeof(FnCallAST))
                {
                    throw new Exception($"Syntax error - function {node.Value} cannot be assigned to");
                }

                _lexer.AcceptToken(TokenType.Assign);
                var expr = ParseExpr();
                node = new BinaryOpAST(node, "=", expr);
            }

            return(node);
        }
Esempio n. 2
0
        private AST ParseTerm(List <string> ns)
        {
            // term ::= factor | (*\/|%) factor
            var factor = ParseFactor(ns);
            var token  = _lexer.CurrentToken;

            while (token.Type == TokenType.Mul || token.Type == TokenType.Div || token.Type == TokenType.Mod)
            {
                _lexer.AcceptToken(token.Type);

                var otherFactor = ParseFactor(ns);
                factor = new BinaryOpAST(factor, token.Value, otherFactor);
                token  = _lexer.CurrentToken;
            }

            return(factor);
        }
Esempio n. 3
0
        private AST ParseExpr(List <string> ns = null)
        {
            // expr ::= term | (+\-) factor
            var term  = ParseTerm(ns);
            var token = _lexer.CurrentToken;

            while (token.Type == TokenType.Add || token.Type == TokenType.Sub)
            {
                _lexer.AcceptToken(token.Type);

                var otherTerm = ParseTerm(ns);
                term  = new BinaryOpAST(term, token.Value, otherTerm);
                token = _lexer.CurrentToken;
            }

            return(term);
        }