Как преобразовать строку в объект AST с помощью Javascript? - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно преобразовать строку в объект (например, AST), подчиняющийся правилам определенной грамматики.

У меня в основном есть 3 типа выражений ('@', '$' and '#').Выражения типа '#' записываются как #something, а два других - как @something==somethingelse и $something==somethingelse.

. Эти выражения можно группировать с помощью конъюнкций ('and', 'or') и порядкаоперации могут быть изменены с помощью скобок.

Вот пример полного выражения:

const expression = 
     `#buy
      && (@car == white || @bike == blue)
      && $user==authenticated`;

Я ищу способ преобразовать это в объект (как AST) ниже, используя javascript или инструмент, основанный на javascript(будет использоваться в проекте React).

const ast = {
    type: 'expression',
    conjunction: 'null',
    expressions: [{
            type: 'expression',
            conjunction: null,
            expressions: [{
                type: '#',
                left: 'buy',
                operator: null,
                right: null
            }]
        },
        {
            type: 'expression',
            conjunction: '&&',
            expressions: [{
                    type: 'expression',
                    conjunction: 'null',
                    expressions: [{
                        type: '@',
                        left: 'car',
                        operator: '==',
                        right: 'white'
                    }]
                },
                {
                    type: 'expression',
                    conjunction: '||',
                    expressions: [{
                        type: '@',
                        left: 'bike',
                        operator: '==',
                        right: 'blue'
                    }]
                }
            ]
        },
        {
            type: 'expression',
            conjunction: '&&',
            expressions: [{
                type: '$',
                left: 'user',
                operator: '==',
                right: 'authenticaded'
            }]
        }
    ]
};

1 Ответ

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

Хотя в вашей ситуации будут присутствовать нюансы, и, хотя это звучит очевидно, это может помочь разбить проблему на более управляемые куски.

Одним из кусочков этой проблемы будет разбор и последующий токенизация строк вашего выражения.Начните с написания кода, который может принимать строку типа #something и превращать ее в промежуточную структуру данных, которую впоследствии можно использовать для выполнения более конкретных задач, связанных с построением AST.Идея заключается в том, что вы хотите заключить «Самую простую вещь, которая может быть возможна» в черный ящик, который позволяет вам постепенно, надежно улучшать / изменять / добавлять функциональность.Постарайтесь сначала не перегружать себя, а только добавить функциональность, относящуюся к текущей задаче, чтобы не попасть в ловушку паралича анализа.

После того, как вы выполнили некоторую итерацию на этапе токенизации, выможет начать думать о следующем этапе, который является реализацией Visitor / Walker для вашего AST.Я уверен, говоря, что ваш дизайн будет развиваться по мере прохождения этого процесса, поэтому очень важно, чтобы вы разработали свой код для изменений - который должен включать тестируемость в качестве основного соображения.

Хотя это не javascript, этот проект на основе C # / Roslyn (полное раскрытие: я автор / сопровождающий этих репозиториев) довольно близко демонстрирует типы функциональности, о которых вы спрашиваете,НТН

...