Skip to content

Files

Latest commit

 

History

History
136 lines (101 loc) · 4.75 KB

bnf_grammar.md

File metadata and controls

136 lines (101 loc) · 4.75 KB

BNF Grammar

<program> ::= {<global_declaration>}+

<global_declaration> ::= <function_definition>
                       | <declaration>

<function_definition> ::= {<type_specifier>}? <declarator> {<declaration>}* <compound_statement>

<type_specifier> ::= void
                   | char
                   | int
                   | float

<declarator> ::= {<pointer>}? <direct_declarator>

<pointer> ::= * {<pointer>}?

<direct_declarator> ::= <identifier>
                      | ( <declarator> )
                      | <direct_declarator> [ {<constant_expression>}? ]
                      | <direct_declarator> ( <parameter_list> )
                      | <direct_declarator> ( {<identifier>}* )

<constant_expression> ::= <binary_expression>

<binary_expression> ::= <cast_expression>
                      | <binary_expression> * <binary_expression>
                      | <binary_expression> / <binary_expression>
                      | <binary_expression> % <binary_expression>
                      | <binary_expression> + <binary_expression>
                      | <binary_expression> - <binary_expression>
                      | <binary_expression> < <binary_expression>
                      | <binary_expression> <= <binary_expression>
                      | <binary_expression> > <binary_expression>
                      | <binary_expression> >= <binary_expression>
                      | <binary_expression> == <binary_expression>
                      | <binary_expression> != <binary_expression>
                      | <binary_expression> && <binary_expression>
                      | <binary_expression> || <binary_expression>

<cast_expression> ::= <unary_expression>
                    | ( <type_specifier> ) <cast_expression>

<unary_expression> ::= <postfix_expression>
                     | ++ <unary_expression>
                     | -- <unary_expression>
                     | <unary_operator> <cast_expression>

<postfix_expression> ::= <primary_expression>
                       | <postfix_expression> [ <expression> ]
                       | <postfix_expression> ( {<argument_expression_list>}? )
                       | <postfix_expression> ++
                       | <postfix_expression> --

<primary_expression> ::= <identifier>
                       | <constant>
                       | <string>
                       | ( <expression> )

<constant> ::= <integer_constant>
             | <character_constant>
             | <floating_constant>

<expression> ::= <assignment_expression>
               | <expression> , <assignment_expression>

<argument_expression_list> ::= <assignment_expression>
                             | <argument_expression_list> , <assignment_expression>

<assignment_expression> ::= <binary_expression>
                          | <unary_expression> <assignment_operator> <assignment_expression>

<assignment_operator> ::= =
                        | *=
                        | /=
                        | %=
                        | +=
                        | -=

<unary_operator> ::= &
                   | *
                   | +
                   | -
                   | !

<parameter_list> ::= <parameter_declaration>
                   | <parameter_list> , <parameter_declaration>

<parameter_declaration> ::= <type_specifier> <declarator>

<declaration> ::=  <type_specifier> {<init_declarator_list>}? ;

<init_declarator_list> ::= <init_declarator>
                         | <init_declarator_list> , <init_declarator>

<init_declarator> ::= <declarator>
                    | <declarator> = <initializer>

<initializer> ::= <assignment_expression>
                | { <initializer_list> }
                | { <initializer_list> , }

<initializer_list> ::= <initializer>
                     | <initializer_list> , <initializer>

<compound_statement> ::= { {<declaration>}* {<statement>}* }

<statement> ::= <expression_statement>
              | <compound_statement>
              | <selection_statement>
              | <iteration_statement>
              | <jump_statement>
              | <assert_statement>
              | <print_statement>
              | <read_statement>

<expression_statement> ::= {<expression>}? ;

<selection_statement> ::= if ( <expression> ) <statement>
                        | if ( <expression> ) <statement> else <statement>

<iteration_statement> ::= while ( <expression> ) <statement>
                        | for ( {<expression>}? ; {<expression>}? ; {<expression>}? ) <statement>
                        | for ( <declaration> {<expression>}? ; {<expression>}? ) <statement>

<jump_statement> ::= break ;
                   | return {<expression>}? ;

<assert_statement> ::= assert <expression> ;

<print_statement> ::= print ( {<argument_expression_list>}? ) ;

<read_statement> ::= read ( <argument_expression_list> ) ;