С ++ сканер (строка-фу!) - PullRequest
       21

С ++ сканер (строка-фу!)

2 голосов
/ 29 января 2009

Я пишу сканер как часть компилятора.

У меня сильная головная боль при попытке написать одну часть:

Мне нужно иметь возможность анализировать поток токенов и вставлять их один за другим в вектор, игнорируя пробелы и маркируя специальные символы (простой случай, давайте просто рассмотрим скобки и скобки)

Пример: int main(){ }

должен разбираться на 6 разных токенов:

  1. int
  2. основной
  3. (
  4. )
  5. {
  6. }

Как бы вы решили это? Я пишу это на C ++, но также было бы желательно получить решение на Java / C #.

Некоторые баллы:

  1. и нет, я не могу использовать Boost, я не могу гарантировать, что библиотеки будут доступно для меня. (не спрашивай ...)

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

Ответы [ 6 ]

6 голосов
/ 29 января 2009

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

3 голосов
/ 29 января 2009

Зачем писать свой - посмотрите на Лекса.

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

Сама проблема не сложная. Если вы не можете решить это, вы должны быть сожжены, вам просто нужен отдых. Посмотри на это снова утром.

3 голосов
/ 29 января 2009

Купите копию Компиляторы: принципы, методы и инструменты (Книга Дракона). То, что вы пытаетесь написать - это лексер, а не «сканер».

2 голосов
/ 29 января 2009

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

В этот момент у вас появится хорошее представление о проблеме.

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

1 голос
/ 29 января 2009

Если вы хотите написать это с нуля, вы можете заняться написанием конечного автомата (состояния в enum, большой блок switch / case для переключения состояний). Вы должны поместить состояние в стек, поскольку все может быть вложенным.

Я знаю, что это не идеальный метод; Я просто пытаюсь напрямую ответить на вопрос.

1 голос
/ 29 января 2009

ммм .. Я бы просто сделал цикл while с итераторами, проверяющими каждый символ на тип, и изменял только альфа на не альфа, дамп строки, если она не пустая. если это не символ альфа, не пробел, я просто поместил бы его в стек токенов, это действительно тривиальная задача анализа. Стреляй, я собирался выучить lexx / yacc, но уровень парсинга, который тебе нужен, действительно легкий. Однажды я написал HTML-токенайзер, более сложный, чем этот ... Я имею в виду, что вы просто ищете имена, пробелы и одиночные не буквенно-цифровые символы ... просто сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...