aboutsummaryrefslogtreecommitdiff
path: root/bnf
blob: cc49d8789737a85f2e925e789aeb19d35bfbd93e (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<program> ::= { <function_declaration> }

<function_declaration> ::=
    "function" <identifier> "(" [ <parameter_list> ] ")"
    "->" <type>
    <block>

<parameter_list> ::= <parameter> { "," <parameter> }

<parameter> ::= <type> <identifier>

<type> ::= "int"
         | "bool"


<block> ::= "{"
                <statement_list>
            "}"

<statement_list> ::= { <statement> }

<statement> ::= <variable_declaration>
              | <assignment_statement>
              | <if_statement>
              | <while_statement>
              | <for_statement>
              | <return_statement>
              | <expression_statement>


<variable_declaration> ::=
    <type> <identifier> [ "=" <expression> ] ";"

<assignment_statement> ::=
    <identifier> "=" <expression> ";"

<return_statement> ::=
    "return" [ <expression> ] ";"

<expression_statement> ::=
    <expression> ";"


<if_statement> ::=
    "if" "(" <expression> ")"
    <block>
    [ "else" <block> ]

<while_statement> ::=
    "while" "(" <expression> ")"
    <block>

<for_statement> ::=
    "for" "("
        [ <for_init> ]
        ";"
        [ <expression> ]
        ";"
        [ <expression> ]
    ")"
    <block>

<for_init> ::= <type> <identifier> [ "=" <expression> ]
             | <expression>


<expression> ::= <logical_or>

<logical_or> ::= <logical_and>
               { "||" <logical_and> }

<logical_and> ::= <equality>
                { "&&" <equality> }

<equality> ::= <comparison>
             { ( "==" | "!=" ) <comparison> }

<comparison> ::= <term>
               { ( "<" | ">" | "<=" | ">=" ) <term> }

<term> ::= <factor>
         { ( "+" | "-" ) <factor> }

<factor> ::= <unary>
           { ( "*" | "/" | "%" ) <unary> }

<unary> ::= ( "!" | "-" ) <unary>
          | <primary>

<primary> ::= <number>
            | <boolean>
            | <identifier>
            | <function_call>
            | "(" <expression> ")"


<function_call> ::=
    <identifier> "(" [ <argument_list> ] ")"

<argument_list> ::= <expression>
                  { "," <expression> }


<identifier> ::= <letter> { <letter> | <digit> }

<number> ::= <digit> { <digit> }

<boolean> ::= "true"
            | "false"

<letter> ::= "a" | ... | "z"
           | "A" | ... | "Z"
           | "_"

<digit> ::= "0" | ... | "9"