Ejemplo n.º 1
0
  virtual void visitBlockNode(BlockNode* node) {
    _output << " {" << endl;
    blockEnter();

    insideBlock(node);

    blockExit(); indent();
    _output << "}";
  }
Ejemplo n.º 2
0
void Parser::forStat() {
    consume(TK_for);
    syms->enterBlock(false);    
    CERR(TOKEN != TK_NAME, E_FOR_NAME, VNIL);

    Value name = lexer->info.name;
    int slot = syms->localsTop();
    advance();
    consume(':'+TK_EQUAL);
    patchOrEmitMove(slot+2, slot+2, expr(slot+2));
    consume(':');
    patchOrEmitMove(slot+3, slot+1, expr(slot+3));
    int pos1 = emitHole();
    int pos2 = HERE;
    syms->set(name, slot);
    syms->addLocalsTop(2);
    insideBlock();
    emitJump(HERE, LOOP, VAL_REG(slot), pos2);
    emitJump(pos1, FOR,  VAL_REG(slot), HERE);
    syms->exitBlock(false);
}
Ejemplo n.º 3
0
bool Parser::block() {
    syms->enterBlock(false);
    bool ret = insideBlock();
    syms->exitBlock(false);
    return ret;
}