Skip to content

Commit

Permalink
plans
Browse files Browse the repository at this point in the history
  • Loading branch information
maestrow committed May 19, 2021
1 parent 0c76a47 commit 2000293
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions src/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,40 @@
# Step 3
# План

Выделить из парсеров код, который относится к функции комбинатора. После чего, если грамматика содержит рекурсивные правила, то при выполнении функций комбинаторов возникнет бесконечная рекурсия. Чтобы отнее избавиться нужно реализовать мемоизацию для this.expr.
Step4
- поддержка левой рекурсии
- переписать грамматику Ometa с использованием левой рекурсии
- Новый функционал Ometa реализуется на Ometa - bootstrapping

Step
- Поддержка состояния

Step
- Привязка выражений к переменным
- Вызов правил с аргументами

Step
- Сопоставление по шаблону на массивы
- Сопоставление по шаблону при выдове правил на агрументы правила

Step
- Поддержка состояния с откатом

## Привязка выражений к переменным

bind = expr ':' (ident | identArray)
identArray = "[" ident ("," ident)* ']'

Реализовать с помощью внутреннего правила bind.

Во внутреннем правиле rule (внутри функции парсера rule):
- в начале: создаем новую чистую область переменных: `this.scopes.push({})`.
- по завершению очищаем область переменных: `this.scopes.pop()`

Текущая область видимости переменных доступна по `this.scope` (что равно `this.scopes[this.scopes.length-1]`) из любого парсера (parseFn).

Во внутреннем правиле bind записываем в текущий `this.scope` значение переменной.

Использование `this.scope`:
- В предикатах `?predicate`
- В выражении исполнения кода `&method`
- В семантических действиях `expr -> action`

0 comments on commit 2000293

Please sign in to comment.