Обычно комментарии обрабатываются лексером и не передаются парсеру.Если ваш язык действительно C-подобен, то в большинстве случаев перевод строки должен рассматриваться как любой другой пробел.Комментарии и цитируемые строки являются заметными исключениями.Строки в кавычках обычно перехватываются лексером с использованием начальных состояний и передаются в целое анализатора.
Ваш гибкий код использует слишком много наборов символов.Вам не нужно делать набор, если вы хотите соответствовать только одному конкретному персонажу;просто поместите персонажа, с обратной косой чертой, если это необходимо.Кроме того, .
означает любой не символ новой строки.
Кроме того, у вас нет определения для name_of_program
токена.Предполагая, что это идентификатор в стиле C, вы можете объявить шаблон идентификатора и токен в flex и передать его в bison.
Наконец, вы можете принять соглашение об именовании, заключающееся в использовании всех заглавных букв для токенов, передаваемых вбизон от flex и строчные буквы для токенов, используемых внутри бизона.
Итак, из того, что вы описали, у меня есть следующее:
example.l:
%%
\%.* /* comment */
\n { return T_NEWLINE; }
\' { return T_QUOTE; }
PROGRAM { return T_PROGRAM; }
[A-Za-z_][A-Za-z0-9_]* { yylval.id = yytext; return T_IDENTIFIER; }
%%
example.y:
%%
programma: T_PROGRAM T_IDENTIFIER T_NEWLINE function STARTMAIN dec_var command ENDMAIN eof;
text:
| name text
| digit text;
%%
Я не уверен, что вам нужен токен eof
.
Надеюсь, это поможет.