NAME
Soar::Production::Parser::PRDGrammar - Parse::RecDescent grammar for Soar productions
VERSION
version 0.03
SYNOPSIS
use
Parse::RecDescent;
my
$some_text
=
'Soar productions here'
;
my
$parser
= Parse::RecDescent->new(
$Soar::Production::Parser::PRDGrammar::GRAMMAR
);
$parser
->parse(
$some_text
);
DESCRIPTION
This module holds one global string: a Parse::RecDescent
grammar for parsing Soar productions. It is not really intended for public consumption, but for use by modules Soar::Production distribution.
NAME
Soar::Production::Parser::PRDGrammar - Parse::RecDescent
grammar for parsing Soar productions.
BNF Grammar from the Soar Manual
The following is a description of a grammar describing Soar productions, from the Soar manual. Note also that a /(;\s*)?\#/ (pound sign optionally preceded by semi-colon and white space) indicates an end-of-line comment. Soar does not have multi-line comments.
Grammar of Soar productions
A grammar for Soar productions is:
<soar-production> ::= sp
"{"
<production-name> [<documentation>] [<flags>]
<condition-side> --> <action-side>
"}"
<documentation> ::=
""
" [<string>] "
""
<flags> ::=
":"
(o-support | i-support | chunk |
default
)
Grammar for Condition Side
I have modified the grammar below from the original to account for the fact that an instance of <state-imp-cond> is not required to start the LHS, and may actually occur anywhere inside of it.
Below is a grammar
for
the condition sides of productions:
<condition-side> ::= <cond>+
<cond> ::= <positive_cond> |
"-"
<positive_cond>
<positive_cond> ::= <state-imp-cond> | <conds_for_one_id> |
"{"
<cond>+
"}"
<state-imp-cond> ::=
"("
(state | impasse) [<id_test>] <attr_value_tests>+
")"
<conds_for_one_id> ::=
"("
[(state|impasse)] <id_test> <attr_value_tests>+
")"
<id_test> ::= <test>
<attr_value_tests> ::= [
"-"
]
"^"
<attr_test> (
"."
<attr_test>)* <value_test>*
<attr_test> ::= <test>
<value_test> ::= <test> [
"+"
] | <conds_for_one_id> [
"+"
]
<test> ::= <conjunctive_test> | <simple_test>
<conjunctive_test> ::=
"{"
<simple_test>+
"}"
<simple_test> ::= <disjunction_test> | <relational_test>
<disjunction_test> ::=
"<<"
<constant>+
">>"
<relational_test> ::= [<relation>] <single_test>
<relation> ::=
"<>"
|
"<"
|
">"
|
"<="
|
">="
|
"="
|
"<=>"
<single_test> ::= <variable> | <constant>
<variable> ::=
"<"
<sym_constant>
">"
<constant> ::= <sym_constant> | <int_constant> | <float_constant>
Notes on the Condition Side
In an <id_test>, only a <variable> may be used in a <single_test>.
Grammar for Action Side
Below is a grammar for the action sides of productions:
<rhs> ::= <rhs_action>*
<rhs_action> ::=
"("
<variable> <attr_value_make>+
")"
| <func_call>
<func_call> ::=
"("
<func_name> <rhs_value>*
")"
<func_name> ::= <sym_constant> |
"+"
|
"-"
|
"*"
|
"/"
<rhs_value> ::= <constant> | <func_call> | <variable>
<attr_value_make> ::=
"^"
<variable_or_sym_constant> (
"."
<variable_or_sym_constant>)* <value_make>+
<variable_or_sym_constant> ::= <variable> | <sym_constant>
<value_make> ::= <rhs_value> <preference_specifier>*
<preference-specifier> ::= <unary-preference> [
","
]
| <unary-or-binary-preference> [
","
]
| <unary-or-binary-preference> <rhs_value> [
","
]
<unary-pref> ::=
"+"
|
"-"
|
"!"
|
"~"
|
"@"
<unary-or-binary-pref> ::=
">"
|
"="
|
"<"
|
"&"
CAVEATS
This grammar does not check for the semantic correctness of a production. For example, the following parses just fine:
sp {foo
(state)
-->
(<s> ^foo <a>)
}
Whereas the real Soar parser gives us an error, saying that <lt>s<gt> is not connected to the LHS in any way.
BUGS
In Soar, numbers cannot be used to name a working memory element unless they are quoted; this is a known bug. This grammar does not implement that specific bug/feature, and thus the following is accepted, even though Soar would reject it:
sp {bad-numbers
(state <s> ^string.2.string)
-->
}
SEE ALSO
The documentation for Soar is located at https://code.google.com/p/soar/
AUTHOR
Nathan Glenn <garfieldnate@gmail.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Nathan Glenn.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.