Как добавить интерфейс таблицы символов в лексер на основе boost :: spirit :: lex? - PullRequest
4 голосов
/ 10 августа 2011

Чтобы реализовать поддержку typedef, вам нужно искать таблицу символов, когда лексер идентифицирует идентификатор и возвращает другой токен.Это легко сделать в гибком лексере.Я пытаюсь использовать boost Spirit для создания парсера и искал в примерах, но ни один из них не передает контекстную информацию между лексером и парсером.Что было бы самым простым способом сделать это в примере с учебником по мини-компилятору?

Ответы [ 2 ]

5 голосов
/ 10 августа 2011

Это одинаково легко в Spirit.Lex.Все, что вам нужно, - это возможность вызывать код после сопоставления токена, но перед возвратом токена анализатору.Это лексерные семантические действия:

this->self += identifier[ lex::_tokenid = lookup(lex::_val) ];

, где lex::_tokenid - это заполнитель, ссылающийся на идентификатор токена текущего токена, lex::_val относится к соответствующему значению токена (в этот момент, скорее всего, это iterator_range<>, указывающий на базовый входной поток), и поиск - это ленивая функция (т. Е. Объект функции, такой как phoenix::function), реализующий фактическую логику поиска.

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

1 голос
/ 10 августа 2011

Чтобы реализовать поддержку typedef, вам нужно искать таблицу символов, когда лексер идентифицирует идентификатор и возвращает другой токен.

Разве это не ставит телегу перед лошадью? Цель лексера - взять ввод текста и превратить его в поток простых токенов. Это облегчает определение и обработку синтаксического анализатора, поскольку он не должен обрабатывать низкоуровневые вещи, такие как «это возможные представления типа float» и т. Д.

Языковое сопоставление идентификатора токена с символом (т. Е. Typedef) - это не то, что должен делать лексер. Это то, что происходит на этапе синтаксического анализа или, возможно, даже позже, как пост-процесс абстрактного синтаксического дерева.

Или, другими словами, есть веская причина, по которой qi::symbols является объектом синтаксического анализа, а не лексером. Обращаться с подобными вещами не является делом лексера.

В любом случае мне кажется, что вы хотите создать средство для (в синтаксическом анализаторе ) сопоставления токена идентификатора с объектом, представляющим тип, который был определен как typedef'd , qi::symbols синтаксический анализатор, кажется, способ делать такие вещи.

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