aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/parser.y
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2008-08-14 10:04:22 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2008-08-14 10:04:22 +0000
commitefe4b690ae4de5f0adea99abb1176a64a099d433 (patch)
tree3ee26b49848b04b5f6dad8edc06509fe4d4ee067 /src/libexpr/parser.y
parentc03b729319997b4e38c3f586d7c76352228b22e7 (diff)
* Refactoring: combine functions that take an attribute set and
functions that take a single argument (plain lambdas) into one AST node (Function) that contains a Pattern node describing the arguments. Current patterns are single lazy arguments (VarPat) and matching against an attribute set (AttrsPat). This refactoring allows other kinds of patterns to be added easily, such as Haskell-style @-patterns, or list pattern matching.
Diffstat (limited to 'src/libexpr/parser.y')
-rw-r--r--src/libexpr/parser.y33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index 9c941bb7d..067a0f8d5 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -237,9 +237,9 @@ expr: expr_function;
expr_function
: '{' formals '}' ':' expr_function
- { $$ = makeFunction($2, $5, CUR_POS); }
+ { $$ = makeFunction(makeAttrsPat($2), $5, CUR_POS); }
| ID ':' expr_function
- { $$ = makeFunction1($1, $3, CUR_POS); }
+ { $$ = makeFunction(makeVarPat($1), $3, CUR_POS); }
| ASSERT expr ';' expr_function
{ $$ = makeAssert($2, $4, CUR_POS); }
| WITH expr ';' expr_function
@@ -387,22 +387,37 @@ static void checkAttrs(ATermMap & names, ATermList bnds)
}
-static void checkAttrSets(ATerm e)
+static void checkPatternVars(ATerm pos, ATermMap & map, Pattern pat)
{
+ ATerm name;
ATermList formals;
- ATerm body, pos;
- if (matchFunction(e, formals, body, pos)) {
- ATermMap names(ATgetLength(formals));
+ if (matchVarPat(pat, name)) {
+ if (map.get(name))
+ throw EvalError(format("duplicate formal function argument `%1%' at %2%")
+ % aterm2String(name) % showPos(pos));
+ map.set(name, name);
+ }
+ else if (matchAttrsPat(pat, formals)) {
for (ATermIterator i(formals); i; ++i) {
- ATerm name;
ATerm d1;
if (!matchFormal(*i, name, d1)) abort();
- if (names.get(name))
+ if (map.get(name))
throw EvalError(format("duplicate formal function argument `%1%' at %2%")
% aterm2String(name) % showPos(pos));
- names.set(name, name);
+ map.set(name, name);
}
}
+ else abort();
+}
+
+
+static void checkAttrSets(ATerm e)
+{
+ ATerm pat, body, pos;
+ if (matchFunction(e, pat, body, pos)) {
+ ATermMap map(16);
+ checkPatternVars(pos, map, pat);
+ }
ATermList bnds;
if (matchAttrs(e, bnds)) {