Есть ли простой способ, которым я могу токенизировать строку без полномасштабного лексера?
-
22-09-2019 - |
Вопрос
Я хочу реализовать Алгоритм шунтирующего двора, но мне нужна помощь, чтобы выяснить, как лучше всего разделить струну на его токены.
Если вы заметили, первый шаг алгоритма - «Читать токен». Это не совсем нетривиальная вещь. Токены могут состоять из чисел, операторов и парен.
Если вы делаете что -то вроде:
(5+1)
Simple String.split () даст мне массив токенов {"(", "5", "+", "1", ")"}.
Тем не менее, это становится более сложным, если у вас есть числа с несколькими цифрами, такими как:
((2048*124) + 42)
Теперь наивная string.split () не поможет. Многозначные числа являются проблемой.
Я знаю, что мог бы написать лексер, но есть ли способ сделать это, не написав полномасштабного лексера?
Я реализую это в JavaScript, и я хотел бы избежать необходимости идти по лексерскому пачению, если это возможно. Я буду использовать операторы "*", "+", "-" и "/", а также целые числа.
Решение
Как насчет регулярных выражений? Вы можете легко написать режиму, чтобы разделить его так, как вы хотите, и метод js string.split принимает также параметр.
Например ... (изменить, чтобы включить все, что вам нужно, и т. Д.)
/([0-9]+|[*+-\/()])/
Другие советы
Вы можете использовать глобальный матч, как описано на http://mikesamuel.blogspot.com/2009/05/effiate-parsing-in-javascript.html
По сути, вы создаете одну регулярность, которая описывает токен
/[0-9]+|false|true|\(|\)/g
и поместите «g» на конец, чтобы он соответствовал глобально, а затем вы называете его метод соответствия
var tokens = myRegex.match(inputString);
И вернуть массив.