[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.
|