aboutsummaryrefslogtreecommitdiff
path: root/docs/notes/syntax.ebnf
blob: 935ce03b67d00cb317196af31a2833fa0e39db7b (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86


name-ref ::= identifier, [ "[", name, { ",", name }, [ "," ] "]" ];
name-decl ::= identifier, [ "[", identifier, { ",", identifier }, [ "," ], "]" ];

elementary-type ::=
    "int";

required-pointer-type ::=
    "*", type;

optional-pointer-type ::=
    "?", type;

struct-type ::=
    "struct", parameters;

enum-type ::=
    "enum", type, "(", [ enum-value, { ",", enum-value }, [ "," ], ")";

enum-value ::=
    name-decl, "=", value;

type-storage ::=
    required-pointer-type,
    optional-pointer-type,
    struct-type,
    enum-type,
    elementary-type,
    name-ref;

constraint ::=
    "constraint",
    expression;

type ::=
    [ "const" ],
    [ "keep" ],
    type-storage,
    { constraint };

parameters ::= "(", [ type, name-decl, { ",", type, name-decl } ], [ "," ], ")";

declaration ::=
    function-decl,
    type-decl,
    var-decl;

function-decl ::=
    parameters, (* return values *)
    name-decl,  (* name *)
    parameters, (* parameters *)
    code-block | ";"; (* code *)

type-decl ::=
    "typedef",
    name-decl,    (* name *)
    [ "=" type ], (* definition *)
    ";";

var-decl ::=
    name-ref,       (* type *)
    name-decl,      (* name *)
    [ "=", expression ], (* initial value [default is an invalid value) *)
    ";";

code-block ::=
    "{", { code-statement, ";" }, "}";

code-statement ::=
    declaration,
    


(int r) hypot(int a, int b) {
    r = sqrt(a^2 + b^2)
}


() print(string s) {
    if (posix.write(STDOUT, s.data, s.length) == -1) {
        
    }
}