@Pointy Мне наконец-то удалось создать свой собственный парсер, используя ссылку, которую я разместил выше. Думать, что я могу использовать это для разбора самого Javascript, - это просто ошеломительно и было действительно весело! Спасибо !

ебята, спасибо за чтение

В настоящее время я пытаюсь сделать калькулятор в стиле Google. Вы вводите строку, она определяет, может ли она быть рассчитана, и возвращает результат.

Я начал медленно с основ:+ - / * и обработка скобок.

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

Этот вид работы легко применим с такими языками, как Lex и Yacc, за исключением того, что я разрабатываю приложение только для Javascript.

Я пытался перевести эту идею в Javascript, но я не могу понять, как обращаться со всем чистым и красивым способом, особенно с вложенными скобками.

Анализ

Давайте определим, что такое запрос калькулятора:

// NON TERMINAL EXPRESSIONS //
query     -> statement
query     -> ε // means end of query

statement -> statement operator statement
statement -> ( statement )
statement -> prefix statement
statement -> number

number    -> integer
number    -> float

// TERMINAL EXPRESSIONS //
operator  -> [+*/%^-]

prefix    -> -

integer   -> [0-9]+

float     -> [0-9]+[.,][0-9]+
Javascript

Лексический анализ состоит в проверке того, что нет ничего, что не похоже на одно из терминальных выражений: оператор, префиксы, целое число и число с плавающей точкой. Который может быть сокращен до одного регулярного выражения:

(Я добавил пробелы, чтобы сделать его более читабельным)

var calcPat = 
/^ (\s*
    ( ([+/*%^-]) | ([0-9]+) | ([0-9]+[.,][0-9]+) | (\() | (\)) )
)+ \s* $/;

Если этот тест пройден, запрос является лексически правильным и нуждается в проверке грамматики, чтобы определить, можно ли его вычислить.Это сложная часть

Я не собираюсь вставлять код, потому что он не чистый и не понятный, но я собираюсь объяснить процесс, которому я следовал, и почему я застрял:

Я создал метод под названиемisStatement(string) это должно называть себя рекурсивно. Основная идея состоит в том, чтобы разбить строку на «потенциальные» операторы и проверить, действительно ли они являются операторами и образуют ли они вообще.
Процесс следующий:

-Если первые два токена являются числом, за которым следует оператор:

-Затем,
- Если оставшийся - только один токен и это число:
--- Тогда это утверждение.
--- Иначе, проверьте, формируют ли остальные токены оператор (рекурсивный вызов)

-Если же, если первый токен - это скобка
Затем найдите соответствующую закрывающую скобку и проверьте, является ли внутри оператор (рекурсия)
- Также проверьте, есть ли что-то после закрывающей скобки и формирует ли он выражение, когда связано со структурой скобок.

В чем проблема ?

Моя проблема в том, что я не могу найти соответствующие скобки, когда есть вложенные структуры.Как я могу это сделать ? Кроме того, как вы можете видеть, это не совсем общий и чистый алгоритм проверки грамматики. Есть ли у вас идеи улучшить этот шаблон?

Большое спасибо, что нашли время, чтобы прочитать все. гэл

(PS: Как вы, наверное, заметили, я не являюсь носителем английского языка! Извините за ошибки и все!)

Ответы на вопрос(1)

Ваш ответ на вопрос