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) {
}
}
|