diff --git a/edify/expr.c b/edify/expr.c
index 5470a2b..406c67e 100644
--- a/edify/expr.c
+++ b/edify/expr.c
@@ -29,249 +29,241 @@
 //    - if Evaluate() on any argument returns NULL, return NULL.
 
 int BooleanString(const char* s) {
-  return s[0] != '\0';
+    return s[0] != '\0';
 }
 
-char* Evaluate(void* cookie, Expr* expr) {
-  return expr->fn(expr->name, cookie, expr->argc, expr->argv);
+char* Evaluate(State* state, Expr* expr) {
+    return expr->fn(expr->name, state, expr->argc, expr->argv);
 }
 
-char* ConcatFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  if (argc == 0) {
-    return strdup("");
-  }
-  char** strings = malloc(argc * sizeof(char*));
-  int i;
-  for (i = 0; i < argc; ++i) {
-    strings[i] = NULL;
-  }
-  char* result = NULL;
-  int length = 0;
-  for (i = 0; i < argc; ++i) {
-    strings[i] = Evaluate(cookie, argv[i]);
-    if (strings[i] == NULL) {
-      goto done;
+char* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
+    if (argc == 0) {
+        return strdup("");
     }
-    length += strlen(strings[i]);
-  }
+    char** strings = malloc(argc * sizeof(char*));
+    int i;
+    for (i = 0; i < argc; ++i) {
+        strings[i] = NULL;
+    }
+    char* result = NULL;
+    int length = 0;
+    for (i = 0; i < argc; ++i) {
+        strings[i] = Evaluate(state, argv[i]);
+        if (strings[i] == NULL) {
+            goto done;
+        }
+        length += strlen(strings[i]);
+    }
 
-  result = malloc(length+1);
-  int p = 0;
-  for (i = 0; i < argc; ++i) {
-    strcpy(result+p, strings[i]);
-    p += strlen(strings[i]);
-  }
-  result[p] = '\0';
+    result = malloc(length+1);
+    int p = 0;
+    for (i = 0; i < argc; ++i) {
+        strcpy(result+p, strings[i]);
+        p += strlen(strings[i]);
+    }
+    result[p] = '\0';
 
-done:
-  for (i = 0; i < argc; ++i) {
-    free(strings[i]);
-  }
-  return result;
+  done:
+    for (i = 0; i < argc; ++i) {
+        free(strings[i]);
+    }
+    return result;
 }
 
-char* IfElseFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  if (argc != 2 && argc != 3) {
-    return NULL;
-  }
-  char* cond = Evaluate(cookie, argv[0]);
-  if (cond == NULL) {
-    return NULL;
-  }
+char* IfElseFn(const char* name, State* state, int argc, Expr* argv[]) {
+    if (argc != 2 && argc != 3) {
+        return NULL;
+    }
+    char* cond = Evaluate(state, argv[0]);
+    if (cond == NULL) {
+        return NULL;
+    }
 
-  if (BooleanString(cond) == true) {
-    free(cond);
-    return Evaluate(cookie, argv[1]);
-  } else {
-    if (argc == 3) {
-      free(cond);
-      return Evaluate(cookie, argv[2]);
+    if (BooleanString(cond) == true) {
+        free(cond);
+        return Evaluate(state, argv[1]);
     } else {
-      return cond;
+        if (argc == 3) {
+            free(cond);
+            return Evaluate(state, argv[2]);
+        } else {
+            return cond;
+        }
     }
-  }
 }
 
-char* AbortFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  char* msg = NULL;
-  if (argc > 0) {
-    msg = Evaluate(cookie, argv[0]);
-  }
-  SetError(msg == NULL ? "called abort()" : msg);
-  free(msg);
-  return NULL;
-}
-
-char* AssertFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  int i;
-  for (i = 0; i < argc; ++i) {
-    char* v = Evaluate(cookie, argv[i]);
-    if (v == NULL) {
-      return NULL;
+char* AbortFn(const char* name, State* state, int argc, Expr* argv[]) {
+    char* msg = NULL;
+    if (argc > 0) {
+        msg = Evaluate(state, argv[0]);
     }
-    int b = BooleanString(v);
-    free(v);
-    if (!b) {
-      SetError("assert() failed");
-      return NULL;
+    free(state->errmsg);
+    if (msg) {
+        state->errmsg = msg;
+    } else {
+        state->errmsg = strdup("called abort()");
     }
-  }
-  return strdup("");
-}
-
-char* SleepFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  char* val = Evaluate(cookie, argv[0]);
-  if (val == NULL) {
     return NULL;
-  }
-  int v = strtol(val, NULL, 10);
-  sleep(v);
-  return val;
 }
 
-char* PrintFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  int i;
-  for (i = 0; i < argc; ++i) {
-    char* v = Evaluate(cookie, argv[i]);
-    if (v == NULL) {
-      return NULL;
+char* AssertFn(const char* name, State* state, int argc, Expr* argv[]) {
+    int i;
+    for (i = 0; i < argc; ++i) {
+        char* v = Evaluate(state, argv[i]);
+        if (v == NULL) {
+            return NULL;
+        }
+        int b = BooleanString(v);
+        free(v);
+        if (!b) {
+            int prefix_len;
+            int len = argv[i]->end - argv[i]->start;
+            char* err_src = malloc(len + 20);
+            strcpy(err_src, "assert failed: ");
+            prefix_len = strlen(err_src);
+            memcpy(err_src + prefix_len, state->script + argv[i]->start, len);
+            err_src[prefix_len + len] = '\0';
+            free(state->errmsg);
+            state->errmsg = err_src;
+            return NULL;
+        }
     }
-    fputs(v, stdout);
-    free(v);
-  }
-  return strdup("");
-}
-
-char* LogicalAndFn(const char* name, void* cookie,
-                   int argc, Expr* argv[]) {
-  char* left = Evaluate(cookie, argv[0]);
-  if (left == NULL) return NULL;
-  if (BooleanString(left) == true) {
-    free(left);
-    return Evaluate(cookie, argv[1]);
-  } else {
-    return left;
-  }
-}
-
-char* LogicalOrFn(const char* name, void* cookie,
-                  int argc, Expr* argv[]) {
-  char* left = Evaluate(cookie, argv[0]);
-  if (left == NULL) return NULL;
-  if (BooleanString(left) == false) {
-    free(left);
-    return Evaluate(cookie, argv[1]);
-  } else {
-    return left;
-  }
-}
-
-char* LogicalNotFn(const char* name, void* cookie,
-                  int argc, Expr* argv[]) {
-  char* val = Evaluate(cookie, argv[0]);
-  if (val == NULL) return NULL;
-  bool bv = BooleanString(val);
-  free(val);
-  if (bv) {
     return strdup("");
-  } else {
-    return strdup("t");
-  }
 }
 
-char* SubstringFn(const char* name, void* cookie,
+char* SleepFn(const char* name, State* state, int argc, Expr* argv[]) {
+    char* val = Evaluate(state, argv[0]);
+    if (val == NULL) {
+        return NULL;
+    }
+    int v = strtol(val, NULL, 10);
+    sleep(v);
+    return val;
+}
+
+char* StdoutFn(const char* name, State* state, int argc, Expr* argv[]) {
+    int i;
+    for (i = 0; i < argc; ++i) {
+        char* v = Evaluate(state, argv[i]);
+        if (v == NULL) {
+            return NULL;
+        }
+        fputs(v, stdout);
+        free(v);
+    }
+    return strdup("");
+}
+
+char* LogicalAndFn(const char* name, State* state,
+                   int argc, Expr* argv[]) {
+    char* left = Evaluate(state, argv[0]);
+    if (left == NULL) return NULL;
+    if (BooleanString(left) == true) {
+        free(left);
+        return Evaluate(state, argv[1]);
+    } else {
+        return left;
+    }
+}
+
+char* LogicalOrFn(const char* name, State* state,
                   int argc, Expr* argv[]) {
-  char* needle = Evaluate(cookie, argv[0]);
-  if (needle == NULL) return NULL;
-  char* haystack = Evaluate(cookie, argv[1]);
-  if (haystack == NULL) {
+    char* left = Evaluate(state, argv[0]);
+    if (left == NULL) return NULL;
+    if (BooleanString(left) == false) {
+        free(left);
+        return Evaluate(state, argv[1]);
+    } else {
+        return left;
+    }
+}
+
+char* LogicalNotFn(const char* name, State* state,
+                   int argc, Expr* argv[]) {
+    char* val = Evaluate(state, argv[0]);
+    if (val == NULL) return NULL;
+    bool bv = BooleanString(val);
+    free(val);
+    if (bv) {
+        return strdup("");
+    } else {
+        return strdup("t");
+    }
+}
+
+char* SubstringFn(const char* name, State* state,
+                  int argc, Expr* argv[]) {
+    char* needle = Evaluate(state, argv[0]);
+    if (needle == NULL) return NULL;
+    char* haystack = Evaluate(state, argv[1]);
+    if (haystack == NULL) {
+        free(needle);
+        return NULL;
+    }
+
+    char* result = strdup(strstr(haystack, needle) ? "t" : "");
     free(needle);
-    return NULL;
-  }
-
-  char* result = strdup(strstr(haystack, needle) ? "t" : "");
-  free(needle);
-  free(haystack);
-  return result;
+    free(haystack);
+    return result;
 }
 
-char* EqualityFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  char* left = Evaluate(cookie, argv[0]);
-  if (left == NULL) return NULL;
-  char* right = Evaluate(cookie, argv[1]);
-  if (right == NULL) {
+char* EqualityFn(const char* name, State* state, int argc, Expr* argv[]) {
+    char* left = Evaluate(state, argv[0]);
+    if (left == NULL) return NULL;
+    char* right = Evaluate(state, argv[1]);
+    if (right == NULL) {
+        free(left);
+        return NULL;
+    }
+
+    char* result = strdup(strcmp(left, right) == 0 ? "t" : "");
     free(left);
-    return NULL;
-  }
-
-  char* result = strdup(strcmp(left, right) == 0 ? "t" : "");
-  free(left);
-  free(right);
-  return result;
+    free(right);
+    return result;
 }
 
-char* InequalityFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  char* left = Evaluate(cookie, argv[0]);
-  if (left == NULL) return NULL;
-  char* right = Evaluate(cookie, argv[1]);
-  if (right == NULL) {
+char* InequalityFn(const char* name, State* state, int argc, Expr* argv[]) {
+    char* left = Evaluate(state, argv[0]);
+    if (left == NULL) return NULL;
+    char* right = Evaluate(state, argv[1]);
+    if (right == NULL) {
+        free(left);
+        return NULL;
+    }
+
+    char* result = strdup(strcmp(left, right) != 0 ? "t" : "");
     free(left);
-    return NULL;
-  }
-
-  char* result = strdup(strcmp(left, right) != 0 ? "t" : "");
-  free(left);
-  free(right);
-  return result;
+    free(right);
+    return result;
 }
 
-char* SequenceFn(const char* name, void* cookie, int argc, Expr* argv[]) {
-  char* left = Evaluate(cookie, argv[0]);
-  if (left == NULL) return NULL;
-  free(left);
-  return Evaluate(cookie, argv[1]);
+char* SequenceFn(const char* name, State* state, int argc, Expr* argv[]) {
+    char* left = Evaluate(state, argv[0]);
+    if (left == NULL) return NULL;
+    free(left);
+    return Evaluate(state, argv[1]);
 }
 
-char* Literal(const char* name, void* cookie, int argc, Expr* argv[]) {
-  return strdup(name);
+char* Literal(const char* name, State* state, int argc, Expr* argv[]) {
+    return strdup(name);
 }
 
-Expr* Build(Function fn, int count, ...) {
-  va_list v;
-  va_start(v, count);
-  Expr* e = malloc(sizeof(Expr));
-  e->fn = fn;
-  e->name = "(operator)";
-  e->argc = count;
-  e->argv = malloc(count * sizeof(Expr*));
-  int i;
-  for (i = 0; i < count; ++i) {
-    e->argv[i] = va_arg(v, Expr*);
-  }
-  va_end(v);
-  return e;
-}
-
-// -----------------------------------------------------------------
-//   error reporting
-// -----------------------------------------------------------------
-
-static char* error_message = NULL;
-
-void SetError(const char* message) {
-  if (error_message) {
-    free(error_message);
-  }
-  error_message = strdup(message);
-}
-
-const char* GetError() {
-  return error_message;
-}
-
-void ClearError() {
-  free(error_message);
-  error_message = NULL;
+Expr* Build(Function fn, YYLTYPE loc, int count, ...) {
+    va_list v;
+    va_start(v, count);
+    Expr* e = malloc(sizeof(Expr));
+    e->fn = fn;
+    e->name = "(operator)";
+    e->argc = count;
+    e->argv = malloc(count * sizeof(Expr*));
+    int i;
+    for (i = 0; i < count; ++i) {
+        e->argv[i] = va_arg(v, Expr*);
+    }
+    va_end(v);
+    e->start = loc.start;
+    e->end = loc.end;
+    return e;
 }
 
 // -----------------------------------------------------------------
@@ -283,44 +275,44 @@
 NamedFunction* fn_table = NULL;
 
 void RegisterFunction(const char* name, Function fn) {
-  if (fn_entries >= fn_size) {
-    fn_size = fn_size*2 + 1;
-    fn_table = realloc(fn_table, fn_size * sizeof(NamedFunction));
-  }
-  fn_table[fn_entries].name = name;
-  fn_table[fn_entries].fn = fn;
-  ++fn_entries;
+    if (fn_entries >= fn_size) {
+        fn_size = fn_size*2 + 1;
+        fn_table = realloc(fn_table, fn_size * sizeof(NamedFunction));
+    }
+    fn_table[fn_entries].name = name;
+    fn_table[fn_entries].fn = fn;
+    ++fn_entries;
 }
 
 static int fn_entry_compare(const void* a, const void* b) {
-  const char* na = ((const NamedFunction*)a)->name;
-  const char* nb = ((const NamedFunction*)b)->name;
-  return strcmp(na, nb);
+    const char* na = ((const NamedFunction*)a)->name;
+    const char* nb = ((const NamedFunction*)b)->name;
+    return strcmp(na, nb);
 }
 
 void FinishRegistration() {
-  qsort(fn_table, fn_entries, sizeof(NamedFunction), fn_entry_compare);
+    qsort(fn_table, fn_entries, sizeof(NamedFunction), fn_entry_compare);
 }
 
 Function FindFunction(const char* name) {
-  NamedFunction key;
-  key.name = name;
-  NamedFunction* nf = bsearch(&key, fn_table, fn_entries, sizeof(NamedFunction),
-                              fn_entry_compare);
-  if (nf == NULL) {
-    return NULL;
-  }
-  return nf->fn;
+    NamedFunction key;
+    key.name = name;
+    NamedFunction* nf = bsearch(&key, fn_table, fn_entries,
+                                sizeof(NamedFunction), fn_entry_compare);
+    if (nf == NULL) {
+        return NULL;
+    }
+    return nf->fn;
 }
 
 void RegisterBuiltins() {
-  RegisterFunction("ifelse", IfElseFn);
-  RegisterFunction("abort", AbortFn);
-  RegisterFunction("assert", AssertFn);
-  RegisterFunction("concat", ConcatFn);
-  RegisterFunction("is_substring", SubstringFn);
-  RegisterFunction("print", PrintFn);
-  RegisterFunction("sleep", SleepFn);
+    RegisterFunction("ifelse", IfElseFn);
+    RegisterFunction("abort", AbortFn);
+    RegisterFunction("assert", AssertFn);
+    RegisterFunction("concat", ConcatFn);
+    RegisterFunction("is_substring", SubstringFn);
+    RegisterFunction("stdout", StdoutFn);
+    RegisterFunction("sleep", SleepFn);
 }
 
 
@@ -331,44 +323,44 @@
 // Evaluate the expressions in argv, giving 'count' char* (the ... is
 // zero or more char** to put them in).  If any expression evaluates
 // to NULL, free the rest and return -1.  Return 0 on success.
-int ReadArgs(void* cookie, Expr* argv[], int count, ...) {
-  char** args = malloc(count * sizeof(char*));
-  va_list v;
-  va_start(v, count);
-  int i;
-  for (i = 0; i < count; ++i) {
-    args[i] = Evaluate(cookie, argv[i]);
-    if (args[i] == NULL) {
-      va_end(v);
-      int j;
-      for (j = 0; j < i; ++j) {
-        free(args[j]);
-      }
-      return -1;
+int ReadArgs(State* state, Expr* argv[], int count, ...) {
+    char** args = malloc(count * sizeof(char*));
+    va_list v;
+    va_start(v, count);
+    int i;
+    for (i = 0; i < count; ++i) {
+        args[i] = Evaluate(state, argv[i]);
+        if (args[i] == NULL) {
+            va_end(v);
+            int j;
+            for (j = 0; j < i; ++j) {
+                free(args[j]);
+            }
+            return -1;
+        }
+        *(va_arg(v, char**)) = args[i];
     }
-    *(va_arg(v, char**)) = args[i];
-  }
-  va_end(v);
-  return 0;
+    va_end(v);
+    return 0;
 }
 
 // Evaluate the expressions in argv, returning an array of char*
 // results.  If any evaluate to NULL, free the rest and return NULL.
 // The caller is responsible for freeing the returned array and the
 // strings it contains.
-char** ReadVarArgs(void* cookie, int argc, Expr* argv[]) {
-  char** args = (char**)malloc(argc * sizeof(char*));
-  int i = 0;
-  for (i = 0; i < argc; ++i) {
-    args[i] = Evaluate(cookie, argv[i]);
-    if (args[i] == NULL) {
-      int j;
-      for (j = 0; j < i; ++j) {
-        free(args[j]);
-      }
-      free(args);
-      return NULL;
+char** ReadVarArgs(State* state, int argc, Expr* argv[]) {
+    char** args = (char**)malloc(argc * sizeof(char*));
+    int i = 0;
+    for (i = 0; i < argc; ++i) {
+        args[i] = Evaluate(state, argv[i]);
+        if (args[i] == NULL) {
+            int j;
+            for (j = 0; j < i; ++j) {
+                free(args[j]);
+            }
+            free(args);
+            return NULL;
+        }
     }
-  }
-  return args;
+    return args;
 }
diff --git a/edify/expr.h b/edify/expr.h
index cfbef90..671b499 100644
--- a/edify/expr.h
+++ b/edify/expr.h
@@ -17,45 +17,64 @@
 #ifndef _EXPRESSION_H
 #define _EXPRESSION_H
 
+#include "yydefs.h"
+
 #define MAX_STRING_LEN 1024
 
 typedef struct Expr Expr;
 
-typedef char* (*Function)(const char* name, void* cookie,
+typedef struct {
+    // Optional pointer to app-specific data; the core of edify never
+    // uses this value.
+    void* cookie;
+
+    // The source of the original script.  Must be NULL-terminated,
+    // and in writable memory (Evaluate may make temporary changes to
+    // it but will restore it when done).
+    char* script;
+
+    // The error message (if any) returned if the evaluation aborts.
+    // Should be NULL initially, will be either NULL or a malloc'd
+    // pointer after Evaluate() returns.
+    char* errmsg;
+} State;
+
+typedef char* (*Function)(const char* name, State* state,
                           int argc, Expr* argv[]);
 
 struct Expr {
-  Function fn;
-  char* name;
-  int argc;
-  Expr** argv;
+    Function fn;
+    char* name;
+    int argc;
+    Expr** argv;
+    int start, end;
 };
 
-char* Evaluate(void* cookie, Expr* expr);
+char* Evaluate(State* state, Expr* expr);
 
 // Glue to make an Expr out of a literal.
-char* Literal(const char* name, void* cookie, int argc, Expr* argv[]);
+char* Literal(const char* name, State* state, int argc, Expr* argv[]);
 
 // Functions corresponding to various syntactic sugar operators.
 // ("concat" is also available as a builtin function, to concatenate
 // more than two strings.)
-char* ConcatFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* LogicalAndFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* LogicalOrFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* LogicalNotFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* SubstringFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* EqualityFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* InequalityFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* SequenceFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* ConcatFn(const char* name, State* state, int argc, Expr* argv[]);
+char* LogicalAndFn(const char* name, State* state, int argc, Expr* argv[]);
+char* LogicalOrFn(const char* name, State* state, int argc, Expr* argv[]);
+char* LogicalNotFn(const char* name, State* state, int argc, Expr* argv[]);
+char* SubstringFn(const char* name, State* state, int argc, Expr* argv[]);
+char* EqualityFn(const char* name, State* state, int argc, Expr* argv[]);
+char* InequalityFn(const char* name, State* state, int argc, Expr* argv[]);
+char* SequenceFn(const char* name, State* state, int argc, Expr* argv[]);
 
 // Convenience function for building expressions with a fixed number
 // of arguments.
-Expr* Build(Function fn, int count, ...);
+Expr* Build(Function fn, YYLTYPE loc, int count, ...);
 
 // Global builtins, registered by RegisterBuiltins().
-char* IfElseFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* AssertFn(const char* name, void* cookie, int argc, Expr* argv[]);
-char* AbortFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* IfElseFn(const char* name, State* state, int argc, Expr* argv[]);
+char* AssertFn(const char* name, State* state, int argc, Expr* argv[]);
+char* AbortFn(const char* name, State* state, int argc, Expr* argv[]);
 
 
 // For setting and getting the global error string (when returning
@@ -91,13 +110,13 @@
 // Evaluate the expressions in argv, giving 'count' char* (the ... is
 // zero or more char** to put them in).  If any expression evaluates
 // to NULL, free the rest and return -1.  Return 0 on success.
-int ReadArgs(void* cookie, Expr* argv[], int count, ...);
+int ReadArgs(State* state, Expr* argv[], int count, ...);
 
 // Evaluate the expressions in argv, returning an array of char*
 // results.  If any evaluate to NULL, free the rest and return NULL.
 // The caller is responsible for freeing the returned array and the
 // strings it contains.
-char** ReadVarArgs(void* cookie, int argc, Expr* argv[]);
+char** ReadVarArgs(State* state, int argc, Expr* argv[]);
 
 
 #endif  // _EXPRESSION_H
diff --git a/edify/lexer.l b/edify/lexer.l
index cb5eb31..2c4489c 100644
--- a/edify/lexer.l
+++ b/edify/lexer.l
@@ -16,14 +16,20 @@
  */
 
 #include "expr.h"
+#include "yydefs.h"
 #include "parser.h"
 
 int gLine = 1;
 int gColumn = 1;
+int gPos = 0;
 
 // TODO: enforce MAX_STRING_LEN during lexing
 char string_buffer[MAX_STRING_LEN];
 char* string_pos;
+
+#define ADVANCE do {yylloc.start=gPos; yylloc.end=gPos+yyleng; \
+                    gColumn+=yyleng; gPos+=yyleng;} while(0)
+
 %}
 
 %x STR
@@ -34,27 +40,32 @@
 
 
 \" {
-    ++gColumn;
     BEGIN(STR);
     string_pos = string_buffer;
+    yylloc.start = gPos;
+    ++gColumn;
+    ++gPos;
 }
 
 <STR>{
   \" {
       ++gColumn;
+      ++gPos;
       BEGIN(INITIAL);
       *string_pos = '\0';
       yylval.str = strdup(string_buffer);
+      yylloc.end = gPos;
       return STRING;
   }
 
-  \\n   { gColumn += yyleng; *string_pos++ = '\n'; }
-  \\t   { gColumn += yyleng; *string_pos++ = '\t'; }
-  \\\"  { gColumn += yyleng; *string_pos++ = '\"'; }
-  \\\\  { gColumn += yyleng; *string_pos++ = '\\'; }
+  \\n   { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\n'; }
+  \\t   { gColumn += yyleng; gPos += yyleng;  *string_pos++ = '\t'; }
+  \\\"  { gColumn += yyleng; gPos += yyleng;  *string_pos++ = '\"'; }
+  \\\\  { gColumn += yyleng; gPos += yyleng;  *string_pos++ = '\\'; }
 
   \\x[0-9a-fA-F]{2} {
       gColumn += yyleng;
+      gPos += yyleng;
       int val;
       sscanf(yytext+2, "%x", &val);
       *string_pos++ = val;
@@ -62,36 +73,38 @@
 
   \n {
       ++gLine;
+      ++gPos;
       gColumn = 1;
       *string_pos++ = yytext[0];
   }
 
   . {
       ++gColumn;
+      ++gPos;
       *string_pos++ = yytext[0];
   }
 }
 
-if                { gColumn += yyleng; return IF; }
-then              { gColumn += yyleng; return THEN; }
-else              { gColumn += yyleng; return ELSE; }
-endif             { gColumn += yyleng; return ENDIF; }
+if                ADVANCE; return IF;
+then              ADVANCE; return THEN;
+else              ADVANCE; return ELSE;
+endif             ADVANCE; return ENDIF;
 
 [a-zA-Z0-9_:/.]+ {
-  gColumn += yyleng;
+  ADVANCE;
   yylval.str = strdup(yytext);
   return STRING;
 }
 
-\&\&              { gColumn += yyleng; return AND; }
-\|\|              { gColumn += yyleng; return OR; }
-==                { gColumn += yyleng; return EQ; }
-!=                { gColumn += yyleng; return NE; }
+\&\&              ADVANCE; return AND;
+\|\|              ADVANCE; return OR;
+==                ADVANCE; return EQ;
+!=                ADVANCE; return NE;
 
-[+(),!;]          { gColumn += yyleng; return yytext[0]; }
+[+(),!;]          ADVANCE; return yytext[0];
 
-[ \t]+            gColumn += yyleng;
+[ \t]+            ADVANCE;
 
-(#.*)?\n          { ++gLine; gColumn = 1; }
+(#.*)?\n          gPos += yyleng; ++gLine; gColumn = 1;
 
 .                 return BAD;
diff --git a/edify/main.c b/edify/main.c
index 7da89e2..03eefc6 100644
--- a/edify/main.c
+++ b/edify/main.c
@@ -21,152 +21,183 @@
 #include "expr.h"
 #include "parser.h"
 
+extern int yyparse(Expr** root, int* error_count);
+
 int expect(const char* expr_str, const char* expected, int* errors) {
-  Expr* e;
-  int error;
-  char* result;
+    Expr* e;
+    int error;
+    char* result;
 
-  printf(".");
+    printf(".");
 
-  yy_scan_string(expr_str);
-  error = yyparse(&e);
-  if (error > 0) {
-    fprintf(stderr, "error parsing \"%s\"\n", expr_str);
-    ++*errors;
-    return 0;
-  }
+    yy_scan_string(expr_str);
+    int error_count = 0;
+    error = yyparse(&e, &error_count);
+    if (error > 0 || error_count > 0) {
+        fprintf(stderr, "error parsing \"%s\" (%d errors)\n",
+                expr_str, error_count);
+        ++*errors;
+        return 0;
+    }
 
-  result = Evaluate(NULL, e);
-  if (result == NULL && expected != NULL) {
-    fprintf(stderr, "error evaluating \"%s\"\n", expr_str);
-    ++*errors;
-    return 0;
-  }
+    State state;
+    state.cookie = NULL;
+    state.script = expr_str;
+    state.errmsg = NULL;
 
-  if (result == NULL && expected == NULL) {
-    return 1;
-  }
+    result = Evaluate(&state, e);
+    free(state.errmsg);
+    if (result == NULL && expected != NULL) {
+        fprintf(stderr, "error evaluating \"%s\"\n", expr_str);
+        ++*errors;
+        return 0;
+    }
 
-  if (strcmp(result, expected) != 0) {
-    fprintf(stderr, "evaluating \"%s\": expected \"%s\", got \"%s\"\n",
-            expr_str, expected, result);
-    ++*errors;
+    if (result == NULL && expected == NULL) {
+        return 1;
+    }
+
+    if (strcmp(result, expected) != 0) {
+        fprintf(stderr, "evaluating \"%s\": expected \"%s\", got \"%s\"\n",
+                expr_str, expected, result);
+        ++*errors;
+        free(result);
+        return 0;
+    }
+
     free(result);
-    return 0;
-  }
-
-  free(result);
-  return 1;
+    return 1;
 }
 
 int test() {
-  int errors = 0;
+    int errors = 0;
 
-  expect("a", "a", &errors);
-  expect("\"a\"", "a", &errors);
-  expect("\"\\x61\"", "a", &errors);
-  expect("# this is a comment\n"
-         "  a\n"
-         "   \n",
-         "a", &errors);
+    expect("a", "a", &errors);
+    expect("\"a\"", "a", &errors);
+    expect("\"\\x61\"", "a", &errors);
+    expect("# this is a comment\n"
+           "  a\n"
+           "   \n",
+           "a", &errors);
 
 
-  // sequence operator
-  expect("a; b; c", "c", &errors);
+    // sequence operator
+    expect("a; b; c", "c", &errors);
 
-  // string concat operator
-  expect("a + b", "ab", &errors);
-  expect("a + \n \"b\"", "ab", &errors);
-  expect("a + b +\nc\n", "abc", &errors);
+    // string concat operator
+    expect("a + b", "ab", &errors);
+    expect("a + \n \"b\"", "ab", &errors);
+    expect("a + b +\nc\n", "abc", &errors);
 
-  // string concat function
-  expect("concat(a, b)", "ab", &errors);
-  expect("concat(a,\n \"b\")", "ab", &errors);
-  expect("concat(a + b,\nc,\"d\")", "abcd", &errors);
-  expect("\"concat\"(a + b,\nc,\"d\")", "abcd", &errors);
+    // string concat function
+    expect("concat(a, b)", "ab", &errors);
+    expect("concat(a,\n \"b\")", "ab", &errors);
+    expect("concat(a + b,\nc,\"d\")", "abcd", &errors);
+    expect("\"concat\"(a + b,\nc,\"d\")", "abcd", &errors);
 
-  // logical and
-  expect("a && b", "b", &errors);
-  expect("a && \"\"", "", &errors);
-  expect("\"\" && b", "", &errors);
-  expect("\"\" && \"\"", "", &errors);
-  expect("\"\" && abort()", "", &errors);   // test short-circuiting
-  expect("t && abort()", NULL, &errors);
+    // logical and
+    expect("a && b", "b", &errors);
+    expect("a && \"\"", "", &errors);
+    expect("\"\" && b", "", &errors);
+    expect("\"\" && \"\"", "", &errors);
+    expect("\"\" && abort()", "", &errors);   // test short-circuiting
+    expect("t && abort()", NULL, &errors);
 
-  // logical or
-  expect("a || b", "a", &errors);
-  expect("a || \"\"", "a", &errors);
-  expect("\"\" || b", "b", &errors);
-  expect("\"\" || \"\"", "", &errors);
-  expect("a || abort()", "a", &errors);     // test short-circuiting
-  expect("\"\" || abort()", NULL, &errors);
+    // logical or
+    expect("a || b", "a", &errors);
+    expect("a || \"\"", "a", &errors);
+    expect("\"\" || b", "b", &errors);
+    expect("\"\" || \"\"", "", &errors);
+    expect("a || abort()", "a", &errors);     // test short-circuiting
+    expect("\"\" || abort()", NULL, &errors);
 
-  // logical not
-  expect("!a", "", &errors);
-  expect("! \"\"", "t", &errors);
-  expect("!!a", "t", &errors);
+    // logical not
+    expect("!a", "", &errors);
+    expect("! \"\"", "t", &errors);
+    expect("!!a", "t", &errors);
 
-  // precedence
-  expect("\"\" == \"\" && b", "b", &errors);
-  expect("a + b == ab", "t", &errors);
-  expect("ab == a + b", "t", &errors);
-  expect("a + (b == ab)", "a", &errors);
-  expect("(ab == a) + b", "b", &errors);
+    // precedence
+    expect("\"\" == \"\" && b", "b", &errors);
+    expect("a + b == ab", "t", &errors);
+    expect("ab == a + b", "t", &errors);
+    expect("a + (b == ab)", "a", &errors);
+    expect("(ab == a) + b", "b", &errors);
 
-  // substring function
-  expect("is_substring(cad, abracadabra)", "t", &errors);
-  expect("is_substring(abrac, abracadabra)", "t", &errors);
-  expect("is_substring(dabra, abracadabra)", "t", &errors);
-  expect("is_substring(cad, abracxadabra)", "", &errors);
-  expect("is_substring(abrac, axbracadabra)", "", &errors);
-  expect("is_substring(dabra, abracadabrxa)", "", &errors);
+    // substring function
+    expect("is_substring(cad, abracadabra)", "t", &errors);
+    expect("is_substring(abrac, abracadabra)", "t", &errors);
+    expect("is_substring(dabra, abracadabra)", "t", &errors);
+    expect("is_substring(cad, abracxadabra)", "", &errors);
+    expect("is_substring(abrac, axbracadabra)", "", &errors);
+    expect("is_substring(dabra, abracadabrxa)", "", &errors);
 
-  // ifelse function
-  expect("ifelse(t, yes, no)", "yes", &errors);
-  expect("ifelse(!t, yes, no)", "no", &errors);
-  expect("ifelse(t, yes, abort())", "yes", &errors);
-  expect("ifelse(!t, abort(), no)", "no", &errors);
+    // ifelse function
+    expect("ifelse(t, yes, no)", "yes", &errors);
+    expect("ifelse(!t, yes, no)", "no", &errors);
+    expect("ifelse(t, yes, abort())", "yes", &errors);
+    expect("ifelse(!t, abort(), no)", "no", &errors);
 
-  // if "statements"
-  expect("if t then yes else no endif", "yes", &errors);
-  expect("if \"\" then yes else no endif", "no", &errors);
-  expect("if \"\" then yes endif", "", &errors);
-  expect("if \"\"; t then yes endif", "yes", &errors);
+    // if "statements"
+    expect("if t then yes else no endif", "yes", &errors);
+    expect("if \"\" then yes else no endif", "no", &errors);
+    expect("if \"\" then yes endif", "", &errors);
+    expect("if \"\"; t then yes endif", "yes", &errors);
 
-  printf("\n");
+    printf("\n");
 
-  return errors;
+    return errors;
+}
+
+void ExprDump(int depth, Expr* n, char* script) {
+    printf("%*s", depth*2, "");
+    char temp = script[n->end];
+    script[n->end] = '\0';
+    printf("%s %p (%d-%d) \"%s\"\n",
+           n->name == NULL ? "(NULL)" : n->name, n->fn, n->start, n->end,
+           script+n->start);
+    script[n->end] = temp;
+    int i;
+    for (i = 0; i < n->argc; ++i) {
+        ExprDump(depth+1, n->argv[i], script);
+    }
 }
 
 int main(int argc, char** argv) {
-  RegisterBuiltins();
-  FinishRegistration();
+    RegisterBuiltins();
+    FinishRegistration();
 
-  if (argc == 1) {
-    return test() != 0;
-  }
-
-  FILE* f = fopen(argv[1], "r");
-  char buffer[8192];
-  int size = fread(buffer, 1, 8191, f);
-  fclose(f);
-  buffer[size] = '\0';
-
-  Expr* root;
-  int error_count = 0;
-  yy_scan_bytes(buffer, size);
-  int error = yyparse(&root, &error_count);
-  printf("parse returned %d; %d errors encountered\n", error, error_count);
-  if (error == 0 || error_count > 0) {
-    char* result = Evaluate(NULL, root);
-    if (result == NULL) {
-      char* errmsg = GetError();
-      printf("result was NULL, message is: %s\n",
-             (errmsg == NULL ? "(NULL)" : errmsg));
-      ClearError();
-    } else {
-      printf("result is [%s]\n", result);
+    if (argc == 1) {
+        return test() != 0;
     }
-  }
-  return 0;
+
+    FILE* f = fopen(argv[1], "r");
+    char buffer[8192];
+    int size = fread(buffer, 1, 8191, f);
+    fclose(f);
+    buffer[size] = '\0';
+
+    Expr* root;
+    int error_count = 0;
+    yy_scan_bytes(buffer, size);
+    int error = yyparse(&root, &error_count);
+    printf("parse returned %d; %d errors encountered\n", error, error_count);
+    if (error == 0 || error_count > 0) {
+
+        ExprDump(0, root, buffer);
+
+        State state;
+        state.cookie = NULL;
+        state.script = buffer;
+        state.errmsg = NULL;
+
+        char* result = Evaluate(&state, root);
+        if (result == NULL) {
+            printf("result was NULL, message is: %s\n",
+                   (state.errmsg == NULL ? "(NULL)" : state.errmsg));
+            free(state.errmsg);
+        } else {
+            printf("result is [%s]\n", result);
+        }
+    }
+    return 0;
 }
diff --git a/edify/parser.y b/edify/parser.y
index cf163c0..3f9ade1 100644
--- a/edify/parser.y
+++ b/edify/parser.y
@@ -20,6 +20,7 @@
 #include <string.h>
 
 #include "expr.h"
+#include "yydefs.h"
 #include "parser.h"
 
 extern int gLine;
@@ -30,6 +31,8 @@
 
 %}
 
+%locations
+
 %union {
     char* str;
     Expr* expr;
@@ -68,19 +71,21 @@
     $$->name = $1;
     $$->argc = 0;
     $$->argv = NULL;
+    $$->start = @$.start;
+    $$->end = @$.end;
 }
-|  '(' expr ')'                      { $$ = $2; }
-|  expr ';'                          { $$ = $1; }
-|  expr ';' expr                     { $$ = Build(SequenceFn, 2, $1, $3); }
-|  error ';' expr                    { $$ = $3; }
-|  expr '+' expr                     { $$ = Build(ConcatFn, 2, $1, $3); }
-|  expr EQ expr                      { $$ = Build(EqualityFn, 2, $1, $3); }
-|  expr NE expr                      { $$ = Build(InequalityFn, 2, $1, $3); }
-|  expr AND expr                     { $$ = Build(LogicalAndFn, 2, $1, $3); }
-|  expr OR expr                      { $$ = Build(LogicalOrFn, 2, $1, $3); }
-|  '!' expr                          { $$ = Build(LogicalNotFn, 1, $2); }
-|  IF expr THEN expr ENDIF           { $$ = Build(IfElseFn, 2, $2, $4); }
-|  IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, 3, $2, $4, $6); }
+|  '(' expr ')'                      { $$ = $2; $$->start=@$.start; $$->end=@$.end; }
+|  expr ';'                          { $$ = $1; $$->start=@1.start; $$->end=@1.end; }
+|  expr ';' expr                     { $$ = Build(SequenceFn, @$, 2, $1, $3); }
+|  error ';' expr                    { $$ = $3; $$->start=@$.start; $$->end=@$.end; }
+|  expr '+' expr                     { $$ = Build(ConcatFn, @$, 2, $1, $3); }
+|  expr EQ expr                      { $$ = Build(EqualityFn, @$, 2, $1, $3); }
+|  expr NE expr                      { $$ = Build(InequalityFn, @$, 2, $1, $3); }
+|  expr AND expr                     { $$ = Build(LogicalAndFn, @$, 2, $1, $3); }
+|  expr OR expr                      { $$ = Build(LogicalOrFn, @$, 2, $1, $3); }
+|  '!' expr                          { $$ = Build(LogicalNotFn, @$, 1, $2); }
+|  IF expr THEN expr ENDIF           { $$ = Build(IfElseFn, @$, 2, $2, $4); }
+|  IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); }
 | STRING '(' arglist ')' {
     $$ = malloc(sizeof(Expr));
     $$->fn = FindFunction($1);
@@ -93,6 +98,8 @@
     $$->name = $1;
     $$->argc = $3.argc;
     $$->argv = $3.argv;
+    $$->start = @$.start;
+    $$->end = @$.end;
 }
 ;
 
diff --git a/edify/yydefs.h b/edify/yydefs.h
new file mode 100644
index 0000000..6257862
--- /dev/null
+++ b/edify/yydefs.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _YYDEFS_H_
+#define _YYDEFS_H_
+
+#define YYLTYPE YYLTYPE
+typedef struct {
+    int start, end;
+} YYLTYPE;
+
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+    do { \
+        if (N) { \
+            (Current).start = YYRHSLOC(Rhs, 1).start; \
+            (Current).end = YYRHSLOC(Rhs, N).end; \
+        } else { \
+            (Current).start = YYRHSLOC(Rhs, 0).start; \
+            (Current).end = YYRHSLOC(Rhs, 0).end; \
+        } \
+    } while (0)
+
+#endif
