s4g
0.9.2
высокоуровневый, императивный, процедурный, встраиваемый, скриптовый язык программирования общего назначения, написанный на C++.
|
Буква = Aa - Zz
Цифра = 0-9
Идентификатор = ['$'](Буква | '_') {Буква | Цифра | '_'}
Натуральное число = Цифра {Цифра}
Знаковое целое число (или int) = Натуральное число
Беззнаковое целое число (или uint) = Натуральное число[.u]
Число с плавающей запятой (или float) = int.
[ ({[0-9]} | f)]
Символы_строковых_литералов = "Все возможные символы в том числе и экранированные"
Строковые_литералы = ("'" Символы_строковых_литералов "'") | ('"' Символы_строковых_литералов '"')
Оператор_присваивания = Бинарный_оператор_присваивания | Бинарные_арифметические_операторы_с_присваиванием
Операция_присваивания_полная = TLVal Оператор_присваивания TRVal
Операция_присваивания_ограниченная = TLVal Оператор_присваивания TRSVal
Левое_значение = (['var'] Идентификатор) | Обращение_к_полю_класса | Обращение_к_элементу_таблицы | Обращение_к_элементу_массива
Правое_значение = ('(' Выражение ')' | Скаляр | Создание_таблицы | Создание_массива | Определение_анонимной_функции | Создание_объекта_класса | Вызов_функции | Левое_значение)
[Neg | Not] ((Lparen Expr Rparen) | Int | (Function | Lvalue))
Expr: (Lvalue Assign Expr) | (Rvalue [Op Rvalue]*)
var b = (new a()).call();
RVal = [Унарная_инверсия_знака | Унарный_оператор_отрицания] (('(' LValOp ')') | (LVal Call) | Идентификатор)
LVal = (RVal (('.' Идентификатор) | ('[' Выражение ']')))
LValOp = (Унарные_арифметические_операторы_с_присваиванием LVal) | (LVal [Унарные_арифметические_операторы_с_присваиванием])
TRVal = TSRVal | Обьявление_функции | Обьявление_таблицы | Обьявление_массива | Создание_объекта_класса
TLVal = (['var'] Идентификатор) | LVal
TSRVal = Константа | RVal
CLSid = Идентификатор | RVal
Выражение = TRVal {Оператор TRVal}
get_class().foo = bar();
some.foo().bar[5].j = 123;
Call = '(' [Список_выражений] ')'
Константа = int | uint | float | string
Оператор = Бинарные_арифметические_операторы | Бинарные_операторы_сравнения | Бинарные_логические_операторы
Инструкция_блока = Инструкция | Управляющие_конструкции | Оператор_прерывания_цикла | Оператор_игнорирования | Оператор_возврата
Тело_функции = '{' {Инструкция_блока} '}'
Блок = (Тело_функции) | Инструкция_блока
Список_выражений = Выражение {',' Выражение}
Бинарные_арифметические_операторы = '+' | '-' | '*' | '/' | ''
Бинарные_операторы_сравнения = '==' | '<' | '<=' | '>' | '>=' | '!=' | '===' | '!=='
Бинарные_логические_операторы = '&&' | '||'
Бинарный_оператор_присваивания = '='
Унарные_арифметические_операторы_с_присваиванием = '++' | '–'
Бинарные_арифметические_операторы_с_присваиванием = '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '~=' | '^=' | '|=' | '<<=' | '>>='
Унарная_инверсия_знака = '-'
Унарный_оператор_отрицания = '!'
Обьявление_таблицы = '{' (((Операция_присваивания_полная | Обьявление_функции) ';') | Обьявление_класса)'}'
Обьявление_массива = '[' [Список_выражений] ']'
(PARSER_NODE_CLASS_VAR)Переменная_класса = 'var' Идентификатор ';'
(PARSER_NODE_CLASS)Обьявление_класса = 'class' Идентификатор '{' {Переменная_класса | Обьявление_функции | Обьявление_класса} '}' ';'
(PARSER_NODE_FUNCTION)Обьявление_функции = "function" [Идентификатор] "(" [Список_идентификаторов] ")" ["extern" (Идентификатор | Список_идентификаторов)] Тело_функции
Управляющие_конструкции = if | for | while
Идентификатор = (Буква | '_') {Буква | Цифра | '_'}
Создание_объекта_класса = 'new' CLSid [Call]
if = 'if' '(' Инструкция_для_конструкций ')' Блок ['else' Блок]
for = 'for' '(' {Инструкция_для_конструкций ,} ';' Инструкция_для_конструкций ';' Инструкция_для_конструкций ')' Блок
while = 'while' '(' {Инструкция_для_конструкций } ')' Блок
Оператор_прерывания_цикла = "break" [uint] ";"
Оператор_игнорирования = "continue" ";"
Оператор_возврата = "return" Выражение ';'