Вы не выполнили спецификацию программы lex, как показано на странице manual.
Хотя вы указали некоторые регулярные выражения и указали им имена (в разделе определений), вы не сказали lex, что делать, когда он найдет их (в разделе правил, которые вы оставили пустым). Добавить раздел правил, который возвращает маркер, например:
DOC_START "<html>"|"<HTML>"
DOC_END "</html>"|"</HTML>"
SPACE " "
TEXT .
%%
{DOC_START} return DOC_START;
{DOC_END} return DOC_END;
{SPACE} return SPACE;
{TEXT} return TEXT;
%%
Ваш зубр код не specified the tokens that are coming from lex, поэтому вам нужно добавить эти:
%{
#include "lex.yy.c"
%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc : DOC_START Other DOC_END
Other : TEXT
| SPACE
%%
Однако, если вы делаете это таким образом, закон код компилируется перед объявлениями токенов. Чтобы исправить это, поместите включают в нижней части файла:
%token DOC_START DOC_END TEXT SPACE
%%
Doc : DOC_START Other DOC_END
Other : TEXT
| SPACE
%%
#include "lex.yy.c"
Почти там ...
Теперь для вывода сообщения об ошибке, необходимо предоставить код для функции yyerror
. Вы хотели, чтобы выход был достигнут stdout
; мы будем нуждаться в стандартную библиотеку ввода-вывода stdio.h
для этого:
%{
#include <stdio.h>
void yyerror(const char* s);
%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc : DOC_START Other DOC_END
Other : TEXT
| SPACE
%%
void yyerror(const char* s)
{
fprintf(stdout, "Syntax error: %s\n", s);
}
#include "lex.yy.c"
Теперь я замечаю, что ваш компилятор следующий стандарт C99 и выдачи предупреждений на implicit-function-declarations
. Инструменты flex и bison иногда генерируют код, который вызывает эти предупреждения. Это только Предупреждения, а не ошибки и могут быть проигнорированы. Если вы не хотите их видеть, вы можете поместить опцию -ansi
на свою линию компиляции gcc
.
Код теперь будет запущен - я его протестировал.
Если вы получаете ошибки, как главного не определен, вы не предоставили библиотеку YACC (-ly на ССАГПЗ линии), но вы можете просто ввести свою собственную основную программу:
%{
#include <stdio.h>
void yyerror(const char* s);
%}
%token DOC_START DOC_END TEXT SPACE
%%
Doc : DOC_START Other DOC_END
Other : TEXT
| SPACE
%%
void yyerror(const char* s)
{
fprintf(stdout, "Syntax error: %s\n", s);
}
int main (void)
{
return(yyparse());
}
#include "lex.yy.c"
Теперь вы увидите, что он компилируется и запускается, но каждый html-файл даст вам синтаксическую ошибку. Это потому, что ваша грамматика бизона неверна. В html-файл (а не их последовательность) вы разрешили только одно пространство или один символ. Если вы не можете решить эту проблему, вам нужно задать еще один вопрос - или еще лучше внимательно прочитать заметки о преподавателях!
Значит, вы не разрешаете '' теги?Конечно, только садистские люди, вероятно, помещают этот тип тега смешанного случая в HTML-файл, но должны ли вы его разрешить? –
@JonathanLeffler, что лучший способ описать его? Вы можете помочь? –
'DOC_START" <[hH] [tT] [mM] [lL]> "'? –