blob: 4a060415021709340be7abdf44bcf511f779b307 (
plain)
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
|
Program = (Statement / _)* end:PROGRAM_END _?
Statement = Definition / Expression
Definition = EnumDefinition / InterfaceDefinition / FunctionDefinition
Expression = BinaryExpression / UnaryExpression / Literal
// recursion here after removing LPAREN - maybe move to prefix notation?
BinaryExpression = LPAREN left:Expression _ op:BinaryOperation _ right:Expression
BinaryOperation = ArithmeticOperation / ComparisonOperation / BooleanOperation
ArithmeticOperation = "+" / "-" / "/" / "%" / "*" / "**" / ">>" / "<<" / "|" / "&"
ComparisonOperation = "<" / ">" / "<=" / ">=" / "==" / "!="
BooleanOperation = "||" / "&&"
UnaryExpression = PrefixOperation Expression / LPAREN Expression PostfixOperation
PrefixOperation = "!" / "~"
PostfixOperation = LBRACKET _? index:PositiveInteger _? RBRACKET
EnumDefinition = ENUM_DEF _ name:PASCAL_CASE _ ENUM_CONT _ SCOPE_START
_ options:EnumBody+ _ SCOPE_END
EnumBody = name:Identifier ","
InterfaceDefinition = INTERFACE_DEF _ name:PASCAL_CASE _ INTERFACE_CONT
_ signatures:FunctionSignature* _ SCOPE_END
FunctionDefinition = FunctionSignature _ SCOPE_START _ body:Expression* _ SCOPE_END
FunctionSignature = FUNCTION_DEF _ name:CAMEL_CASE _
(FUNCTION_DEF_ARGS _ args:FunctionArgsList _)?
FUNCTION_RETURN_TYPE _ result:Type
FunctionArgsList = (type:Type _ name:CAMEL_CASE _? "," _?)?
type:Type _ name:CAMEL_CASE
Type = name:PASCAL_CASE (_ generic:Generic)? / TupleType / UnionType
TupleType = tupleType:PASCAL_CASE _? LBRACKET _? tupleLength:PositiveInteger _? RBRACKET
UnionType = firstType:PASCAL_CASE _ TYPE_UNION _ secondType:(UnionType / Type)
Generic = LPAREN _? generic:((Type _? COMMA _?)* Type _?) RPAREN
Identifier = PASCAL_CASE / CAMEL_CASE
PASCAL_CASE = [A-Z](LETTER / DIGIT / SAFE_SYMBOL)+
CAMEL_CASE = [a-z](LETTER / DIGIT / SAFE_SYMBOL)+
PositiveInteger = [1-9][0-9]*
TYPE_UNION = "OR"
FUNCTION_DEF = "DISCOVER" _ "HOW" _ "TO"
FUNCTION_DEF_ARGS = "WITH"
FUNCTION_RETURN_TYPE = "GIVES" _ "YOU"
INTERFACE_DEF = "STUFF" _ "OF"
INTERFACE_CONT = "LOOKS" _ "LIKE"
ENUM_DEF = "ONLY" _ "OPTIONS" _ "OF"
ENUM_CONT = "ARE"
SCOPE_START = "RUMOR" _ "HAS" _ "IT"
SCOPE_END = "END" _ "OF" _ "STORY"
PROGRAM_END = "PLEASE" _ "LIKE" _ "AND" _ "SUBSCRIBE"
COMMA = ","
LBRACKET = "["
RBRACKET = "]"
LPAREN = "("
RPAREN = ")"
_ = (" " / "\n" / "\t" / "\r\n")+
LETTER = [A-Za-z]
SAFE_SYMBOL = "_"
DIGIT = [0-9]
|