... 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.
282 lines
18 KiB
HTML
282 lines
18 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> mw_parser/simplify.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns ^{:doc "Simplify a parse tree."
|
|
</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.simplify)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
004
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 ;;;; mw-parser: a rule parser for MicroWorld.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 ;;;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 ;;;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 ;;;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 ;;;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 ;;;; 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">
|
|
015 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 ;;;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 ;;;; 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">
|
|
020 ;;;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 ;;;; USA.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;;;; Copyright (C) 2014 Simon Brooke
|
|
</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="2 out of 2 forms covered">
|
|
028 (declare simplify)
|
|
</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 simplify-second-of-two
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 "There are a number of possible simplifications such that if the `tree` has
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 only two elements, the second is semantically sufficient."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 [tree]
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 11 forms covered">
|
|
034 (if (= (count tree) 2) (simplify (nth tree 1)) tree))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
035
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
036 (defn simplify-chained-list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
037 "Some parse trees take the form
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
038 `[:X [:Y 1] :NOISE :NOISE [:X [:Y 2] :NOISE :NOISE [:X [:Y 3]]]]`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 where what's wanted is `[:X [:Y 1] [:Y 2] [:Y 2]]` -- :DISJUNCT-VALUE is a case
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 in point. This takes such a parse `tree`, where `branch-tag` is the tag of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 the enclosing form and `leaf-tag` is the tag of the form to be collected, and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 returns the desired form."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 [tree branch-tag leaf-tag]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
044 (cons
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
045 (first tree)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
046 (reverse
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
047 (loop [chain (rest tree) v '()]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
048 (let [car (first chain)]
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
049 (cond (empty? chain) v
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
050 (coll? car) (let [caar (first car)]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
051 (cond
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
052 (= branch-tag caar) (recur car v)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
053 (= leaf-tag caar) (recur
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 (rest chain)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 (cons (simplify car) v))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
056 :else (recur (rest chain) v)))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
057 :else (recur (rest chain) v)))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
058
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
059 (defn simplify
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
060 "Simplify/canonicalise this `tree`. Opportunistically replace complex fragments with
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
061 semantically identical simpler fragments"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
063 (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
064 (coll? tree)
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 11 forms covered">
|
|
065 (case (first tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
066 :ACTION (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
067 :ACTIONS (cons (first tree) (simplify (rest tree)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
068 :AND nil
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 :CHANCE-IN nil
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
070 :COMPARATIVE (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
071 :CONDITION (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
072 :CONDITIONS (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
073 :DISJUNCT-EXPRESSION (simplify-chained-list tree :DISJUNCT-VALUE :VALUE)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
074 :EXPRESSION (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
075 :IN nil
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
076 :PROPERTY (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
077 :PROPERTY-CONDITION-OR-EXPRESSION (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
078 :OR nil
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
079 :SPACE nil
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
080 :THEN nil
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
081 :VALUE (simplify-second-of-two tree)
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
082 (remove nil? (map simplify tree)))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
083 tree))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
084
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
085 (defn simplify-determiner-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
087 (apply vector
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
088 (cons :DETERMINER-CONDITION
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
089 (cons
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
090 (simplify-second-of-two (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
091 (rest (rest tree))))))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|