Как написать файл зубров, чтобы автоматически использовать список перечисления токенов, определенный в заголовочном файле C? - PullRequest
2 голосов
/ 22 января 2010

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

// C++ header file
enum token_id {
  TokenType1         = 0x10000000,
  TokenType2         = 0x11000000,
  TokenType3         = 0x11100000,
  //... and the list go on with about 200/300 line
};

Я много раз просматривал документацию по бизонам, но я не мог найти лучшего решения, чем копирование каждого токена в файле Bison, например:

/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...

Если мне придется делать это таким образом, поддерживать файл будет довольно сложно, если спецификация другого модуля изменится (что случается довольно часто).

Не могли бы вы сказать мне, как это сделать, или указать мне правильное направление (любая идея / комментарий приветствуется). Это очень помогло бы мне! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 января 2010

Вместо того, чтобы делать:

/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...

Вам просто нужно включить файл с типом токена в часть объявления

#include "mytoken_enum.h"
// ...
%token TokenType1
%token TokenType2
%token TokenType3 
//...

РЕДАКТИРОВАТЬ: Это не может быть сделано:

Как видно из чисел выше, Бизон просто нумерует токены последовательно, и это используется смещено в таблицах поиска парсера как индексы, для скорости просто. Так что Бизон не поддержать это, я уверен, и это было бы нелегко соответствовать Модель реализации.

Просто нужно обернуть, чтобы преобразовать настоящий токен в токен yacc / bison (например, через yylex ())

0 голосов
/ 22 января 2010

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

select token_name, '=' token_number ','
    from token_table

select '%token ', token_name, ' ', token_number
    from token_table

Первый из них потребует немного массажа, например, добавление enum token_id {"в начало и"}; "в конец, но вы поймете общую идею. Конечно, есть много альтернатив - - XML, CSV и т. Д., Но общая идея остается той же: хранить и редактировать как можно ближе к необработанным данным, а также автоматизировать добавление дополнительных «материалов», необходимых для поддержания работы инструментов.

...