// Done during the parsing phase now so redundant code, keeping for now //public static void LabelProgram(IEnumerable<IStatement> blocks) //{ // var labelCounter = 0; // foreach (var statement in blocks) // { // statement.Label = ++labelCounter; // } //} public static int Init(IAstNode node) { return(node switch { Program program => Init(program.TopLevelStmts.First()), ScopedBlock scopedBlock => Init(scopedBlock.Statements.First()), UnscopedBlock unscopedBlock => Init(unscopedBlock.Statements.First()), IStatement statement => statement.Label, _ => throw new ArgumentException("Init can only accept Meta Nodes and IStatement Nodes") });
public override IAstNode VisitWhileStmt(MicroCParser.WhileStmtContext context) { var label = ++_label; IBExpr condition = Visit(context.b_expr()) as IBExpr; UnscopedBlock body = Visit(context.unscopedBlock()) as UnscopedBlock; var whileStmt = new WhileStmt(condition, body); whileStmt.Label = label; return(whileStmt); }
public override IAstNode VisitIfElseStmt(MicroCParser.IfElseStmtContext context) { var label = ++_label; IBExpr condition = Visit(context.b_expr()) as IBExpr; UnscopedBlock ifBody = Visit(context.ifBody) as UnscopedBlock; UnscopedBlock elseBody = Visit(context.elseBody) as UnscopedBlock; var ifElseStmt = new IfElseStmt(condition, ifBody, elseBody); ifElseStmt.Label = label; return(ifElseStmt); }
public IfStmt(IBExpr condition, UnscopedBlock body) { Condition = condition; Body = body; }
public IfElseStmt(IBExpr condition, UnscopedBlock ifBody, UnscopedBlock elseBody) { Condition = condition; IfBody = ifBody; ElseBody = elseBody; }