Для парсера необходимо записать грамматику в виде <определение> = [ составляющие ]. Составляющие это последовательность из частей, каждая из которых имеет вид [ имя тип ], где имя это имя аттрибута в вершине дерева вывода, а тип может быть одним их двух:
- Часть Regex
Регулярное выражение - Определение
Любое другое (или текущее для рекурсии) определение
Заметим что одному определению может быть сопоставлено несколько составляющих.
Рассмотрим на примере:
variableName = [_ r '^(?<name>[0-9a-zA-Z_]+)']
variable = [_ p variableName] [_ r '^\s*=\s*'] [entry p expression]
Для текста 'pi = 3' дерево вывода будет (с учетом всей грамматики ORsharp):
{variableName: {name: 'pi'}, entry: {number: '3'}}
Для входного текста задано определение (для языка ORsharp это funcBody) под которое парсер пытается подогнать выражение. Парсер пытается разворачивать составляющие (определяя размер каждой части) и разворачивая с помощью этой информации остальные части. Если парсер находит путь которым это можно сделать, парсинг считается успешным.