Приложение 1. Полный синтаксис языка в форме Бэкуса-Наура.
<программа>::=[<глобальное_описание>] 'void main(){'[<локальное_описание>] <оператор> '}'
<глобальное_описание>::={<описание_константы>|<описание_переменной>}
<описание_константы>::='const'<описание_простой_константы>||'const'
<описание_вектора_константы>
<описание_простой_константы>::=[<простой_тип>]<идентификация_простой_константы>
{','<идентификация_простой_константы>}';'
<идентификация_простой_константы>::=<идентификатор>'='<арифметическое_выражение>
<описание_вектора_константы>::='vector'<идентификация_вектора_константы>{','
<идентификация_вектора_константы>}';'
<идентификация_вектора_константы>::=<идентификатор>'['<целое_без_знака>']={'
<арифметическое_выражение>{','<арифметическое_выражение>}'}'
<описание_переменной>::=<описание_простой_переменной>|
|<описание_переменной_вектора>
<описание_простой_переменной>::=<простой_тип><идентификация_простой_переменной>
{','<идентификация_простой_переменной>}';'
<идентификация_простой_переменной>::=<идентификатор>['='
<арифметическое_выражение>]
<описание_переменной_вектора>::='vector'<идентификация_переменной_вектора>
{','<идентификация_переменной_вектора>}';'
<идентификация_переменной_вектора>::=<идентификатор>'['[<целое_без_знака>]']'['={'<арифметическое_выражение>{','<арифметическое_выражение>}]
<локальное_описание>::={<описание_константы>|<описание_переменной>}
<простой_тип>::='int'|'float'
<идентификатор>::=<буква> {<буква>|<цифра>}
<буква>::='_'|'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|
|'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'
<цифра>::='0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
<арифметическое_выражение>::=[<знак>]<терм>|<арифметическое_выражение><знак><терм>
<терм>::=<множитель>|<терм><*_или_/><множитель>
<*_или_/>::='*'|'/'
<множитель>::='('<арифметическое_выражение>')'|<константа>|<оператор_длина_вектора>|<переменная>|<логическое_выражение>
<константа>::=<константа_без_знака>
<знак>::='+'|'-'
<константа_без_знака>::=<имя_константы>|<число_без_знака>
<имя_константы>::=<идентификатор>
<число_без_знака>::=<целое_без_знака>['.'<целое_без_знака>]['E'<знак>
<целое_без_знака>]
<целое_без_знака>::=<цифра>{<цифра>}
<оператор>::=[<метка>':']<непомеченный_оператор>
<метка>::=<идентификатор>
<непомеченный_оператор>::='{' {<оператор>} '}'|';'|<оператор_присваивания> |<условный_оператор>|<оператор_вывода>|<оператор_ввода>|<оператор_цикла>
|<оператор_безусловного_перехода>
<переменная>::=<идентификатор>|<оператор_элемента_вектора>
<оператор_присваивания>::=<переменная>{'='<переменная>}'='<арифметическое_выражение>';'
<условный_оператор>::='if('<условное_выражение>')'<оператор>
['else'<оператор>]
<оператор_вывода>::='printf('<сообщение>| {','<сообщение>} ');'
<сообщение>::={<строка>|<арифметическое_выражение>}
<строка>::=' " '{<символ>}' " '
<символ>::=<любой_символ>
<оператор_ввода>::='scanf(' <идентификатор> {','<идентификатор>} ');'
<оператор_цикла>::='for(' [<оператор_присваивания> {','<оператор_присваивания>} ] ';' [<условное_выражение> {',<условное_выражение>' } ] ';'[<оператор_присваивания> {','<оператор_присваивания>} ] ')' <оператор>';'
<оператор_безусловного_перехода>::='goto' <метка>';'
<оператор_длина_вектора>::='length('<арифметическое_выражение>')'
<оператор_элемента_вектора>::=<идентификатор>'['
<арифметическое_выражение>']'
<условное_выражение>::=<условное_выражение>'||'<конъюнкция>|
<конъюнкция>
<конъюнкция>::=<конъюнкция>'&&'<выражение>|<выражение>
<выражение>::='!'<выражение>|'('<условное_выражение>')'|<выражение>
<логическая_операция><условное_выражение>|<условное_выражение>
<логическая_операция>::='>'|'<'|'=='|'!='|'>='|'<='
Описание лексического анализатора.
Вход лексического анализатора: последовательность литер.
Выход лексического анализатора: последовательность лексем. Каждая лексема состоит из двух полей:
поле, хранящее класс лексемы.
поле, хранящее номер лексемы внутри класса.