aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEduardo Julian2015-08-05 00:05:04 -0400
committerEduardo Julian2015-08-05 00:05:04 -0400
commitf855c20a7af7428b638e4c2a3c4c654bd01576dc (patch)
tree3f82f29dac5cdab1cc5c6b5ce9d85474ee04d2a5 /src
parent691b3e3174e01ed7d859f58442371328aefcfad4 (diff)
- The compiler now stores the cursor of the last analysed AST in order to avoid the problem of error ocurring "nowhere" (at ["" -1 -1]).
Diffstat (limited to 'src')
-rw-r--r--src/lux/analyser.clj43
-rw-r--r--src/lux/base.clj35
-rw-r--r--src/lux/type.clj1
3 files changed, 49 insertions, 30 deletions
diff --git a/src/lux/analyser.clj b/src/lux/analyser.clj
index 774188d82..d18c2cfcf 100644
--- a/src/lux/analyser.clj
+++ b/src/lux/analyser.clj
@@ -501,10 +501,10 @@
(return* state* output)
[["lux;Left" ""]]
- (fail* (add-loc meta (str "[Analyser Error] Unrecognized token: " (&/show-ast token))))
+ (fail* (add-loc (&/get$ &/$cursor state) (str "[Analyser Error] Unrecognized token: " (&/show-ast token))))
[["lux;Left" msg]]
- (fail* (add-loc meta msg))
+ (fail* (add-loc (&/get$ &/$cursor state) msg))
))
;; [_]
@@ -527,25 +527,26 @@
))))
(defn ^:private analyse-ast [eval! compile-module compile-token exo-type token]
- (&/with-expected-type exo-type
- (matchv ::M/objects [token]
- [["lux;Meta" [meta ["lux;FormS" ["lux;Cons" [["lux;Meta" [_ ["lux;TagS" ?ident]]] ?values]]]]]]
- (&&lux/analyse-variant (partial analyse-ast eval! compile-module compile-token) exo-type ?ident ?values)
-
- [["lux;Meta" [meta ["lux;FormS" ["lux;Cons" [?fn ?args]]]]]]
- (fn [state]
- (matchv ::M/objects [((just-analyse (partial analyse-ast eval! compile-module compile-token) ?fn) state)
- ;; ((&type/with-var #(&&/analyse-1 (partial analyse-ast eval! compile-module) % ?fn)) state)
- ]
- [["lux;Right" [state* =fn]]]
- (do ;; (prn 'GOT_FUN (&/show-ast ?fn) (&/show-ast token) (aget =fn 0 0) (aget =fn 1 0))
- ((&&lux/analyse-apply (partial analyse-ast eval! compile-module compile-token) exo-type meta =fn ?args) state*))
-
- [_]
- ((analyse-basic-ast (partial analyse-ast eval! compile-module compile-token) eval! compile-module compile-token exo-type token) state)))
-
- [_]
- (analyse-basic-ast (partial analyse-ast eval! compile-module compile-token) eval! compile-module compile-token exo-type token))))
+ (&/with-cursor (aget token 1 0)
+ (&/with-expected-type exo-type
+ (matchv ::M/objects [token]
+ [["lux;Meta" [meta ["lux;FormS" ["lux;Cons" [["lux;Meta" [_ ["lux;TagS" ?ident]]] ?values]]]]]]
+ (&&lux/analyse-variant (partial analyse-ast eval! compile-module compile-token) exo-type ?ident ?values)
+
+ [["lux;Meta" [meta ["lux;FormS" ["lux;Cons" [?fn ?args]]]]]]
+ (fn [state]
+ (matchv ::M/objects [((just-analyse (partial analyse-ast eval! compile-module compile-token) ?fn) state)
+ ;; ((&type/with-var #(&&/analyse-1 (partial analyse-ast eval! compile-module) % ?fn)) state)
+ ]
+ [["lux;Right" [state* =fn]]]
+ (do ;; (prn 'GOT_FUN (&/show-ast ?fn) (&/show-ast token) (aget =fn 0 0) (aget =fn 1 0))
+ ((&&lux/analyse-apply (partial analyse-ast eval! compile-module compile-token) exo-type meta =fn ?args) state*))
+
+ [_]
+ ((analyse-basic-ast (partial analyse-ast eval! compile-module compile-token) eval! compile-module compile-token exo-type token) state)))
+
+ [_]
+ (analyse-basic-ast (partial analyse-ast eval! compile-module compile-token) eval! compile-module compile-token exo-type token)))))
;; [Resources]
(defn analyse [eval! compile-module compile-token]
diff --git a/src/lux/base.clj b/src/lux/base.clj
index ef3c81041..85e8df4d1 100644
--- a/src/lux/base.clj
+++ b/src/lux/base.clj
@@ -31,14 +31,15 @@
(def $WRITER 2)
;; Compiler
-(def $ENVS 0)
-(def $EVAL? 1)
-(def $EXPECTED 2)
-(def $HOST 3)
-(def $MODULES 4)
-(def $SEED 5)
-(def $SOURCE 6)
-(def $TYPES 7)
+(def $cursor 0)
+(def $ENVS 1)
+(def $EVAL? 2)
+(def $EXPECTED 3)
+(def $HOST 4)
+(def $MODULES 5)
+(def $SEED 6)
+(def $SOURCE 7)
+(def $TYPES 8)
;; [Exports]
(def +name-separator+ ";")
@@ -487,7 +488,9 @@
(V "lux;None" nil))))
(defn init-state [_]
- (R ;; "lux;envs"
+ (R ;; "lux;cursor"
+ (T "" -1 -1)
+ ;; "lux;envs"
(|list)
;; "lux;eval?"
false
@@ -628,6 +631,20 @@
[_]
output))))
+(defn with-cursor [cursor body]
+ "(All [a] (-> Cursor (Lux a)))"
+ (if (= "" (aget cursor 0))
+ body
+ (fn [state]
+ (let [output (body (set$ $cursor cursor state))]
+ (matchv ::M/objects [output]
+ [["lux;Right" [?state ?value]]]
+ (return* (set$ $cursor (get$ $cursor state) ?state)
+ ?value)
+
+ [_]
+ output)))))
+
(defn show-ast [ast]
(matchv ::M/objects [ast]
[["lux;Meta" [_ ["lux;BoolS" ?value]]]]
diff --git a/src/lux/type.clj b/src/lux/type.clj
index 18f618b43..e4117492c 100644
--- a/src/lux/type.clj
+++ b/src/lux/type.clj
@@ -179,6 +179,7 @@
(&/T "lux;seed" Int)
(&/T "lux;eval?" Bool)
(&/T "lux;expected" Type)
+ (&/T "lux;cursor" Cursor)
)))
$Void)))