diff options
Diffstat (limited to 'src/parse.cpp')
-rw-r--r-- | src/parse.cpp | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/src/parse.cpp b/src/parse.cpp index 3aa5b74..83a4934 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -58,7 +58,7 @@ PEnv::parse(const AST* exp) return h->func(*this, exp, h->arg); // Parse special form if (isupper(form->c_str()[0])) // Call constructor (any uppercase symbol) - return parseTuple<ACons>(*this, tup); + return parseTuple<ACall>(*this, tup); } return parseTuple<ACall>(*this, tup); // Parse regular call @@ -129,11 +129,10 @@ macDef(PEnv& penv, const AST* exp) * Parser Functions * ***************************************************************************/ -template<typename C> inline AST* parseCall(PEnv& penv, const AST* exp, void* arg) { - return parseTuple<C>(penv, exp->to<const ATuple*>()); + return parseTuple<ACall>(penv, exp->to<const ATuple*>()); } template<typename T> @@ -165,7 +164,7 @@ parseQuote(PEnv& penv, const AST* exp, void* arg) THROW_IF(texp->list_len() != 2, exp->loc, "`quote' requires exactly 1 argument"); const ALexeme* quotee = texp->list_ref(1)->to<const ALexeme*>(); THROW_IF(!quotee, exp->loc, "`quote' argument is not a lexeme"); - AQuote* ret = tup<AQuote>(texp->loc, penv.sym("quote"), quotee, NULL); + ACall* ret = tup<ACall>(texp->loc, penv.sym("quote"), quotee, NULL); return ret; } @@ -174,7 +173,6 @@ parseQuote(PEnv& penv, const AST* exp, void* arg) * Language Definition * ***************************************************************************/ -/// Set up language void initLang(PEnv& penv, TEnv& tenv) { @@ -199,25 +197,27 @@ initLang(PEnv& penv, TEnv& tenv) // Special forms penv.reg(true, "fn", PEnv::Handler(parseFn)); penv.reg(true, "quote", PEnv::Handler(parseQuote)); - penv.reg(true, "if", PEnv::Handler(parseCall<AIf>)); - penv.reg(true, ".", PEnv::Handler(parseCall<ADot>)); - penv.reg(true, "def", PEnv::Handler(parseCall<ADef>)); - penv.reg(true, "def-type", PEnv::Handler(parseCall<ADefType>)); - penv.reg(true, "match", PEnv::Handler(parseCall<AMatch>)); + penv.reg(true, "if", PEnv::Handler(parseCall)); + penv.reg(true, ".", PEnv::Handler(parseCall)); + penv.reg(true, "def", PEnv::Handler(parseCall)); + penv.reg(true, "def-type", PEnv::Handler(parseCall)); + penv.reg(true, "match", PEnv::Handler(parseCall)); // Numeric primitives - penv.reg(true, "+", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "-", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "*", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "/", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "%", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "and", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "or", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "xor", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "=", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "!=", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, ">", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, ">=", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "<", PEnv::Handler(parseCall<APrimitive>)); - penv.reg(true, "<=", PEnv::Handler(parseCall<APrimitive>)); + penv.primitives.insert("+"); + penv.primitives.insert("-"); + penv.primitives.insert("*"); + penv.primitives.insert("/"); + penv.primitives.insert("%"); + penv.primitives.insert("and"); + penv.primitives.insert("or"); + penv.primitives.insert("xor"); + penv.primitives.insert("="); + penv.primitives.insert("!="); + penv.primitives.insert(">"); + penv.primitives.insert(">="); + penv.primitives.insert("<"); + penv.primitives.insert("<="); + FOREACH (PEnv::Primitives::const_iterator, i, penv.primitives) + penv.reg(true, *i, PEnv::Handler(parseCall)); } |