1- <программа> ::= {<программа>}<элемент_программы>
2- <элемент_программы> ::= (<класс>|<реализация_метода_класса>|<декларация_переменных>|<функция>)
3- <класс> ::= class <идентификатор>" {" {[<спецификатор_доступа>:]{(<декларация_свойств_класса>|<метод_класса>)}}" }" ;
4- <спецификатор_доступа> ::= (public|private)
5- <метод_класса> ::= [((<тип_переменной>|void ) |~)]<идентификатор>" (" [<список_аргументов>]" )" <блок>
6- <реализация_метода_класса> ::= ([(<тип_переменной>|void ) ]<идентификатор>::|<идентификатор>::~)<идентификатор>" (" [<список_аргументов>]" )" <блок>
7- <функция> ::= (<тип_переменной>|void ) <идентификатор>" (" [<список_аргументов>]" )" <блок>
8- <список_аргументов> ::= {<список_аргументов>,}<аргумент>
9- <аргумент> ::= [const ]<тип_переменной>[&]<идентификатор>
10- <блок> ::= " {" {<элемент_блока>}" }"
11- <элемент_блока> ::= (<декларация_переменных>|[(<выражение>|<возврат>)];|<цикл>|<ветвление>)
12- <возврат> ::= return [ <выражение>]
13- <выражение> ::= [<выражение>,]<оператор_1>
14- <оператор_1> ::= (<объект>(=|+=|-=|*=|/=|%=)<оператор_1>|<оператор_2>)
15- <оператор_2> ::= [<оператор_2>" ||" ]<оператор_3>
16- <оператор_3> ::= [<оператор_3>&&]<оператор_4>
17- <оператор_4> ::= [<оператор_4>(==|!=)]<оператор_5>
18- <оператор_5> ::= [<оператор_5>(" <" |" <" =|" >" |" >" =)]<оператор_6>
19- <оператор_6> ::= [<оператор_6>(+|-)]<оператор_7>
20- <оператор_7> ::= [<оператор_7>(*|/|%)]<оператор_8>
21- <оператор_8> ::= ([(+|-|!|*)]<оператор_9>|(++|--|&)<объект>)
22- <оператор_9> ::= (" (" <выражение>" )" |<литерал>|<объект>[(++|--)]|<вызов_функции>)
23- <вызов_функции> ::= <объект>" (" [<выражение>]" )"
24- <объект> ::= [<идентификатор>(.|-" >" )]<идентификатор>
25- <декларация_свойств_класса> ::= [const ]<тип_переменной> <список_свойств_класса>;
26- <декларация_переменных> ::= [const ]<тип_переменной> <список_переменных>;
27- <тип_переменной> ::= (int |double |char |bool |<идентификатор>)
28- <список_свойств_класса> ::= {<список_свойств_класса>,}[*]<идентификатор>
29- <список_переменных> ::= {<список_переменных>,}[*]<идентификатор>[=<оператор_1>]
30- <цикл> ::= (<while -цикл>|<do -while -цикл>|<for -цикл>)
31- <while -цикл> ::= while " (" <выражение>" )" <блок>
32- <do -while -цикл> ::= do <блок>while " (" <выражение>" )" ;
33- <for -цикл> ::= for " (" <выражение>;<выражение>;<выражение>" )" <блок>
34- <ветвление> ::= if " (" <выражение>" )" <блок>[else <блок>]
35- // lexical rules
36- <идентификатор> ::= <буква>{(<буква>|<цифра>|_)}
37- <литерал> ::= (<логический_литерал>|<целая_константа>|<константа_с_плавающей_точкой>|<символьная_константа>|<строковый_литерал>)
1+ <program> ::= {<program>}<program_element>
2+ <program_element> ::= (<class >|<class_method_impl>|<vars_declaration>|<function>)
3+ <class > ::= class <id>" {" {[<access_spec>:]{(<class_props_declaration>|<class_method>)}}" }" ;
4+ <access_spec> ::= (public|private)
5+ <class_method> ::= [((<var_type>|void ) |~)]<id>" (" [<arguments_list>]" )" <block>
6+ <class_method_impl> ::= ([(<var_type>|void ) ]<id>::|<id>::~)<id>" (" [<arguments_list>]" )" <block>
7+ <function> ::= (<var_type>|void ) <id>" (" [<arguments_list>]" )" <block>
8+ <arguments_list> ::= {<arguments_list>,}<argument>
9+ <argument> ::= [const ]<var_type>[&]<id>
10+ <block> ::= " {" {<block_element>}" }"
11+ <block_element> ::= (<vars_declaration>|[(<expression>|<return >)];|<loop>|<branching>)
12+ <return > ::= return [ <expression>]
13+ <expression> ::= [<expression>,]<operator_1>
14+ <operator_1> ::= (<object>(=|+=|-=|*=|/=|%=)<operator_1>|<operator_2>)
15+ <operator_2> ::= [<operator_2>" ||" ]<operator_3>
16+ <operator_3> ::= [<operator_3>&&]<operator_4>
17+ <operator_4> ::= [<operator_4>(==|!=)]<operator_5>
18+ <operator_5> ::= [<operator_5>(" <" |" <" =|" >" |" >" =)]<operator_6>
19+ <operator_6> ::= [<operator_6>(+|-)]<operator_7>
20+ <operator_7> ::= [<operator_7>(*|/|%)]<operator_8>
21+ <operator_8> ::= ([(+|-|!|*)]<operator_9>|(++|--|&)<object>)
22+ <operator_9> ::= (" (" <expression>" )" |<literal>|<object>[(++|--)]|<function_call>)
23+ <function_call> ::= <object>" (" [<expression>]" )"
24+ <object> ::= [<id>(.|-" >" )]<id>
25+ <class_props_declaration> ::= [const ]<var_type> <class_props_list>;
26+ <vars_declaration> ::= [const ]<var_type> <vars_list>;
27+ <var_type> ::= (int |double |char |bool |<id>)
28+ <class_props_list> ::= {<class_props_list>,}[*]<id>
29+ <vars_list> ::= {<vars_list>,}[*]<id>[=<operator_1>]
30+ <loop> ::= (<while -loop>|<do -while -loop>|<for -loop>)
31+ <while -loop> ::= while " (" <expression>" )" <block>
32+ <do -while -loop> ::= do <block>while " (" <expression>" )" ;
33+ <for -loop> ::= for " (" <expression>;<expression>;<expression>" )" <block>
34+ <branching> ::= if " (" <expression>" )" <block>[else <block>]
3835
39- <логический_литерал> ::= (true |false )
40- <константа_с_плавающей_точкой> ::= [(+|-)](<цифра>{<цифра>}.[<цифра>{<цифра>]|.<цифра>{<цифра>})[(e|E)<десятичная_целая_константа>]
41- <целая_константа> ::= (<десятичная_целая_константа>|<восьмеричная_целая_константа>|<шестнадцатеричная_целая_константа>)
42- <десятичная_целая_константа> ::= [(+|-)]<цифра>{<цифра>}
43- <восьмеричная_целая_константа> ::= [(+|-)]0 {(0 |…|7 )}
44- <шестнадцатеричная_целая_константа> ::= [(+|-)]0x (0 |…|9 |a|…|f|A|…F){(0 |…|9 |a|…|f|A|…F)}
45- <цифра> ::= (0 |…|9 )
46- <буква> ::= (a|…|z|A|…|Z)
47- <символьная_константа> ::= ' (?|\( ' |" " " |n|t))'
48- <строковый_литерал> ::= " " " {(?|\(' |"""|n|t))}"""
36+ // lexical stuff
37+ <id> ::= <letter>{(<letter>|<digit>|_)}
38+ <literal> ::= (<boolean_literal>|<integer_literal>|<floating_point_literal>|<char_literal>|<string_literal>)
4939
50- // lvalue == объект
51- // rvalue == выражение
40+ <boolean_literal> ::= (true |false )
41+ <floating_point_literal> ::= [(+|-)](<digit>{<digit>}.[<digit>{<digit>]|.<digit>{<digit>})[(e|E)<decimal_literal>]
42+ <integer_literal> ::= (<decimal_literal>|<octal_literal>|<hex_literal>)
43+ <decimal_literal> ::= [(+|-)]<digit>{<digit>}
44+ <octal_literal> ::= [(+|-)]0 {(0 |...|7 )}
45+ <hex_literal> ::= [(+|-)]0x (0 |...|9 |a|...|f|A|...F ){(0 |...|9 |a|...|f|A|...F )}
46+ <digit> ::= (0 |...|9 )
47+ <letter> ::= (a|...|z|A|...|Z)
48+ <char_literal> ::= ' (...|\( ' |" " " |n|t))'
49+ <string_literal> ::= " " " {(...|\(' |"""|n|t))}"""
50+
51+ // lvalue == object
52+ // rvalue == expression
0 commit comments