Как написать собственный парсер для (f) lex? - PullRequest
2 голосов
/ 24 ноября 2010

Я сгенерировал с помощью flex лексера.

[ \t\n\r\v]          /* skip whitespace */

[_a-zA-Z]([_a-zA-Z]|[0-9])*  printf("IDENT\n");
[0-9]+        printf("INTEGER\n");
[0-9]+\.      printf("DOUBLE\n");

Теперь я хочу написать свой собственный анализатор на C, но я не знаю, как получить токены от лексера. Нужно ли включать "lexer.c" в вызов yylex ()? Затем я должен возвращать типы enum вместо вызова printf (). Каков наилучший способ сделать это без использования bison / yacc?

1 Ответ

1 голос
/ 25 ноября 2010

Вам нужно будет расширить эту грамматику, прежде чем вы закончите, но ...

  • Да, вы замените операторы printf() соответствующими return утверждениями
  • (Или, что более вероятно / лучше, сохраните операторы печати и добавьте операторы возврата).
  • Вы заключите действия в скобки '{ ... }'.
  • Вам нужно будет подумать, каксобираемся передать тип токена и значение токена обратно в ваш анализатор.

Стандартный способ - вернуть тип токена из yylex() - функции, сгенерированной Flex.Существует глобальная переменная ylval, которая может использоваться для передачи значения токена.Вы можете контролировать его тип.Обратите внимание, что где-то по пути вам нужно будет указать номера токенов (типы токенов).Это может быть перечисление или серия #defines.Классически информация предоставляется лексическому анализатору парсером.То есть Yacc предоставляет список номеров токенов, которые он ожидает использовать, и Flex использует эти номера (или, точнее, вы используете эти числа в операторах возврата в коде, сгенерированном Flex).

Чтобы получить токены от лексера к вашему парсеру, вам нужно позвонить yylex();вы обычно компилируете это отдельно от вашего парсера, хотя, возможно, вы могли бы включить его сгенерированный источник в свой файл парсера, если вы действительно этого хотите.

...