//block -> {decls statements} void block(){ match('{'); enviroment saved_env = top; top = Enviroment(top); decls(); stmts(); match('}'); top = saved_env; }
int decls() { printf("%d\n", a); if (a > 0) { a = a - 1; return decls(); } else { a = 0; return a; } }
LetRecNode::LetRecNode(Compiler &compiler, const iter_t &node, bool isProgram) : Node(compiler, Node_ExprLetRec), _isProgram(isProgram) { unsigned j; unsigned jmax = node->children.size(); /* If this an usual letrec, not the program, then don't parse the last child element as an "in" expression. */ if (!isProgram) jmax -= 1; _expr = 0; // Parse RDecls map<string, RDecl*> vars; for (j = 0; j < jmax; j++) { RDecl *rd = new RDecl(compiler, node->children.begin() + j); if (vars.insert(make_pair(rd->alias, rd)).second == false) { throw logic_error("Multiple declarations of \"" + rd->alias + "\"."); } if (isProgram && compiler.testFlag(Compiler::OptimizeMain) && rd->alias == "main") { _expr = rd->expr; } else { _decls.push_back(rd); } } vars.clear(); // We're being very memory efficient here. Embedded here we come! if (isProgram) { if (!compiler.testFlag(Compiler::OptimizeMain)) { _expr = new IdentNode(compiler, "main"); } } else { _expr = Node::nodeFactory(compiler, node->children.begin() + j); } assert(_expr != 0); // Optimize out unused declarations if (!_decls.empty() && compiler.testFlag(Compiler::OptimizeUnused)) { DEBUGMSG("Optimizing unused variables:"); std::vector<RDecl*> decls(_decls); _decls.clear(); unsigned n = decls.size(); BoolMatrix b(n + 1, n + 1, false); for (unsigned c = 0; c < n; c++) { for (unsigned r = 0; r < n; r++) { if (decls.at(r)->expr->usesVariable(decls.at(c)->alias)) { b.data[r][c] = true; } } if (_expr->usesVariable(decls.at(c)->alias)) { b.data[n][c] = true; } } b.transformToTransitiveClosure(); #ifdef DEBUG unsigned unused = 0; #endif for (unsigned i = 0; i < n; i++) { if (b.data[n][i]) { _decls.push_back(decls.at(i)); } else { DEBUGMSG("Found unused variable \"" + decls.at(i)->alias + "\" in letrec."); #ifdef DEBUG unused++; #endif } } DEBUGMSG("Found " + intToString(unused) + "."); } // Reorder cyclic definitions if (_decls.size() > 1 && compiler.testFlag(Compiler::OptimizeLetRecDecls)) { BoolMatrix b(_decls.size(), _decls.size(), true); for (unsigned c = 0; c < _decls.size(); c++) { for (unsigned r = 0; r < _decls.size(); r++) { if (c == r) { b.data[r][r] = false; // Set identity values } else if (_decls.at(r)->expr->usesVariable(_decls.at(c)->alias)) { b.data[r][c] = false; } } } unsigned n = _decls.size(); vector<RDecl*> d(_decls); _decls.clear(); unsigned *ds = new unsigned[n]; for (unsigned i = 0; i < n; i++) ds[i] = i; MySort mySort(&b); stable_sort(ds, ds + n, mySort); for (unsigned i = 0; i < n; i++) _decls.push_back(d.at(ds[i])); delete ds; } }
int main() { printf("Enter a:\n"); // scanf("%d",a); a = 3; printf("%d\n", decls()); }