This repository has been archived by the owner on Dec 16, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmantra.spec
67 lines (60 loc) · 3.09 KB
/
mantra.spec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<class definition> ::=
'class' <class identifier> [ '<' <superclass name> [ ',' <superclass name> ]* '>' ]?
<method defintion>*
<superclass name> ::= <class indentifier>
<method definition> ::=
<message type> '['
<statement_list>
']'
<message type> ::= <access type>? [ <unary type> | <binary type> | <keyword type> ]
<access type> ::= '<!>'
<unary type> ::= <unary method name>
<binary type> ::= <binary method name> <method argument>
<keyword type> ::= [<keyword name> <method argument>]+
<unary method name> ::= <non capitalized word>
<binary method name> ::= <binary character>+
<binary character> ::= [ '!' | '%' | '&' | '+' | '-' | '/' | '<' | '=' | '>' | '?' | '@' | '\' | '~' | '|' | '*' ]
<keyword name> ::= <non capitalized word> ':'
<statement_list> ::= <statement>? ['.' [<statement>]? ]*
<statement> ::= <return expression> | <expression>
<expression> ::= [ <assignment> | <basic epxression> | <primitive> ]
<primitive> ::= '{' <identifier>'('[<argument=identifier>]*')' '}'
<assigment> ::= <assignment target> ':' <basic expression>
<assignment target> ::= <!reserved words><variable>
<basic expression> ::= <primary> [ <message> [ ';' <message> ]* ]?
<primary> ::= <identifier> | <literal> | <block> | '(' <basic expression> ')'
<literal> ::= <number literal> | <string literal> | <array literal>
<number literal> ::= [ '-' ]? <absolute number>
<absolute number> ::= <integer> | <float>
<string> literal> ::= '\'' <string constant> '\''
<array literal> ::= '<' <array element>* '>'
<array element> ::= <literal> | <identifier>
<return expression> ::= '^' <expression>
<reserved words> ::= 'true' | 'false' | 'null' | 'self' | 'class'
<variable> ::= <instance variable identifier> | <class variable identifier> | <local variable>
Messages
message ::= <unary message>+ <binary message>* [<keyword message>]? |
<binary message>+ [ <keyword message>]? |
<keywork message>
<unary message> ::= <unary method name>
<binary message> ::= <binary method name> <binary argument>
<binary argument> ::= <primary> <unary message>*
<keyword message> ::= [<keyword name> <keyword argument>]+
<keyword argument> ::= <primary> <unary message>* <binary message>*
Numbers
<integer> ::= <digit>+
<float> ::= <mantissa> [ 'e' <exponent> ]?
<mantissa> ::= <digit>+ '.' <digit>+
<exponent> ::= [ '-' ]? <digits>+
Blocks
<block> ::= '[' <block body> ']'
<block body> ::= [[[<keyword name>]? <identifier>]* '|' ]? <statement_list>
Indetifier
<indentifier> ::= <reserved words> | <class identifier> | <instance variable identifier> | <class variable identifier> | <local variable>
<class identifier> ::= <namespace><class name>
<namespace> ::= [<capitalized word> '.' ]*
<clas name> ::= <capitalized word>
<capitalized word> ::= <uppercased leter> [ <letter> | <digit> ]*
<non capitalized word> ::= <lowercassed letter> [ <letter> | <digit> ]*
<instance variable identifier> ::= '@' <non capitalized word>
<class variable identifier> ::= '@' <capitalized word>