Exemplo n.º 1
0
        public void VisitProc(ProcNode node)
        {
            UpdateLine(node);
            NewProcedure(node.Name.Value, node.Exported, node.Varargs, node.Position.Line, true);
            UpdateLine(node);

            node.Parameters.ForEach(p => p.Accept(this));
            node.Statements.ForEach(s => s.Accept(this));

            if (node.Statements.Count == 0 || !(node.Statements.Last() is ReturnNode))
            {
                // @TODO: this is not entirely correct; we need control flow analysis to do this properly.
                //                  - sci4me, Mar 31, 2019
                asm.Return();
            }

            FinishProcedure(true);
        }
Exemplo n.º 2
0
        private ProcNode ParseProc(bool exported)
        {
            Expect(TokenType.PROC);
            Next();

            var proc = new ProcNode(Position(-1), ParseIdent(), exported);

            Expect(TokenType.LPAREN);
            Next();

            while (More() && !Accept(TokenType.RPAREN))
            {
                Expect(TokenType.FROZEN, TokenType.IDENT, TokenType.VARARGS);

                var pos = Position();
                if (Accept(TokenType.FROZEN, TokenType.IDENT))
                {
                    bool frozen = false;

                    while (Accept(TokenType.FROZEN))
                    {
                        frozen = true;
                        Next();
                    }

                    proc.Parameters.Add(new ParameterNode(pos, ParseIdent(), frozen));
                }
                else if (Accept(TokenType.VARARGS))
                {
                    proc.Varargs = true;
                    Next();
                    break;
                }
                else
                {
                    Unexpected();
                }

                if (Accept(TokenType.COMMA))
                {
                    ExpectNot(TokenType.RPAREN);
                    Next();
                }
                else
                {
                    Expect(TokenType.RPAREN);
                }
            }

            Expect(TokenType.RPAREN);
            Next();

            Expect(TokenType.FAT_ARROW, TokenType.LBRACE);
            if (Accept(TokenType.FAT_ARROW))
            {
                Next();

                proc.Statements.Add(new ReturnNode(Position(), ParseExpression()));
            }
            else if (Accept(TokenType.LBRACE))
            {
                Next();

                while (More() && !Accept(TokenType.RBRACE))
                {
                    proc.Statements.Add(ParseStatement());
                }

                Expect(TokenType.RBRACE);
                Next();
            }
            else
            {
                Unexpected();
            }

            return(proc);
        }
Exemplo n.º 3
0
 public void VisitProc(ProcNode node)
 {
     VisitProcHandler(node);
 }
Exemplo n.º 4
0
 public ProcNodeTests()
 {
     subject = new ProcNode(new SourcePosition(2, 4), new IdentNode(SourcePosition.NIL, "foo"), true);
 }