Skip to content

Latest commit

 

History

History
19 lines (14 loc) · 1.75 KB

File metadata and controls

19 lines (14 loc) · 1.75 KB

Парсер грамматики

Для парсера необходимо записать грамматику в виде <определение> = [ составляющие ]. Составляющие это последовательность из частей, каждая из которых имеет вид [ имя тип ], где имя это имя аттрибута в вершине дерева вывода, а тип может быть одним их двух:

  • Часть 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) под которое парсер пытается подогнать выражение. Парсер пытается разворачивать составляющие (определяя размер каждой части) и разворачивая с помощью этой информации остальные части. Если парсер находит путь которым это можно сделать, парсинг считается успешным.