about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/fix-ng/fix-expr.cc10
-rw-r--r--src/fix-ng/fix.sdf6
-rw-r--r--src/fix-ng/parser.cc7
3 files changed, 15 insertions, 8 deletions
diff --git a/src/fix-ng/fix-expr.cc b/src/fix-ng/fix-expr.cc
index 96cb13b725e5..6333595c631b 100644
--- a/src/fix-ng/fix-expr.cc
+++ b/src/fix-ng/fix-expr.cc
@@ -4,8 +4,6 @@
 
 ATerm bottomupRewrite(TermFun & f, ATerm e)
 {
-    e = f(e);
-
     if (ATgetType(e) == AT_APPL) {
         AFun fun = ATgetAFun(e);
         int arity = ATgetArity(fun);
@@ -14,10 +12,10 @@ ATerm bottomupRewrite(TermFun & f, ATerm e)
         for (int i = arity - 1; i >= 0; i--)
             args = ATinsert(args, bottomupRewrite(f, ATgetArgument(e, i)));
         
-        return (ATerm) ATmakeApplList(fun, args);
+        e = (ATerm) ATmakeApplList(fun, args);
     }
 
-    if (ATgetType(e) == AT_LIST) {
+    else if (ATgetType(e) == AT_LIST) {
         ATermList in = (ATermList) e;
         ATermList out = ATempty;
 
@@ -26,10 +24,10 @@ ATerm bottomupRewrite(TermFun & f, ATerm e)
             in = ATgetNext(in);
         }
 
-        return (ATerm) ATreverse(out);
+        e = (ATerm) ATreverse(out);
     }
 
-    return e;
+    return f(e);
 }
 
 
diff --git a/src/fix-ng/fix.sdf b/src/fix-ng/fix.sdf
index e09480314bc4..8e9f0fa72163 100644
--- a/src/fix-ng/fix.sdf
+++ b/src/fix-ng/fix.sdf
@@ -45,7 +45,9 @@ exports
     Bind ";" -> BindSemi 
     BindSemi* -> Binds
 
-    "[" Expr* "]" -> Expr {cons("List")}
+    "[" ExprList "]" -> Expr {cons("List")}
+    "" -> ExprList {cons("ExprNil")}
+    Expr ExprList -> ExprList {cons("ExprCons")}
 
     Expr "." Id -> Expr {cons("Select")}
 
@@ -58,7 +60,7 @@ exports
   context-free priorities
 
     Expr "." Id -> Expr
-  > 
+  > Expr ExprList -> ExprList
   > Expr Expr -> Expr
   > "{" {Id ","}* "}" ":" Expr -> Expr
 
diff --git a/src/fix-ng/parser.cc b/src/fix-ng/parser.cc
index e159262ca1cc..43678ec9719d 100644
--- a/src/fix-ng/parser.cc
+++ b/src/fix-ng/parser.cc
@@ -56,6 +56,13 @@ struct Cleanup : TermFun
         if (ATmatch(e, "Bool(\"false\")", &s))
             return ATmake("Bool(False)");
 
+        if (ATmatch(e, "ExprNil"))
+            return (ATerm) ATempty;
+
+        ATerm e1, e2;
+        if (ATmatch(e, "ExprCons(<term>, [<list>])", &e1, &e2))
+            return (ATerm) ATinsert((ATermList) e2, e1);
+
         return e;
     }
 };