mw-parser/README.md
2014-07-06 14:31:10 +01:00

123 lines
3.3 KiB
Markdown

# mw-parser
A rule parser for MicroWorld
## Usage
Main entry point is (parse-rule <string>), where string takes a form detailed
in **grammar**, below. If the rule is interpretted correctly the result will
be a Clojure anonymous function; if the rule is not interpretted, currently nil
is returned and there's no helpful error message.
### Generated function and evaluation environment
The generated function is a function of two arguments
* **cell** a cell in a world as defined in mw-engine.world, q.v.;
* **world** the world of which that cell forms part.
It returns a new cell, based on the cell passed.
Actions of the rule will (can only) modify properties of the cell; there are two
properties which are special and SHOULD NOT be modified, namely the properties
**x** and **y**. Currently there is no policing that these properties are not
modified.
### Grammar
A rule comprises:
* if *conditions* then *actions*
#### Conditions
where *conditions* is:
* *condition*
or
* *condition* and *conditions*
A *condition* is one of:
* *property* is *value*
* *property* is not *value*
* *property* is in *values*
* *property* is not in *values*
* *property* is more than *numeric-value*
* *property* is less than *numeric-value*
* *number* neighbours have *property* equal to *value*
* more than *number* neighbours have *property* equal to *value*
* fewer than *number* neighbours have *property* equal to *value*
#### Actions
Where *actions* is:
* *action*
or
* *action* and *actions*
and *action* is:
* *property* should be *value*
#### Properties
In the above, *property* is the name of any property of a cell. Any alpha-numeric
string of characters can form the name of a property. Actions should NOT refer
to the reserved properties **x** and **y**.
#### Values in Conditions
Values in conditions and actions are considered slightly differently. In a
condition, a value is one of
* *symbolic-value*
* *numeric-value*
The '...more than...' and '...less than...' conditions imply a *numeric-value*.
Thus "if altitude is more than fertility..." is interpreted as meaning "if the value
of the property of the current cell called 'altitude' is greater than the value
of the property of the current cell called 'fertility'", whereas the apparently
similar condition 'if altitude is fertility...' is interpreted as meaning
"if the value of the property of the current cell called 'altitude' is the symbol
'fertility'".
Thus *symbolic-value* is any sequence of alphanumeric characters, whereas
*numeric-value* is one of:
* *number*
* *property*
and *number* is any sequence of the decimal digits 0...9, the minus character
'-' and the period character '.', provided that the minus character can only be
in the first position, and the period character can only appear once.
#### Values in Actions
A *value* in an action is one of
* *symbolic-value*
* *arithmetic-value*
* *number*
where *arithmetic-value* is:
* *property* *operator* *numeric-value*
and *operator* is one of the simple arithmetic operators '+', '-', '*' and '/'.
### Shorthand
Note that '...members are...' is equivalent to '...members have state equal to...',
and 'some neighbours...' is equivalent to 'more than 0 neighbours...'
## License
Copyright © 2014 Simon Brooke
Distributed under the GNU General Public License either version 2.0 or (at
your option) any later version.