Esempio n. 1
0
        private void ResolveExpr(ref int segment, sema.Code.Lvalue destination, syn.Node node)
        {
            var nodeParen      = node as syn.Node.Parenthesized;
            var nodeBlock      = node as syn.Node.Block;
            var nodeLet        = node as syn.Node.Let;
            var nodeIf         = node as syn.Node.If;
            var nodeWhile      = node as syn.Node.While;
            var nodeLoop       = node as syn.Node.Loop;
            var nodeBreak      = node as syn.Node.Break;
            var nodeContinue   = node as syn.Node.Continue;
            var nodeReturn     = node as syn.Node.Return;
            var nodeIdentifier = node as syn.Node.Identifier;
            var nodeNumber     = node as syn.Node.Number;
            var nodeBool       = node as syn.Node.LiteralBool;
            var nodeTuple      = node as syn.Node.LiteralTuple;
            var nodeBinaryOp   = node as syn.Node.BinaryOperation;

            if (nodeParen != null)
            {
                this.ResolveExpr(ref segment, destination, nodeParen.inner);
            }

            else if (nodeBlock != null)
            {
                this.ResolveExprBlock(ref segment, destination, nodeBlock);
            }

            else if (nodeLet != null)
            {
                this.ResolveExprLet(ref segment, destination, nodeLet);
            }

            else if (nodeIf != null)
            {
                this.ResolveExprIf(ref segment, destination, nodeIf);
            }

            else if (nodeWhile != null)
            {
                this.ResolveExprWhile(ref segment, destination, nodeWhile);
            }

            else if (nodeLoop != null)
            {
                this.ResolveExprLoop(ref segment, destination, nodeLoop);
            }

            else if (nodeBreak != null)
            {
                this.ResolveExprBreak(ref segment, destination, nodeBreak);
            }

            else if (nodeContinue != null)
            {
                this.ResolveExprContinue(ref segment, destination, nodeContinue);
            }

            else if (nodeReturn != null)
            {
                this.ResolveExprReturn(ref segment, destination, nodeReturn);
            }

            else if (nodeIdentifier != null)
            {
                this.ResolveExprName(ref segment, destination, nodeIdentifier);
            }

            else if (nodeNumber != null)
            {
                this.ResolveExprNumber(ref segment, destination, nodeNumber);
            }

            else if (nodeBool != null)
            {
                this.ResolveExprBool(ref segment, destination, nodeBool);
            }

            else if (nodeTuple != null)
            {
                this.ResolveExprTuple(ref segment, destination, nodeTuple);
            }

            else if (nodeBinaryOp != null)
            {
                this.ResolveExprBinaryOp(ref segment, destination, nodeBinaryOp);
            }

            else
            {
                this.reporter.InternalError("unimplemented", new diagn.Caret(node.span));
            }
        }