-
Notifications
You must be signed in to change notification settings - Fork 0
/
gom.ebnf
89 lines (51 loc) · 2.27 KB
/
gom.ebnf
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
program = importDeclaration* , typeOrFunctionDefinition* , mainFunction;
importDeclaration = "import" , identifier , ";";
typeOrFunctionDefinition = typeDefinition | functionDefinition;
typeDefinition = "type" , identifier , "=" , gomType , ";";
functionDefinition = "fn" , identifier , "(" , argumentItem* , ")" , functionReturnType? ,
"{" , statement+ , "}";
mainFunction = "fn" , "main" , "(" , argumentItem* , ")" , functionReturnType? ,
"{" , statement+ , "}";
statement = ifStatement
| forStatement
| returnStatement
| letStatement
| expressionStatement;
forStatement = "for" , "(" , expr? , ";" , expr? , ";" , expr? , ")" , "{" , statement+ , "}";
returnStatement = "return" , expr , ";";
letStatement = "let" , assignment+ , ";";
constStatement = "const" , assignment+ , ";";
expressionStatement = expr , ";";
gomType = typeIdOrArray | structType;
typeIdOrArray = typeId ("[" , numLiteral , "]")?;
structType = "struct" , "{" , structTypeItem+ , "}";
structTypeItem = identifier , ":" , gomType , ","?;
argumentItem = identifier , ":" , gomType , ","?;
functionReturnType = ":" , gomType;
assignment = identifier , "=" , expr;
(* Precedence *)
expr = assignment;
(* (identifier , ".")? is not implemented yet *)
assignment = (identifier , ".")? , identifier , "=" , assignment
| comparison;
comparison = sum , (("<" | ">" | "<=" | ">=" | "==") , comparison)?;
sum = quot , (("+" | "-") , quot)?;
quot = expo , (("/" | "*") , expo)?;
expo = call , ("^" , call)?;
call = term , ("(" , expr? , (expr , ",")* , ")" | "." call)?;
term = identifier | numLiteral | stringLiteral | "(" , expr , ")" | "true" | "false";
identifier = letter , (letter | digit)*;
numLiteral = digit+;
stringLiteral = '"' , (letter | digit)* , '"';
primitiveType = "i8" | "bool" | "f16" | "str";
compositeType = identifier;
letter = "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" ;
WHITESPACE = " " | \n | \r | \t;