Написание токенизатора, с чего начать? - PullRequest
0 голосов
/ 07 мая 2011

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

Я посмотрел на Boost.Tokenizer, и это кажется хорошим, но это мне не помогает. Конечно, это хорошая оболочка для токенизатора, но проблема заключается в написании разделителя токенов, TokenizerFunction в терминах Boost.

Я понятия не имею, как написать этот токенизатор, есть ли "аккуратные" способы сделать это, например, что-то, что очень напоминает сам синтаксис ?

Обратите внимание, я не ищу парсер! Моему приложению не нужно уметь понимать CSS, просто прочитайте файл CSS в общий внутренний формат токенов, обработайте некоторые вещи и выведите снова.

Ответы [ 2 ]

4 голосов
/ 07 мая 2011

Написание «правильного» лексера и / или парсера сложнее, чем вы думаете.И это может стать уродливым, когда вы начнете иметь дело со странными угловыми случаями.

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

Я Old Fart® и использую lex / yacc (или вещи, которые используют тот же синтаксис) для этого типа проекта.Я впервые научился использовать их еще в начале 80-х, и это вернуло усилия, чтобы выучить их много, много раз.

Кстати, если у вас есть что-то приближающееся к BNF языка, lex / yacc можетсмехотворно легко работать.

0 голосов
/ 07 мая 2011

Повышение . Дух . Ци будет моим первым выбором.

Spirit.Qi разработан, чтобы быть практичныминструмент разбора.Возможность генерировать полностью работающий синтаксический анализатор из формальной спецификации EBNF, встроенной в C ++, значительно сокращает время разработки.Программисты обычно используют синтаксический анализ с помощью примитивных инструментов, таких как scanf.Даже библиотеки регулярных выражений (такие как boost regex) или сканеры (такие как Boost tokenizer) плохо масштабируются, когда нам нужно написать более сложные парсеры.Попытка написать даже средне сложный синтаксический анализатор с использованием этих инструментов приводит к коду, который трудно понять и поддерживать.

Учебники Qi даже заканчиваются реализацией синтаксического анализатора для языка XML;Написание грамматики для CSS должно быть значительно проще.

...