Лексер в порядке с 123foo и разделит его на два токена.
- Целочисленная константа
- и идентификатор.
Но попробуйте найти часть в синтаксисе, которая позволяет этим двум жетонам сидеть рядом друг с другом. Поэтому я уверен, что лексер генерирует ошибку, когда видит эти два токена.
Обратите внимание, что лексеру не важны пробелы (если вы явно не скажете ему об этом). В этом случае он просто выбрасывает пробел:
[ \t\v\n\f] { count(); } // Throw away white space without looking.
Просто чтобы проверить, что я построил:
wget http://www.lysator.liu.se/c/ANSI-C-grammar-l.html > l.l
wget http://www.lysator.liu.se/c/ANSI-C-grammar-y.html > y.y
Отредактированный файл l.l для остановки в компиляторе с жалобой на необъявленные функции:
#include "y.tab.h"
// Add the following lines
int yywrap();
void count();
void comment();
void count();
int check_type();
// Done adding lines
%}
Создайте следующий файл: main.c:
#include <stdio.h>
extern int yylex();
int main()
{
int x;
while((x = yylex()) != 0)
{
fprintf(stdout, "Token(%d)\n", x);
}
}
Построить это:
$ bison -d y.y
y.y: conflicts: 1 shift/reduce
$ flex l.l
$ gcc main.c lex.yy.c
$ ./a.out
123foo
123Token(259)
fooToken(258)
Да, это разделило его на два токена.