Использование вложенных макросов в Nearley вкладывает результат данных - PullRequest
0 голосов
/ 30 октября 2018

проблема

На первый взгляд, макросы не могут быть правильно вложены без серьезных ошибок.

Основная проблема заключается в том, что при извлечении значения макроса из объекта данных это значение вкладывается в список:

a[X] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ 'test' ] ]

Ожидаемый результат будет [ 'test' ].

Быстрое решение - вернуть данные [0] [0], но этого недостаточно, потому что результат будет вложен для каждого слоя макроса:

a[X] -> b[$X] {% id %}
b[X] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ [ 'x' ] ] ]

Чтобы исправить ошибку, мы могли бы использовать data => data[0][0] для каждого макроса. Однако это абсолютно безобразно.

Реальным решением было бы использование динамического определения объема. Поскольку мы не можем (насколько мне известно) создать макрос без параметров, давайте использовать бесполезные параметры:

a[X] -> b["_"] {% id %}
b[_] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ 'test' ] ]

Это прекращает вложение ада, которое было раньше - мы могли бы пройти через 500 суб-макросов и все равно получить тот же результат. Но нам все еще нужно поместить data [0] [0] для окончательного под-макроса b, и это мешает нам использовать сам макрос b - мы должны использовать a для его работы.

Мы ищем решение, которое: - Позволяет использовать последний макрос самостоятельно - Избегает использования данных => данных [0] [0]

1 Ответ

0 голосов
/ 30 октября 2018

Раствор

Чтобы избежать проблемы, лучшим решением будет следующее:

a[X] -> b[$X] {% id %}
b[X] -> c[$X] {% id %}
c[X] -> $X {% data => data[0].join('') %}

main -> a["test"] {% id %}

Parse results:
[ 'test' ]

Объяснение

Проблема заключалась в том, что, когда последний суб-макрос получает результат, поскольку nearley по умолчанию рассматривает все как массив, результат вкладывается в массив. Затем каждый слой делает то же самое. Использование метода join в массиве делает его строкой - и каждый макрос перестает помещать его в массив.

...