11 Syntax
TBoS p 492-493
The syntax of Shen is presented as a context-free grammar in BNF notation annotated where necessary
to explain certain context-sensitive restrictions. For all X, the expansion >X> ::= Ɛ | ... indicates
that >X> may be expanded to an empty series of expressions.
Syntax Rules for Shen Definitions
<Shen def> ::= (define <lowercase> {<types>} <rules>) | (define <lowercase> <rules>) | (defmacro <lowercase> <rules>)
<lowercase> ::= any <symbol> not beginning in uppercase
<rules> ::= <rule> | <rule> <rules>
<rule> ::= <patterns> -> <item> | <patterns> <- <item>
| <patterns> -> <item> where <item> | <patterns> <- <item>
where <item>
<patterns> ::= Ɛ | <pattern> <patterns>
<pattern> ::= <base> (except -> and <-)
| [<pattern> <patterns> ┃ <pattern>]
| [<patterns>] | (cons <pattern> <pattern>)
| (@p <pattern> <pattern> <patterns>)
| (@s <pattern> <pattern> <patterns>)
| (@v <pattern> <pattern> <patterns>)
<item> ::= <base> | [<items> ┃ <item>] | [<items>]
| <application> | <abstraction>
<items> ::= <item> | <item> <items>
<base> ::= <symbol> (except |) | <string> | <boolean>
| <number> | ( ) | [ ]
<application> ::= (<items>)
<abstraction> ::= (/. <variables> <item>)
<variables> ::= <variable> | <variable> <variables>
<variable> ::= any <symbol> beginning in uppercase
<types> ::= Ɛ | (<types>) | <types> --> <types> | <symbol>
<symbol> := <alpha> <symbolchars> | <alpha>
<symbolchars> := <alpha> <symbolchars> | <digit> <symbolchars> |
<alpha>| <digit>
<alpha> ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u |
v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P |
Q | R | S | T | U | V | W | X | Y | Z | . | = | - | * | / | + | _ | ? | $ | ! | @ |
~ | > | < | & | % | ' | #| ` | ; | : | { | }
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<number> ::= <signs> <float> | <signs> <integer>
| <signs> <e-number>
<signs> ::= Ɛ | + <signs> | - <signs>
<float> ::= <digits> . <digits> | . <digits>
<integer> ::= <digits>
<digits> ::= <digit> | <digit> <digits>
<e-number> ::= <integer> e - <integer> | <integer> e <integer> | <float> e - <integer> | <float> e <integer>
Syntax Rules for Shen Datatype Definitions
<datatype-definition> ::= (datatype <lowercase> <datatype-rules>)
<datatype-rules> ::= <datatype-rule> | <datatype-rule> <datatype-rules>
<datatype-rule> :: = <side-conditions> <schemes> <underline> <scheme>;
| <side-conditions> <simple schemes> <double underline>
<formula>;
<side-conditions> ::= Ɛ | <side-condition> | <side-condition> <side-conditions>
<side-condition> | if <item> | let <variable> <item>
<underline> ::= _ | one or more concatenations of the underscore _
<double underline> ::= = | one or more concatenations of =
<simple schemes> ::= <formula> ; | <formula> ; <simple schemes>
<formula> ::= <item> : <item> | <item>
<schemes> ::= Ɛ | <scheme> ; <schemes>
<scheme> ::= <assumptions> >> <formula> | <formula>
<assumptions> ::= <formula> | <formula>, <assumptions>
Syntax Rules for Shen Prolog Definitions
<prolog_definition> ::= (defprolog <lowercase> <clauses>)
<clauses> ::= <clause> | <clause> <clauses>
<clause> ::= <head> <-- <tail> ;
<head> ::= <prolog-patterns>
<prolog-patterns> ::= Ɛ | <prolog-pattern> <prolog-patterns>
<prolog-pattern> ::= <base>
| [<prolog-pattern> <prolog-patterns> I <prolog-pattern>]
| [<prolog-patterns>]
| (cons <prolog-pattern> <prolog-pattern>)
<tail> := Ɛ | ! <tail> | <application> <tail> |