145 lines
4.5 KiB
Markdown
145 lines
4.5 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](#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.
|
|
|
|
### <a name="grammar"></a>Grammar
|
|
|
|
#### Comments
|
|
|
|
+ Any line which starts with the hash character (#) is ignored;
|
|
+ Any line which starts with a semi-colon (;) is ignored.
|
|
|
|
#### Rules
|
|
|
|
A rule comprises:
|
|
|
|
+ if _conditions_ then _actions_
|
|
|
|
Each rule must be on a single line. There should be nothing else on that line.
|
|
|
|
#### Conditions
|
|
|
|
In rules, _conditions_ is one of:
|
|
|
|
+ _condition_
|
|
+ _condition_ and _conditions_
|
|
+ _condition_ or _conditions_
|
|
|
|
Note that 'and' takes precedence over or, so
|
|
|
|
conditionA and conditionB or conditionC and conditionD
|
|
|
|
is interpreted as
|
|
|
|
(conditionA and (conditionB or (conditionC and conditionD)))
|
|
|
|
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_
|
|
+ _number_ neighbours have _property_ more than _numeric-value_
|
|
+ _number_ neighbours have _property_ less than _numeric-value_
|
|
+ more than _number_ neighbours have _property_ equal to _value_
|
|
+ fewer than _number_ neighbours have _property_ equal to _value_
|
|
+ some neighbours have _property_ equal to _value_
|
|
+ more than _number_ neighbours have _property_ more than _numeric-value_
|
|
+ fewer than _number_ neighbours have _property_ more than _numeric-value_
|
|
+ some neighbours have _property_ more than _numeric-value_
|
|
+ more than _number_ neighbours have _property_ less than _numeric-value_
|
|
+ fewer than _number_ neighbours have _property_ less than _numeric-value_
|
|
+ some neighbours have _property_ less than _numeric-value_
|
|
|
|
#### Actions
|
|
|
|
In these rules, _actions_ is one of:
|
|
|
|
+ _action_
|
|
+ _action_ and _actions_
|
|
|
|
and _action_ is:
|
|
|
|
+ _property_ should be _value_
|
|
+ _number_ chance in _number_ _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 '...neighbours are...' is equivalent to '...neighbours have state equal to...',
|
|
and 'some neighbours...' is equivalent to 'more than 0 neighbours...'
|
|
|
|
## License
|
|
|
|
Copyright © 2014 Simon Brooke
|
|
|
|
Distributed under the terms of the [GNU General Public License v2](http://www.gnu.org/licenses/gpl-2.0.html) |