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); }
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); }
public void VisitProc(ProcNode node) { VisitProcHandler(node); }
public ProcNodeTests() { subject = new ProcNode(new SourcePosition(2, 4), new IdentNode(SourcePosition.NIL, "foo"), true); }