Привет, ребята, спасибо за чтение
В настоящее время я пытаюсь выполнить калькулятор в стиле 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
Лексический анализ состоит в проверке, что нет ничего, что не похоже на одно из терминальных выражений: operator, prefixes, integer и float. Который может быть сокращен до одного регулярного выражения:
(Я добавил пробелы, чтобы сделать его более читаемым)
var calcPat =
/^ (\s*
( ([+/*%^-]) | ([0-9]+) | ([0-9]+[.,][0-9]+) | (\() | (\)) )
)+ \s* $/;
Если этот тест проходит, запрос лексически корректен и должен быть проверен грамматикой, чтобы определить, можно ли его вычислить. Это сложная часть
Я не собираюсь вставлять код, потому что он не чист и не понятен, но я собираюсь объяснить процесс, за которым я последовал, и почему я застрял:
Я создал метод под названием isStatement(string)
, который должен был называть себя рекурсивно. Основная идея состоит в том, чтобы разбить строку на "потенциальные" операторы и проверить, действительно ли они являются утверждениями и образуют их вообще.
Процесс следующий:
-Если первые два токена представляют собой число, за которым следует оператор:
-Тогда,
- Если остальное - всего лишь один токен, и это число:
--- Тогда это утверждение.
--- Else, проверьте, если остальные токены образуют оператор (рекурсивный вызов)
-Else, если первый токен - это скобка
-Тогда найдите подходящую закрывающую скобку и проверьте, что внутри внутри есть оператор (рекурсия)
- Также проверьте, есть ли что-то после закрытия скобки, и если оно формирует оператор, связанный со структурой скобок.
В чем проблема?
Моя проблема в том, что я не могу найти соответствующие скобки, когда есть вложенные структуры. Как я могу это сделать? Также, как вы можете видеть, это не особый общий и чистый алгоритм проверки грамматики. У вас есть идея улучшить этот шаблон?
Большое вам спасибо за то, что потратили время на все. Гаэль
(PS: Как вы, наверное, заметили, я не являюсь носителем английского языка! Извините за ошибки и все!)