Определить комментарий и цитату в флексах и бизонах и лексических ошибках - PullRequest
2 голосов
/ 11 сентября 2010

Мне нужно создать лексический и синтаксический анализатор для с-подобного языка.На этом языке мы определяем как комментарий «все, что существует после символа% до конца строки».Верны ли следующие объявления?

Flex
...
[%][^\n]*[\n]  { return T_COMMENT; }
[\n]   { return T_NEWLINE; }

Bison
...
comment:com text newline;
text: |name text|digit text;

...
com: T_COMMENT   { printf("%s",yytext); };
newline: T_NEWLINE  { printf("%s",yytext); };

Мне также нужно определить символ кавычки ". Правильно ли следующее (flex)?

"\""   { return T_QUOTE; }

В flex нет ошибки компиляциии входные файлы бизонов, но когда я использую программу, написанную на этом с-подобном языке, в качестве тестового ввода, я получаю в результате лексическую ошибку в строке 1. В этой строке нет лексической ошибки. Моя программа должна начинаться так:PROGRAM name_of_program и компиляторная новая строка. Я делаю следующие объявления: Flex

"PROGRAM"  { return T_PROGRAM; }

Bison

%start programma
%token T_PROGRAM
...
programma:PROGRAM name newline function STARTMAIN dec_var command ENDMAIN eof;
...
PROGRAM: T_PROGRAM  { printf("%s",yytext); };
...

(слова в верхнем регистре определяются как PROGRAM, поскольку они являются частью языка)Я что-то не так пишу? Думаю, проблема в определении новой строки, но я не уверен.

Заранее благодарю за любой ответ. Извините за длинный пост.

1 Ответ

2 голосов
/ 12 сентября 2010

Обычно комментарии обрабатываются лексером и не передаются парсеру.Если ваш язык действительно 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.

Надеюсь, это поможет.

...