Настройка сквозного правила в зубрах - PullRequest
1 голос
/ 06 марта 2012

У меня есть парсер, сгенерированный с использованием Flex / Bison - он анализирует каждую строку файла и возвращает некоторые выходные данные для этой строки.Мои входные данные немного повреждены, и я хотел бы добавить специальный символ (например, #) в начало строк, которые я бы хотел, чтобы бизон игнорировал, и просто повторил строку в вывод.

Так что, если мой ввод выглядел как

apples 3 ate
oranges 4 consumed
# rhino ten

, мой вывод после анализа строк мог бы быть

I ate three apples
I consumed four oranges
# rhino ten

Есть ли какой-нибудь простой способ сделать это?

1 Ответ

3 голосов
/ 06 марта 2012

Вы можете сделать это лексически в гибком сканере.

Что-то вроде:

^#.*\n   { fputs(yytext, stdout); /* increment line number */ }

Или в парсере:

^#.*\n   { yystype.lexeme = strdup(yytext);
           return HASH_ECHO; /* token type defined in parser */ }

В парсере просто сгенерируйте из вашей грамматики высшего уровня производство для этого:

/* in top section */
%union {
   /* ... */
   char *lexeme;
   /* ... */
}

%token<lexeme> HASH_ECHO
/*...*/

/* make sure this rule is hooked into your grammar, of course */
hash_echo : HASH_ECHO { fputs($1, stdout); free($1); }
          ;

Не уверен насчет включения этой новой строки; Я понятия не имею, как вы справляетесь с этим. Так что это может быть неуместно.

...