[pure-lang-svn] SF.net SVN: pure-lang:[622] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-08-27 07:37:17
|
Revision: 622 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=622&view=rev Author: agraef Date: 2008-08-27 07:37:26 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Add private symbol infrastructure. Modified Paths: -------------- pure/trunk/interpreter.cc pure/trunk/interpreter.hh pure/trunk/lexer.ll pure/trunk/parser.yy pure/trunk/pure.cc Modified: pure/trunk/interpreter.cc =================================================================== --- pure/trunk/interpreter.cc 2008-08-27 07:12:55 UTC (rev 621) +++ pure/trunk/interpreter.cc 2008-08-27 07:37:26 UTC (rev 622) @@ -59,7 +59,7 @@ : verbose(0), interactive(false), ttymode(false), override(false), stats(false), temp(0), ps("> "), libdir(""), histfile("/.pure_history"), modname("pure"), - nerrs(0), source_s(0), result(0), mem(0), exps(0), tmps(0), + nerrs(0), modno(-1), source_s(0), result(0), mem(0), exps(0), tmps(0), module(0), JIT(0), FPM(0), fptr(0) { if (!g_interp) { @@ -1166,11 +1166,11 @@ } } -void interpreter::declare(prec_t prec, fix_t fix, list<string> *ids) +void interpreter::declare(bool priv, prec_t prec, fix_t fix, list<string> *ids) { for (list<string>::const_iterator it = ids->begin(); it != ids->end(); ++it) { - symbol* sym = symtab.lookup(*it); + symbol* sym = symtab.xlookup(*it, priv?modno:-1); if (sym) { // crosscheck declarations if (sym->prec != prec || sym->fix != fix) { @@ -1179,7 +1179,7 @@ throw err("conflicting fixity declaration for symbol '"+id+"'"); } } else { - int32_t tag = symtab.sym(*it, prec, fix).f; + int32_t tag = symtab.xsym(*it, prec, fix, priv?modno:-1).f; /* KLUDGE: Already create a globalvars entry here, so that the symbol is properly recognized by the completion routines. */ pure_expr *cv = pure_const(tag); @@ -2352,7 +2352,7 @@ expr *interpreter::mksym_expr(string *s, int8_t tag) { expr *x; - const symbol &sym = symtab.sym(*s); + const symbol &sym = symtab.sym(*s, modno); if (tag == 0) if (*s == "_") // Return a new instance here, since the anonymous variable may have @@ -2373,7 +2373,7 @@ expr *interpreter::mkas_expr(string *s, expr *x) { - const symbol &sym = symtab.sym(*s); + const symbol &sym = symtab.sym(*s, modno); if (sym.f <= 0 || sym.prec < 10 || sym.fix == nullary) throw err("error in pattern (bad variable symbol '"+sym.s+"')"); if (x->tag() > 0) { @@ -3405,10 +3405,13 @@ // First check whether there already is a Pure function or global variable // for this symbol. This is an error (unless it's already declared as an // external, too). - symbol& sym = symtab.sym(asname); - if (globenv.find(sym.f) != globenv.end() && - externals.find(sym.f) == externals.end()) + symbol& sym = symtab.sym(asname, modno); + if (sym.modno >= 0) throw err("symbol '"+name+ + "' is private in this context"); + else if (globenv.find(sym.f) != globenv.end() && + externals.find(sym.f) == externals.end()) + throw err("symbol '"+name+ "' is already defined as a Pure function or variable"); // Create the function type and check for an existing declaration of the // external. Modified: pure/trunk/interpreter.hh =================================================================== --- pure/trunk/interpreter.hh 2008-08-27 07:12:55 UTC (rev 621) +++ pure/trunk/interpreter.hh 2008-08-27 07:37:26 UTC (rev 622) @@ -323,6 +323,7 @@ // Interpreter state. For internal use only. int nerrs; // current error count string errmsg; // last reported error (runstr) + int32_t modno; // current module key string source; // the source being parsed const char *source_s; // source pointer if input comes from a string set<string> sources; // the list of all scripts which have been loaded @@ -434,7 +435,7 @@ void build_env(env& vars, expr x); void mark_dirty(int32_t f); void compile(expr x); - void declare(prec_t prec, fix_t fix, list<string> *ids); + void declare(bool priv, prec_t prec, fix_t fix, list<string> *ids); void define(rule *r); void define_const(rule *r); void exec(expr *x); Modified: pure/trunk/lexer.ll =================================================================== --- pure/trunk/lexer.ll 2008-08-27 07:12:55 UTC (rev 621) +++ pure/trunk/lexer.ll 2008-08-27 07:37:26 UTC (rev 622) @@ -170,7 +170,8 @@ symbol list. */ while (f <= n) { /* Skip non-toplevel symbols. */ - if (interp.globenv.find(f) == interp.globenv.end() && + if (interp.symtab.sym(f).modno >= 0 || + interp.globenv.find(f) == interp.globenv.end() && interp.macenv.find(f) == interp.macenv.end() && interp.globalvars.find(f) == interp.globalvars.end() && interp.externals.find(f) == interp.externals.end()) { @@ -436,7 +437,8 @@ int32_t f = it->first; const env_info& e = it->second; const symbol& sym = interp.symtab.sym(f); - if (!((e.t == env_info::fun)?fflag: + if (sym.modno >= 0 || // skip private symbols + !((e.t == env_info::fun)?fflag: (e.t == env_info::cvar)?cflag: (e.t == env_info::fvar)?vflag:0)) continue; @@ -504,6 +506,7 @@ if (syms.find(f) == syms.end()) { const env_info& e = it->second; const symbol& sym = interp.symtab.sym(f); + if (sym.modno >= 0) continue; // skip private symbols bool matches = e.temp >= tflag; if (!matches && !sflag && args.l.empty()) { // if not in summary mode, also list temporary rules for a @@ -912,7 +915,7 @@ yylval->sval = new string(yytext); return token::ID; } - symbol* sym = interp.symtab.lookup(yytext); + symbol* sym = interp.symtab.lookup(yytext, interp.modno); if (sym && sym->prec >= 0 && sym->prec < 10) { yylval->xval = new expr(sym->x); return optoken[sym->prec][sym->fix]; @@ -930,12 +933,12 @@ yylval->sval = new string(yytext); return token::ID; } - symbol* sym = interp.symtab.lookup(yytext); + symbol* sym = interp.symtab.lookup(yytext, interp.modno); while (!sym && yyleng > 1) { if (yyleng == 2 && yytext[0] == '-' && yytext[1] == '>') return token::MAPSTO; yyless(yyleng-1); - sym = interp.symtab.lookup(yytext); + sym = interp.symtab.lookup(yytext, interp.modno); } if (sym) { if (sym->prec < 10) { Modified: pure/trunk/parser.yy =================================================================== --- pure/trunk/parser.yy 2008-08-27 07:12:55 UTC (rev 621) +++ pure/trunk/parser.yy 2008-08-27 07:37:26 UTC (rev 622) @@ -54,9 +54,10 @@ %{ struct sym_info { + bool priv; prec_t prec; fix_t fix; - sym_info(prec_t p, fix_t f) : prec(p), fix(f) { } + sym_info(bool v, prec_t p, fix_t f) : priv(v), prec(p), fix(f) { } }; struct rule_info { exprl l; @@ -295,15 +296,16 @@ interp.declare_op = true; } ids { interp.declare_op = false; - action(interp.declare($1->prec, $1->fix, $3), delete $3); delete $1; } + action(interp.declare($1->priv, $1->prec, $1->fix, $3), delete $3); + delete $1; } | USING names { action(interp.run(*$2), {}); delete $2; } | EXTERN prototypes ; fixity -: FIX INT { $$ = new sym_info($2,$1); } -| NULLARY { $$ = new sym_info(10,nullary); } +: FIX INT { $$ = new sym_info(false,$2,$1); } +| NULLARY { $$ = new sym_info(false,10,nullary); } ; ids Modified: pure/trunk/pure.cc =================================================================== --- pure/trunk/pure.cc 2008-08-27 07:12:55 UTC (rev 621) +++ pure/trunk/pure.cc 2008-08-27 07:37:26 UTC (rev 622) @@ -94,7 +94,8 @@ symbol list. */ while (f <= n) { /* Skip non-toplevel symbols. */ - if (interp.globenv.find(f) == interp.globenv.end() && + if (interp.symtab.sym(f).modno >= 0 || + interp.globenv.find(f) == interp.globenv.end() && interp.macenv.find(f) == interp.macenv.end() && interp.globalvars.find(f) == interp.globalvars.end() && interp.externals.find(f) == interp.externals.end()) { @@ -132,7 +133,8 @@ symbol list. */ while (f <= n) { /* Skip non-toplevel symbols. */ - if (interp.globenv.find(f) == interp.globenv.end() && + if (interp.symtab.sym(f).modno >= 0 || + interp.globenv.find(f) == interp.globenv.end() && interp.macenv.find(f) == interp.macenv.end() && interp.globalvars.find(f) == interp.globalvars.end() && interp.externals.find(f) == interp.externals.end()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |