... which it turns out have NEVER worked, and badly written tests were masking the problem. Also tagging rules with metadata as first step towards mixing production and flow rules.
993 lines
64 KiB
HTML
993 lines
64 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> mw_parser/generate.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns ^{:doc "Generate Clojure source from simplified parse trees."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 :author "Simon Brooke"}
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 mw-parser.generate
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 (:require [clojure.pprint :refer [pprint]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 [clojure.tools.trace :refer [deftrace]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 [mw-parser.utils :refer [assert-type TODO]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 [mw-parser.errors :as pe]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
008
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 ;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 ;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 ;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 ;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 ;; This program is distributed in the hope that it will be useful,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 ;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 ;; You should have received a copy of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 ;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;; USA.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
027
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
028 (declare generate generate-action)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
029
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
030 (defn generate-rule
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 "From this `tree`, assumed to be a syntactically correct rule specification,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 generate and return the appropriate rule as a function of two arguments."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
034 (assert-type tree :RULE)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
035 (vary-meta
|
|
</span><br/>
|
|
<span class="covered" title="19 out of 19 forms covered">
|
|
036 (list 'fn ['cell 'world] (list 'when (generate (nth tree 2)) (generate (nth tree 3))))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
037 merge
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
038 {:rule-type
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 :production}))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
040
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
041 (defn generate-conditions
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 "From this `tree`, assumed to be a syntactically correct conditions clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
045 (assert-type tree :CONDITIONS)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
046 (generate (second tree)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
047
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
048 (defn generate-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 "From this `tree`, assumed to be a syntactically correct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
050 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
052 (assert-type tree :CONDITION)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
053 (generate (second tree)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
054
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
055 (defn generate-conjunct-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 "From this `tree`, assumed to be a syntactically conjunct correct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
057 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
058 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
059 (assert-type tree :CONJUNCT-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
060 (cons 'and (map generate (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
061
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
062 (defn generate-disjunct-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063 "From this `tree`, assumed to be a syntactically correct disjunct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
064 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
065 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
066 (assert-type tree :DISJUNCT-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
067 (cons 'or (map generate (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
068
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
069 (defn generate-ranged-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 "From this `tree`, assumed to be a syntactically property condition clause for
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 this `property` where the `expression` is a numeric range, generate and return
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 [tree property expression]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
074 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
075 (assert-type (nth tree 3) :RANGE-EXPRESSION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
076 (let [l1 (generate (nth expression 2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
077 l2 (generate (nth expression 4))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
078 pv (list property 'cell)]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
079 (list 'let ['lower (list 'min l1 l2)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
080 'upper (list 'max l1 l2)]
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
081 (list 'and (list '>= pv 'lower) (list '<= pv 'upper)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
082
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
083 (defn generate-disjunct-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 "From this `tree`, assumed to be a syntactically property condition clause
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
085 where the expression is a a disjunction, generate and return
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 the appropriate clojure fragment.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
087 TODO: this is definitely still wrong!"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
088 ([tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
089 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
090 qualifier (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
091 expression (generate (nth tree 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
092 (generate-disjunct-property-condition tree property qualifier expression)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
093 ([_tree property qualifier expression]
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
094 (let [e (list expression (list property 'cell))]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
095 (if (= qualifier '=) e
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
096 (list 'not e)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
097
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
098 (defn generate-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
099 "From this `tree`, assumed to be a syntactically property condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
100 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
101 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
102 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
103 (if
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
104 (and (= (count tree) 2) (= (first (second tree)) :SYMBOL))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
105 ;; it's a shorthand for 'state equal to symbol'. This should probably have
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
106 ;; been handled in simplify...
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
107 (generate-property-condition
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
108 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 :PROPERTY-CONDITION
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
110 '(:SYMBOL "state")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
111 '(:QUALIFIER (:EQUIVALENCE (:EQUAL "equal to")))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
112 (second tree)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
113 ;; otherwise...
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
114 (generate-property-condition tree (first (nth tree 3)))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
115 ([tree expression-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
116 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
117 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
118 qualifier (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
119 e (generate (nth tree 3))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
120 expression (cond
|
|
</span><br/>
|
|
<span class="covered" title="20 out of 20 forms covered">
|
|
121 (and (not (= qualifier '=)) (keyword? e)) (list 'or (list e 'cell) e)
|
|
</span><br/>
|
|
<span class="covered" title="20 out of 20 forms covered">
|
|
122 (and (not (= qualifier 'not=)) (keyword? e)) (list 'or (list e 'cell) e)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
123 :else e)]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
124 (case expression-type
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
125 :DISJUNCT-EXPRESSION (generate-disjunct-property-condition tree property qualifier expression)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
126 :RANGE-EXPRESSION (generate-ranged-property-condition tree property expression)
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
127 (list qualifier (list property 'cell) expression)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
128
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
129 (defn generate-qualifier
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
130 "From this `tree`, assumed to be a syntactically correct qualifier,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
131 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
132 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
133 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
134 (= (count tree) 2)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
135 (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
136 ;; else
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
137 (generate (nth tree 2))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
138
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
139 (defn generate-simple-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
140 "From this `tree`, assumed to be a syntactically correct simple action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
141 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
142 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
143 (assert-type tree :SIMPLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
144 (generate-simple-action tree []))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 ([tree others]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
146 (assert-type tree :SIMPLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
147 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
148 expression (generate (nth tree 3))]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
149 (if (or (= property :x) (= property :y))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
150 (throw (Exception. pe/reserved-properties-error))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
151 (list 'merge
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
152 (if (empty? others) 'cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
153 ;; else
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
154 (generate others))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
155 {property expression})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
156
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
157 (defn generate-probable-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
158 "From this `tree`, assumed to be a syntactically correct probable action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
159 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
160 ([tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
161 (assert-type tree :PROBABLE-ACTION)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
162 (generate-probable-action tree []))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
163 ([tree others]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
164 (assert-type tree :PROBABLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
165 (let
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
166 [chances (generate (nth tree 1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
167 total (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
168 action (generate-action (nth tree 3) others)]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
169 ;; TODO: could almost certainly be done better with macro syntax
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
170 (list 'if
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
171 (list '< (list 'rand total) chances)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
172 action))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
173
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
174 (defn generate-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
175 "From this `tree`, assumed to be a syntactically correct action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
176 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
177 [tree others]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
178 (case (first tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
179 :ACTIONS (generate-action (first tree) others)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
180 :SIMPLE-ACTION (generate-simple-action tree others)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
181 :PROBABLE-ACTION (generate-probable-action tree others)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
182 (throw (Exception. (str "Not a known action type: " (first tree))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
183
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
184 (defn generate-multiple-actions
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
185 "From this `tree`, assumed to be one or more syntactically correct actions,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
186 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
187 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
188 (assert-type tree :ACTIONS)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
189 (generate-action (first (rest tree)) (second (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
190
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
191 (defn generate-disjunct-value
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
192 "Generate a disjunct value. Essentially what we need here is to generate a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
193 flat list of values, since the `member` has already been taken care of."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
194 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
195 (assert-type tree :DISJUNCT-VALUE)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
196 (if (= (count tree) 4)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
197 (cons (generate (second tree)) (generate (nth tree 3)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
198 (list (generate (second tree)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
199
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
200 (defn generate-numeric-expression
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
201 "From this `tree`, assumed to be a syntactically correct numeric expression,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
202 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
203 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
204 (assert-type tree :NUMERIC-EXPRESSION)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
205 (case (count tree)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
206 4 (let [[p operator expression] (rest tree)
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 9 forms covered">
|
|
207 property (if (number? p) p (list p 'cell))]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
208 (list (generate operator) (generate property) (generate expression)))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
209 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
210 :SYMBOL (list (keyword (second (second tree))) 'cell)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
211 (generate (second tree)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
212
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
213 (defn generate-neighbours-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
214 "Generate code for a condition which refers to neighbours."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
215 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
216 (assert-type tree :NEIGHBOURS-CONDITION)
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 13 forms covered">
|
|
217 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
218 :NUMBER (read-string (second (second tree)))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
219 :QUANTIFIER (generate-neighbours-condition tree (first (second (second tree))))
|
|
</span><br/>
|
|
<span class="covered" title="14 out of 14 forms covered">
|
|
220 :QUALIFIER (cons (generate (second tree)) (rest (generate (nth tree 2))))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
221 ([tree quantifier-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
222 (let [quantifier (second tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
223 pc (generate (nth tree 4))]
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 9 forms covered">
|
|
224 (case quantifier-type
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
225 :NUMBER (generate-neighbours-condition '= (read-string (second (second quantifier))) pc 1)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
226 :SOME (generate-neighbours-condition '> 0 pc 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
227 :MORE (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
228 (generate-neighbours-condition '> value pc 1))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
229 :LESS (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
230 (generate-neighbours-condition '< value pc 1)))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
231 ([comp1 quantity property-condition distance]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
232 (list comp1
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
233 (list 'count
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
234 (list 'remove 'false?
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
235 (list 'map (list 'fn ['cell] property-condition)
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
236 (list 'mw-engine.utils/get-neighbours 'world 'cell distance)))) quantity))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
237 ([comp1 quantity property-condition]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
238 (generate-neighbours-condition comp1 quantity property-condition 1)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
239
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
240 (defn generate-within-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
241 "Generate code for a condition which refers to neighbours within a specified distance.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
242 NOTE THAT there's clearly masses of commonality between this and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
243 `generate-neighbours-condition`, and that some refactoring is almost certainly
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
244 desirable. It may be that it's better to simplify a `NEIGHBOURS-CONDITION`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
245 into a `WITHIN-CONDITION` in the simplification stage."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
246 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
247 (assert-type tree :WITHIN-CONDITION)
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 13 forms covered">
|
|
248 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
249 :QUANTIFIER (generate-within-condition tree (first (second (second tree))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
250 :QUALIFIER (TODO "qualified within... help!")))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
251 ([tree quantifier-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
252 (let [quantifier (second tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
253 distance (generate (nth tree 4))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
254 pc (generate (nth tree 6))]
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 9 forms covered">
|
|
255 (case quantifier-type
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
256 :NUMBER (generate-neighbours-condition '= (read-string (second (second quantifier))) pc distance)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
257 :SOME (generate-neighbours-condition '> 0 pc distance)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
258 :MORE (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
259 (generate-neighbours-condition '> value pc distance))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
260 :LESS (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
261 (generate-neighbours-condition '< value pc distance))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
262
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
263 (defn- generate-disjunct-expression
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
264 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
265 (assert-type tree :DISJUNCT-EXPRESSION)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
266 (try
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
267 (set (map generate (rest tree)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
268 (catch Exception x
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
269 (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
270 (ex-info
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
271 "Failed to compile :DISJUNCT-EXPRESSION"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
272 {:tree tree}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
273 x)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
274
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
275 ;;; Flow rules. A flow rule DOES NOT return a modified world; instead, it
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
276 ;;; returns a PLAN to modify the world, in the form of a sequence of `flows`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
277 ;;; It is only when the plan is executed that the world is modified.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
278 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
279 ;;; so we're looking at something like
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
280 ;;; (fn [cell world])
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
281 ;;; (if (= (:state cell) (or (:house cell) :house))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
282
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
283 (defn generate-flow
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
284 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
285 (assert-type tree :FLOW-RULE))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
286
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
287 ;;; Top level; only function anything outside this file (except tests) should
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
288 ;;; really call.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
289
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
290 (defn generate
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
291 "Generate code for this (fragment of a) parse tree"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
292 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
293 (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
294 (coll? tree)
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
295 (case (first tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
296 :ACTIONS (generate-multiple-actions tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
297 :COMPARATIVE (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
298 :COMPARATIVE-QUALIFIER (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
299 :CONDITION (generate-condition tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
300 :CONDITIONS (generate-conditions tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
301 :CONJUNCT-CONDITION (generate-conjunct-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
302 :DISJUNCT-CONDITION (generate-disjunct-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
303 :DISJUNCT-EXPRESSION (generate-disjunct-expression tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
304 :DISJUNCT-VALUE (generate-disjunct-value tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
305 :EQUIVALENCE '=
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
306 :EXPRESSION (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
307 :FLOW-RULE (generate-flow tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
308 :LESS '<
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
309 :MORE '>
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 16 forms covered">
|
|
310 :NEGATED-QUALIFIER (case (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
311 = 'not=
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
312 > '<
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
313 < '>)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
314 :NEIGHBOURS-CONDITION (generate-neighbours-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
315 :NUMERIC-EXPRESSION (generate-numeric-expression tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
316 :NUMBER (read-string (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
317 :OPERATOR (symbol (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
318 :PROBABLE-ACTION (generate-probable-action tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
319 :PROPERTY (list (generate (second tree)) 'cell) ;; dubious - may not be right
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
320 :PROPERTY-CONDITION (generate-property-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
321 :QUALIFIER (generate-qualifier tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
322 :RULE (generate-rule tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
323 :SIMPLE-ACTION (generate-simple-action tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
324 :SYMBOL (keyword (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
325 :VALUE (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
326 :WITHIN-CONDITION (generate-within-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
327 (map generate tree))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
328 tree))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|