aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.cpp')
-rw-r--r--src/parse.cpp48
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));
}