Язык Gentee в БНФ
В тексте программы могут использоваться ANSI символы с кодом от 0 до 255. В диаграммах в кавычках указаны ANSI символы с кодом от 32 до 128, остальные символы записаны в виде шестнадцатеричного кода, например 0x09 - символ табуляции. В диаграммах не отображены некоторые препроцессорные команды.
<двоичная цифра> ::= '0' | '1'
<десятичная цифра> ::= <двоичная цифра> | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<шестнадцатеричная цифра> ::= <десятичная цифра> | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
<байт> ::= <шестнадцатеричная цифра><шестнадцатеричная цифра>
<десятичное число> ::= <десятичная цифра> {<десятичная цифра>}
<шестнадцатеричное число> ::= '0' ('x' | 'X') <шестнадцатеричное число> {<шестнадцатеричное число>}
<двоичное число> ::= '0' ('b' | 'B') <двоичное число> {<двоичное число>}
<код символа> ::= '''<любой символ>'''
<число с точкой> ::= <десятичное число>'.'[<десятичное число>]
<действительное число> ::= ['-'] (<число с точкой> | <число с точкой> ('e' | 'E') ['+' | '-'] <десятичное число>) ['d' | 'D']
<натуральное число> ::= <десятичное число> | <шестнадцатеричное число> | <двоичное число> | <код символа>
<целое число> ::= ['-'] <натуральное число> ['l' | 'L']
<число> := <целое число> | <число с точкой> | <действительное число>
<буква> ::= 'A' | 'B' | ... | 'Z' | 'a' | 'b' | ... | 'z' | 0x80 | 0x81 | ... | 0xFF
<пробел> ::= 0x20
<табуляция> ::= 0x09
<конец строки> := 0x0D 0x0A
<спецсимвол> ::= '!' | '"' | '#' | '$' | '%' | '&' | ''' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '<' | '=' | '>' | '?' | '@' | '[' | '\' | ']' | '^' | '_' | '|' | '}' | '{' | '~' | <табуляция> | <пробел> | <конец строки>
<символ> ::= <десятичная цифра> | <буква> | <спецсимвол>
<имя> ::= (<буква> | '_') {<буква> | '_' | <десятичная цифра>}
<имя функции> ::= <имя>
<имя переменной> ::= <имя>
<имя типа> ::= <имя>
<имя поля> ::= <имя>
<имя метода> ::= <имя>
<имя атрибута> ::= <имя>
<имя макроса> ::= <имя>
<стр символ> ::= <табуляция> | <пробел> | '!' | '#' | ... | '[' | ']' | ... | 0xFF
<расш стр символ> ::= <стр символ> | '\'
<любой символ> ::= <расш стр символ> | '"'
<элемент макростроки> ::= {<стр символ>|<конец строки>| '$'<имя макроса>}
<элемент конст строки> ::= <стр символ> | <конец строки> | '\\' | '\"' | '\a' | '\b' | '\f' | '\n' | '\r' | '\t' | '\l' | '\0'<байт> | '\$'<имя макроса>'$' | '\$"' {<элемент макростроки>} '"' | '\#' | '\=' ( '\' | '/' | '~' | '^' | '&' | ':') | '\%['[ {<расш стр символ>} ]']'{<расш стр символ>}[{<расш стр символ>}] | '\[' {<любой символ>}']' | '\<'{<элемент макростроки>}'>'
<элемент строки> ::= {<расш стр символ>} | '\('<выражение>')'
<конст строка> ::= '"' { <элемент конст строки> | '\!'{<элемент конст строки>| '"'}'\!' }'"'
<строка> ::= '"' { <элемент строки>| '\!'{<элемент строки>| '"'}'\!' }'"'
<элемент конст двоичных данных> ::= '\h'<пробел> [ ( '2' | '4' | '8' ) <пробел>] | '\i'<пробел> [ ( '2' | '4' | '8' ) <пробел>] | <шестнадцатеричная цифра> {<шестнадцатеричная цифра>} { (<пробел> | ',' | <конец строки>) <шестнадцатеричная цифра> {<шестнадцатеричная цифра>} } | <целое число> { (<пробел> | ',' | <конец строки>) <целое число> } | '\'<конст строка> | '\[' {<любой символ>}']' | '\$'<имя макроса>'$' | '\$"' {<элемент макростроки>} '"' | '\<'{<элемент макростроки>}'>'
<элемент двоичных данных> ::= <элемент конст двоичных данных> | '\('<выражение>')'
<конст двоичные данные> ::= ''' {<элемент конст двоичных данных>} '''
<двоичные данные> ::= ''' {<элемент двоичных данных>} '''
<конст коллекция> ::= '%{' <константа> {','<константа>} '}'
<коллекция> ::= '%{' <выражение> {','<выражение>} '}'
<константа> ::= <число> | <конст строка> | <конст двоичные данные> | <конст коллекция>
<описание массива> ::= [ '[' {','} ']' ] [of <имя типа>]
<объект> ::= <имя переменной> | <указатель> | <элемент массива> | <поле> | <вызов функции> | <вызов метода> | <выражение> | <позднее связывание>
<указатель> ::= <выражение> '->' <имя типа> [<описание массива>]
<параметры> ::= <выражение> {','<выражение>}
<элемент массива> ::= <объект>'['<параметры>']'
<поле> ::= [<объект>]'.'<имя поля>
<позднее связывание> ::=<объект>'~' (<имя поля> | <имя метода>'(' [<параметры>] ')')
<вызов функции> ::= (<имя функции> | <выражение>'->'func ) '(' [<параметры>] ')'
<вызов метода> ::= [<объект>]'.'<имя метода>'(' [<параметры>] ')'
<lvalue> ::= <объект> | <имя переменной> | <указатель> | <элемент массива> | <поле>
<операция as> ::= <имя переменной>'as' ((<имя типа>[<описание массива>]) | <объект>)
<операнд> ::= <lvalue> | <константа> | <строка> | <двоичные данные> | <коллекция> | <вызов функции> | <вызов метода> | <имя типа> | <позднее связывание>
<оператор инкремента> ::= '++' | '--'
<оператор присваивания> ::= '=' | '%=' | '&=' | '*=' | '+=' | '-=' | '/=' | '<<=' | '>>=' | '^=' | '|='
<оператор унарный> ::= '+' | '-' | '*' | '!' | '~' | '@'
<оператор бинарный> ::= '==' | '!=' | '>' | '<' | '<=' | '>=' | '&&' | '||' | '&' | '%' | '*' | '/' | '+' | '-' | '<<' | '>>' | '^' | '%==' | '%!=' | '%>' | '%<' | '%<=' | '%>=' | '@'
<оператор> ::= <оператор инкремента> | <оператор присваивания> | <оператор унарный> | <оператор бинарный>
<выр присв> ::= <lvalue><оператор присваивания><выражение>
<выр с lvalue> ::= '&'<lvalue> | '&'<имя функции> | <оператор инкремента><lvalue> | <lvalue><оператор инкремента>
<выражение-вопрос> ::= '?''(' <выражение>',' [<выражение>] ',' [<выражение>] ')'
<выражение> ::= <операнд> | <выр присв> | <выр с lvalue> | <выражение><оператор бинарный> [<конец строки>] <выражение> | '('<выражение>')' | <оператор унарный><выражение> | <операция as> | <выражение-вопрос>
<описание переменной> ::= <имя переменной> ['['<выражение> { [','] <выражение>} ']'] [of <имя типа>]
<перечисление переменных> ::= <описание переменной> ['='<выражение>','<перечисление переменных>] | <описание переменной> [[',']<перечисление переменных>]
<определение переменных> ::= <имя типа><перечисление переменных><конец строки>
<if> ::= if <выражение><блок> {elif <выражение> <блок>} [else <блок>]
<while> ::= while <выражение><блок>
<dowhile> ::= do <блок> while <выражение>
<for> ::= for [<выражение>] ','<выражение>',' [<выражение>] <блок>
<fornum> ::= fornum <имя переменной> ['='<выражение>] ','<выражение><блок>
<foreach> ::= foreach [<имя типа>] <имя переменной> [<описание массива>]','<выражение><блок>
<return> ::= return [<выражение>]
<label> ::= label <имя>
<goto> ::= goto <имя>
<switch> ::= switch <выражение>'{' {case <выражение> {','<выражение>} {<label>} <блок>} [default {<label>} <блок>] '}'
<содержимое блока> ::= <команда блока> {<конец строки><команда блока>}
<блок> ::= '{'<содержимое блока>'}'
<команда блока> ::= {<label>} (<блок> | <выражение> | <определение переменных> | <if> | <for> | <fornum> | <while> | <dowhile> | <foreach> | <switch> | break | continue | <return>)
<описание параметра> ::= <имя переменной> [<описание массива>]
<описание параметров> ::= <имя типа><описание параметра> { [','] <описание параметра>} [<описание параметров>]
<атрибуты> ::= '<'<имя атрибута> { [','] <имя атрибута>} '>'
<подфункция> ::= subfunc [<имя типа>] <имя функции> ['(' [<описание параметров>] ')'] <блок>
<тело функции> ::= '{' (<команда блока> | <подфункция>) <команда блока> {<конец строки> (<команда блока> | <подфункция>) } '}'
<описание функции> ::= func [<имя типа>] <имя функции> [<атрибуты>] ['(' [<описание параметров>] ')']
<func> ::= <описание функции><тело функции>
<описание метода> ::= method [<имя типа>] <имя типа>'.'<имя метода>[<атрибуты>] ['(' [<описание параметров>] ')']
<method> ::= <описание метода><тело функции>
<описание свойства> ::= property [<имя типа>] <имя типа>'.'<имя метода> [<атрибуты>] ['(' [<описание параметров>] ')']
<property> ::= <описание свойства><тело функции>
<описание оператора> ::= operator <имя типа> <оператор> [<атрибуты>] '(' <описание параметров> ')'
<operator> ::= <описание оператора><тело функции>
<описание текст-функции> ::= text <имя функции> [<атрибуты>]['(' [<описание параметров>] ')']
<тело текст-функции> ::= { <элемент конст строки> | '\@'<имя функции>'(' [<параметры>]> | '\('<выражение>')' | '\{'(<команда блока> | <подфункция>) <команда блока> {<конец строки> (<команда блока> | <подфункция>) }'}' }['\!']
<text> ::= <описание текст-функции><конец строки><тело текст-функции>
<определение макроса> ::= <имя макроса> ['=' (<константа>|<имя>) ]
<define> ::= define [<имя>][<атрибуты>] '{'<определение макроса> {<конец строки><определение макроса>} '}'
<выражение с макросами> ::= '$'<имя макроса> | <константа> | '!'<выражение с макросами> | '('<выражение с макросами>')' | <выражение с макросами> ( '&&' | '||' | '==' | '!=' ) <выражение с макросами>
<ifdef> ::= ifdef <выражение с макросами> '{' ... '}' { elif <выражение с макросами> '{' ... '}' } [ else '{' ... '}']
<имя файла> ::= '"' {<стр символ>} '"'
<include> ::= include '{'<имя файла> {<конец строки><имя файла>} '}'
<описание импортируемой функции> ::= [ <имя типа> ] <имя функции> '(' [ <имя типа> { ','<имя типа> } ] ')' [ '->' <имя функции>]
<import> ::= import <имя файла> [<атрибуты>] '{' <описание импортируемой функции> { <конец строки><описание импортируемой функции> } '}'
<описание поля> ::= <описание поля> [<определение массива>]
<описание полей> ::= <имя типа><описание поля> {[','] <описание поля>}<конец строки>
<type> ::= type [<атрибуты>] '{'<описание полей>{<описание полей>} '}'
<определение массива> ::= ['['<натуральное число> { [','] <натуральное число>} ']'] [of <имя типа>]
<описание глоб переменной> ::= <имя переменной> [<определение массива>]['=' <константа> ]
<описание глоб переменных> ::= <имя типа><описание глоб переменной> {[','] <описание глоб переменной>}<конец строки>
<global> ::= global '{' {<описание глоб переменных>} '}'
<public> ::= public
<private> ::= private
<extern> ::= extern '{' {(<описание функции> | <описание метода> | <описание оператора> | <описание свойства> )<конец строки>} '}'
<команда> ::= <define> | <func> | <method> | <text> | <operator> | <property> | <include> | <type> | <global> | <extern> | <import> | <public> | <private> | <ifdef>
<программа> ::= <команда> {<конец строки><команда>}