Esempio n. 1
0
        public PrinterNode Visit(UnaryOperationNode node)
        {
            var pNode = new PrinterNode(node.Operation.StringValue);

            pNode.AddChild(node.Expr.Accept(this));
            return(pNode);
        }
        public bool Visit(UnaryOperationNode node)
        {
            //todo: special treat with pointers ^, @
            if (node.Type != null)
            {
                return(true);
            }

            node.Expr.Accept(this);

            // constraints to not
            if (node.Operation is ReservedToken reservedToken && reservedToken.Value == Constants.Words.Not)
            {
                if (!(node.Expr.Type is SymInt || node.Expr.Type is SymBool || node.Expr.Type is SymChar))
                {
                    throw BuildException <OperatorNotOverloaded>(node.Expr.Type, node.Operation);
                }

                node.Type = node.Expr.Type;
                return(true);
            }

            node.Type = node.Expr.Type;

            switch (node.Operation)
            {
            case OperatorToken op:
                switch (node.Expr.Type)
                {
                case SymInt _:
                case SymDouble _:
                    return(true);
                }
                break;

            case ReservedToken word:
                switch (word.Value)
                {
                case Constants.Words.Not:

                    switch (node.Type)
                    {
                    case SymInt _:
                        return(true);
                    }

                    break;
                }
                break;
            }

            throw BuildException <OperatorNotOverloaded>(node.Expr.Type, node.Operation);
        }