<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>