diff --git a/LICENSE b/LICENSE index 786edf6..494e7c4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,214 +1,258 @@ -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. +# GNU GENERAL PUBLIC LICENSE -1. DEFINITIONS +Version 2, June 1991 -"Contribution" means: +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -a) in the case of the initial Contributor, the initial code and -documentation distributed under this Agreement, and +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +Preamble -b) in the case of each subsequent Contributor: +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to guarantee +your freedom to share and change free software--to make sure the software is free +for all its users. This General Public License applies to most of the Free +Software Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by the GNU +Lesser General Public License instead.) You can apply it to your programs, too. -i) changes to the Program, and +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. -ii) additions to the Program; +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. -where such changes and/or additions to the Program originate from and are -distributed by that particular Contributor. A Contribution 'originates' from -a Contributor if it was added to the Program by such Contributor itself or -anyone acting on such Contributor's behalf. Contributions do not include -additions to the Program which: (i) are separate modules of software -distributed in conjunction with the Program under their own license -agreement, and (ii) are not derivative works of the Program. +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. -"Contributor" means any person or entity that distributes the Program. +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. -"Program" means the Contributions distributed in accordance with this -Agreement. +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. +The precise terms and conditions for copying, distribution and modification follow. -2. GRANT OF RIGHTS +## TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -a) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free copyright license to -reproduce, prepare derivative works of, publicly display, publicly perform, -distribute and sublicense the Contribution of such Contributor, if any, and -such derivative works, in source code and object code form. +0. This License applies to any program or other work which contains a notice + placed by the copyright holder saying it may be distributed under the terms of + this General Public License. The "Program", below, refers to any such program + or work, and a "work based on the Program" means either the Program or any + derivative work under copyright law: that is to say, a work containing the + Program or a portion of it, either verbatim or with modifications and/or + translated into another language. (Hereinafter, translation is included without + limitation in the term "modification".) Each licensee is addressed as "you". + + Activities other than copying, distribution and modification are not covered by + this License; they are outside its scope. The act of running the Program is not + restricted, and the output from the Program is covered only if its contents + constitute a work based on the Program (independent of having been made by + running the Program). Whether that is true depends on what the Program does. -b) Subject to the terms of this Agreement, each Contributor hereby grants -Recipient a non-exclusive, worldwide, royalty-free patent license under -Licensed Patents to make, use, sell, offer to sell, import and otherwise -transfer the Contribution of such Contributor, if any, in source code and -object code form. This patent license shall apply to the combination of the -Contribution and the Program if, at the time the Contribution is added by the -Contributor, such addition of the Contribution causes such combination to be -covered by the Licensed Patents. The patent license shall not apply to any -other combinations which include the Contribution. No hardware per se is -licensed hereunder. +1. You may copy and distribute verbatim copies of the Program's source code as + you receive it, in any medium, provided that you conspicuously and appropriately + publish on each copy an appropriate copyright notice and disclaimer of warranty; + keep intact all the notices that refer to this License and to the absence of any + warranty; and give any other recipients of the Program a copy of this License + along with the Program. + + You may charge a fee for the physical act of transferring a copy, and you may at + your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus + forming a work based on the Program, and copy and distribute such modifications + or work under the terms of Section 1 above, provided that you also meet all of + these conditions: + + a) You must cause the modified files to carry prominent notices stating that + you changed the files and the date of any change. + b) You must cause any work that you distribute or publish, that in whole or in + part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of this + License. + c) If the modified program normally reads commands interactively when run, you + must cause it, when started running for such interactive use in the most + ordinary way, to print or display an announcement including an appropriate + copyright notice and a notice that there is no warranty (or else, saying + that you provide a warranty) and that users may redistribute the program + under these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but does not + normally print such an announcement, your work based on the Program is not + required to print an announcement.) + + These requirements apply to the modified work as a whole. If identifiable + sections of that work are not derived from the Program, and can be reasonably + considered independent and separate works in themselves, then this License, + and its terms, do not apply to those sections when you distribute them as + separate works. But when you distribute the same sections as part of a whole + which is a work based on the Program, the distribution of the whole must be on + the terms of this License, whose permissions for other licensees extend to the + entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest your + rights to work written entirely by you; rather, the intent is to exercise the + right to control the distribution of derivative or collective works based on + the Program. + + In addition, mere aggregation of another work not based on the Program with the + Program (or with a work based on the Program) on a volume of a storage or + distribution medium does not bring the other work under the scope of this + License. + + 3. You may copy and distribute the Program (or a work based on it, under + Section 2) in object code or executable form under the terms of Sections 1 + and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, + which must be distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + b) Accompany it with a written offer, valid for at least three years, to give + any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + c) Accompany it with the information you received as to the offer to distribute + corresponding source code. (This alternative is allowed only for + noncommercial distribution and only if you received the program in object + code or executable form with such an offer, in accord with Subsection b + above.) + + The source code for a work means the preferred form of the work for making + modifications to it. For an executable work, complete source code means all the + source code for all modules it contains, plus any associated interface + definition files, plus the scripts used to control compilation and installation + of the executable. However, as a special exception, the source code distributed + need not include anything that is normally distributed (in either source or + binary form) with the major components (compiler, kernel, and so on) of the + operating system on which the executable runs, unless that component itself + accompanies the executable. + + If distribution of executable or object code is made by offering access to + copy from a designated place, then offering equivalent access to copy the + source code from the same place counts as distribution of the source code, + even though third parties are not compelled to copy the source along with the + object code. -c) Recipient understands that although each Contributor grants the licenses -to its Contributions set forth herein, no assurances are provided by any -Contributor that the Program does not infringe the patent or other -intellectual property rights of any other entity. Each Contributor disclaims -any liability to Recipient for claims brought by any other entity based on -infringement of intellectual property rights or otherwise. As a condition to -exercising the rights and licenses granted hereunder, each Recipient hereby -assumes sole responsibility to secure any other intellectual property rights -needed, if any. For example, if a third party patent license is required to -allow Recipient to distribute the Program, it is Recipient's responsibility -to acquire that license before distributing the Program. +4. You may not copy, modify, sublicense, or distribute the Program except as + expressly provided under this License. Any attempt otherwise to copy, modify, + sublicense or distribute the Program is void, and will automatically + terminate your rights under this License. However, parties who have + received copies, or rights, from you under this License will not have their + licenses terminated so long as such parties remain in full compliance. -d) Each Contributor represents that to its knowledge it has sufficient -copyright rights in its Contribution, if any, to grant the copyright license -set forth in this Agreement. +5. You are not required to accept this License, since you have not signed it. + However, nothing else grants you permission to modify or distribute the + Program or its derivative works. These actions are prohibited by law if + you do not accept this License. Therefore, by modifying or distributing + the Program (or any work based on the Program), you indicate your + acceptance of this License to do so, and all its terms and conditions + for copying, distributing or modifying the Program or works based on it. -3. REQUIREMENTS +6. Each time you redistribute the Program (or any work based on the Program), + the recipient automatically receives a license from the original licensor + to copy, distribute or modify the Program subject to these terms and + conditions. You may not impose any further restrictions on the recipients' + exercise of the rights granted herein. You are not responsible for enforcing + compliance by third parties to this License. -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: +7. If, as a consequence of a court judgment or allegation of patent infringement + or for any other reason (not limited to patent issues), conditions are + imposed on you (whether by court order, agreement or otherwise) that + contradict the conditions of this License, they do not excuse you from the + conditions of this License. If you cannot distribute so as to satisfy + simultaneously your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the Program at + all. For example, if a patent license would not permit royalty-free + redistribution of the Program by all those who receive copies directly or + indirectly through you, then the only way you could satisfy both it and + this License would be to refrain entirely from distribution of the Program. -a) it complies with the terms and conditions of this Agreement; and + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply + and the section as a whole is intended to apply in other circumstances. -b) its license agreement: + It is not the purpose of this section to induce you to infringe any patents + or other property right claims or to contest validity of any such claims; + this section has the sole purpose of protecting the integrity of the free + software distribution system, which is implemented by public license + practices. Many people have made generous contributions to the wide range + of software distributed through that system in reliance on consistent + application of that system; it is up to the author/donor to decide if he or + she is willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be a + consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Program under this License may add an + explicit geographical distribution limitation excluding those countries, + so that distribution is permitted only in or among countries not thus + excluded. In such case, this License incorporates the limitation as if + written in the body of this License. -i) effectively disclaims on behalf of all Contributors all warranties and -conditions, express and implied, including warranties or conditions of title -and non-infringement, and implied warranties or conditions of merchantability -and fitness for a particular purpose; +9. The Free Software Foundation may publish revised and/or new versions of the + General Public License from time to time. Such new versions will be similar + in spirit to the present version, but may differ in detail to address new + problems or concerns. -ii) effectively excludes on behalf of all Contributors all liability for -damages, including direct, indirect, special, incidental and consequential -damages, such as lost profits; + Each version is given a distinguishing version number. If the Program + specifies a version number of this License which applies to it and + "any later version", you have the option of following the terms and + conditions either of that version or of any later version published + by the Free Software Foundation. If the Program does not specify a version + number of this License, you may choose any version ever published by the + Free Software Foundation. -iii) states that any provisions which differ from this Agreement are offered -by that Contributor alone and not by any other party; and +10. If you wish to incorporate parts of the Program into other free programs + whose distribution conditions are different, write to the author to ask for + permission. For software which is copyrighted by the Free Software + Foundation, write to the Free Software Foundation; we sometimes make + exceptions for this. Our decision will be guided by the two goals of + preserving the free status of all derivatives of our free software and of + promoting the sharing and reuse of software generally. -iv) states that source code for the Program is available from such -Contributor, and informs licensees how to obtain it in a reasonable manner on -or through a medium customarily used for software exchange. +NO WARRANTY -When the Program is made available in source code form: +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR + THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO + THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM + PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR + CORRECTION. -a) it must be made available under this Agreement; and +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL + ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within -the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if any, in a manner that reasonably allows subsequent Recipients to identify -the originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a -manner which does not create potential liability for other Contributors. -Therefore, if a Contributor includes the Program in a commercial product -offering, such Contributor ("Commercial Contributor") hereby agrees to defend -and indemnify every other Contributor ("Indemnified Contributor") against any -losses, damages and costs (collectively "Losses") arising from claims, -lawsuits and other legal actions brought by a third party against the -Indemnified Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program in -a commercial product offering. The obligations in this section do not apply -to any claims or Losses relating to any actual or alleged intellectual -property infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor tocontrol, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim -at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON -AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER -EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR -CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A -PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all risks -associated with its exercise of rights under this Agreement , including but -not limited to the risks and costs of program errors, compliance with -applicable laws, damage to or loss of data, programs or equipment, and -unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and -does not cure such failure in a reasonable period of time after becoming -aware of such noncompliance. If all Recipient's rights under this Agreement -terminate, Recipient agrees to cease use and distribution of the Program as -soon as reasonably practicable. However, Recipient's obligations under this -Agreement and any licenses granted by Recipient relating to the Program shall -continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of -the Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this -Agreement, whether expressly, by implication, estoppel or otherwise. All -rights in the Program not expressly granted under this Agreement are -reserved. - -This Agreement is governed by the laws of the State of Washington and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial -in any resulting litigation. +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/README.md b/README.md index 490f00c..63638da 100644 --- a/README.md +++ b/README.md @@ -123,5 +123,7 @@ and 'some neighbours...' is equivalent to 'more than 0 neighbours...' Copyright © 2014 Simon Brooke -Distributed under the GNU General Public License either version 2.0 or (at -your option) any later version. +Distributed under the terms of the [GNU General Public License v2][1] + + +[1]: http://www.gnu.org/licenses/gpl-2.0.html \ No newline at end of file diff --git a/project.clj b/project.clj index c966484..4739ada 100644 --- a/project.clj +++ b/project.clj @@ -1,8 +1,8 @@ (defproject mw-parser "0.1.0-SNAPSHOT" :description "Parser for production rules for MicroWorld engine" :url "http://example.com/FIXME" - :license {:name "Eclipse Public License" - :url "http://www.eclipse.org/legal/epl-v10.html"} + :license {:name "GNU General Public License v2" + :url "http://www.gnu.org/licenses/gpl-2.0.html"} :plugins [[lein-marginalia "0.7.1"]] :dependencies [[org.clojure/clojure "1.5.1"] [mw-engine "0.1.0-SNAPSHOT"] diff --git a/src/mw_parser/core.clj b/src/mw_parser/core.clj index 2bee97b..84a7b10 100644 --- a/src/mw_parser/core.clj +++ b/src/mw_parser/core.clj @@ -25,7 +25,7 @@ (ns mw-parser.core (:use mw-engine.utils - [clojure.string :only [split triml]])) + [clojure.string :only [split trim triml]])) (declare parse-conditions) (declare parse-not-condition) @@ -34,7 +34,7 @@ ;; a regular expression which matches string representation of numbers (def re-number #"^[0-9.]*$") -(defn keyword-or-numeric +(defn- keyword-or-numeric "If this token appears to represent an explicit number, return that number; otherwise, make a keyword of it and return that." [token] @@ -53,23 +53,23 @@ ;; In every case if the function cannot parse the desired construct from the ;; front of the sequence of tokens it returns nil. -(defn parse-numeric-value +(defn- parse-numeric-value "Parse a number." [[value & remainder]] (if (re-matches re-number value) [(read-string value) remainder])) -(defn parse-property-int +(defn- parse-property-int "Parse a token assumed to be the name of a property of the current cell, whose value is assumed to be an integer." [[value & remainder]] (if value [(list 'get-int 'cell (keyword value)) remainder])) -(defn parse-property-value +(defn- parse-property-value "Parse a token assumed to be the name of a property of the current cell." [[value & remainder]] (if value [(list (keyword value) 'cell) remainder])) -(defn parse-simple-value +(defn- parse-simple-value "Parse a value from the first of these `tokens`. If `expect-int` is true, return an integer or something which will evaluate to an integer." ([tokens expect-int] @@ -81,7 +81,7 @@ ([tokens] (parse-simple-value tokens false))) -(defn parse-disjunct-value +(defn- parse-disjunct-value "Parse a list of values from among these `tokens`. If `expect-int` is true, return an integer or something which will evaluate to an integer." [[OR token & tokens] expect-int] @@ -95,7 +95,7 @@ remainder]) true [nil (cons OR (cons token tokens))])) -(defn parse-value +(defn- parse-value "Parse a value from among these `tokens`. If `expect-int` is true, return an integer or something which will evaluate to an integer." ([tokens expect-int] @@ -105,25 +105,26 @@ ([tokens] (parse-value tokens false))) -(defn parse-member-condition +(defn- parse-member-condition + "Parses a condition of the form '[property] in [value] or [value]...'" [[property IN & rest]] (if (= IN "in") (let [[l remainder] (parse-disjunct-value (cons "in" rest) false)] [(list 'member? (keyword property) l) remainder]))) -(defn parse-less-condition +(defn- parse-less-condition "Parse '[property] less than [value]'." [[property LESS THAN value & rest]] (cond (and (= LESS "less") (= THAN "than")) [(list '< (list 'get-int 'cell (keyword property)) (read-string value)) rest])) -(defn parse-more-condition +(defn- parse-more-condition "Parse '[property] more than [value]'." [[property MORE THAN value & rest]] (cond (and (= MORE "more") (= THAN "than")) [(list '> (list 'get-int 'cell (keyword property)) (read-string value)) rest])) -(defn parse-between-condition +(defn- parse-between-condition [[p BETWEEN v1 AND v2 & rest]] (cond (and (= BETWEEN "between") (= AND "and") (not (nil? v2))) (let [property (first (parse-simple-value (list p) true)) @@ -133,7 +134,7 @@ (list '< value1 property value2) (list '> value1 property value2)) rest]))) -(defn parse-is-condition +(defn- parse-is-condition "Parse clauses of the form 'x is y', 'x is in y or z...', 'x is between y and z', 'x is more than y' or 'x is less than y'. It is necessary to disambiguate whether value is a numeric or keyword." @@ -149,7 +150,7 @@ (re-matches re-number value) [(list '= (list 'get-int 'cell (keyword property)) (read-string value)) rest] value [(list '= (list (keyword property) 'cell) (keyword value)) rest])))) -(defn parse-not-condition +(defn- parse-not-condition "Parse the negation of a simple condition." [[property IS NOT & rest]] (cond (and (member? IS '("is" "are")) (= NOT "not")) @@ -167,7 +168,7 @@ quantity) remainder]) -(defn parse-comparator-neighbours-condition +(defn- parse-comparator-neighbours-condition "Parse conditions of the form '...more than 6 neighbours are [condition]'" [[MORE THAN n NEIGHBOURS have-or-are & rest]] (let [quantity (first (parse-numeric-value (list n))) @@ -192,13 +193,13 @@ ;; (gen-neighbours-condition '< quantity property value remainder) )))))) -(defn parse-some-neighbours-condition +(defn- parse-some-neighbours-condition [[SOME NEIGHBOURS & rest]] (cond (and (= SOME "some") (= NEIGHBOURS "neighbours")) (parse-comparator-neighbours-condition (concat '("more" "than" "0" "neighbours") rest)))) -(defn parse-simple-neighbours-condition +(defn- parse-simple-neighbours-condition "Parse conditions of the form '...6 neighbours are condition'" [[n NEIGHBOURS have-or-are & rest]] (let [quantity (first (parse-numeric-value (list n)))] @@ -218,7 +219,7 @@ ;; (gen-neighbours-condition '< quantity property value remainder) )))))) -(defn parse-neighbours-condition +(defn- parse-neighbours-condition "Parse conditions referring to neighbours" [tokens] (or @@ -227,7 +228,7 @@ (parse-some-neighbours-condition tokens) )) -(defn parse-simple-condition +(defn- parse-simple-condition "Parse conditions of the form '[property] [comparison] [value]'." [tokens] (or @@ -238,7 +239,7 @@ (parse-less-condition tokens) (parse-more-condition tokens))) -(defn parse-disjunction-condition +(defn- parse-disjunction-condition "Parse '... or [condition]' from `tokens`, where `left` is the already parsed first disjunct." [left tokens] (let [partial (parse-conditions tokens)] @@ -246,7 +247,7 @@ (let [[right remainder] partial] [(list 'or left right) remainder])))) -(defn parse-conjunction-condition +(defn- parse-conjunction-condition "Parse '... and [condition]' from `tokens`, where `left` is the already parsed first conjunct." [left tokens] (let [partial (parse-conditions tokens)] @@ -254,7 +255,7 @@ (let [[right remainder] partial] [(list 'and left right) remainder])))) -(defn parse-conditions +(defn- parse-conditions "Parse conditions from `tokens`, where conditions may be linked by either 'and' or 'or'." [tokens] (let [partial (parse-simple-condition tokens)] @@ -265,14 +266,14 @@ (= next "or") (parse-disjunction-condition left remainder) true partial))))) -(defn parse-left-hand-side +(defn- parse-left-hand-side "Parse the left hand side ('if...') of a production rule." - [tokens] + [[IF & tokens]] (if - (= (first tokens) "if") - (parse-conditions (rest tokens)))) + (= IF "if") + (parse-conditions tokens))) -(defn parse-arithmetic-action +(defn- parse-arithmetic-action "Parse actions of the form '[property] should be [property] [arithmetic-operator] [value]', e.g. 'fertility should be fertility + 1', or 'deer should be deer - wolves'." [previous [prop1 should be prop2 operator value & rest]] @@ -285,18 +286,18 @@ (re-matches re-number value) (read-string value) true (list 'get-int 'cell (keyword value))))}) rest])) -(defn parse-set-action +(defn- parse-set-action "Parse actions of the form '[property] should be [value].'" [previous [property should be value & rest]] (if (and (= should "should") (= be "be")) [(list 'merge (or previous 'cell) {(keyword property) (cond (re-matches re-number value) (read-string value) true (keyword value))}) rest])) -(defn parse-simple-action [previous tokens] +(defn- parse-simple-action [previous tokens] (or (parse-arithmetic-action previous tokens) (parse-set-action previous tokens))) -(defn parse-actions +(defn- parse-actions "Parse actions from tokens." [previous tokens] (let [[left remainder] (parse-simple-action previous tokens)] @@ -305,7 +306,7 @@ (parse-actions left (rest remainder)) true (list left))))) -(defn parse-probability +(defn- parse-probability "Parse a probability of an action from this collection of tokens" [previous [n CHANCE IN m & tokens]] (cond @@ -319,7 +320,7 @@ (first (parse-simple-value (list n) true))) action) remainder])))) -(defn parse-right-hand-side +(defn- parse-right-hand-side "Parse the right hand side ('then...') of a production rule." [[THEN & tokens]] (if (= THEN "then")