Есть ли простой способ, которым я могу токенизировать строку без полномасштабного лексера?

StackOverflow https://stackoverflow.com/questions/1590414

Вопрос

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

Если вы заметили, первый шаг алгоритма - «Читать токен». Это не совсем нетривиальная вещь. Токены могут состоять из чисел, операторов и парен.

Если вы делаете что -то вроде:

(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);

И вернуть массив.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top