2017-01-20 27 views
1

Это мой html.l:C с Bison + Flex Проверка файла для правил

DOC_START  "<html>"|"<HTML>" 
DOC_END   "</html>"|"</HTML>" 
SPACE   " " 
TEXT   . 
%% 
%% 

Это мой html.y:

%{ 
#include "lex.yy.c" 
%} 

%% 
Doc   : DOC_START Other DOC_END 
Other  : TEXT 
      | SPACE 
%% 

Это мой HTML-файл:

<HTML> 
foo bar 
</HTML> 

Я собираю первый файл flex после файла бизонов. Это дает ошибку has no rules. Я хочу проверить, является ли этот файл подходящим html-файлом, как описано в инструкции Doc. И ожидается, что сообщение об ошибке или сообщение должно быть отправлено stdout. Что нам нужно сделать?

+0

Значит, вы не разрешаете '' теги?Конечно, только садистские люди, вероятно, помещают этот тип тега смешанного случая в HTML-файл, но должны ли вы его разрешить? –

+0

@JonathanLeffler, что лучший способ описать его? Вы можете помочь? –

+1

'DOC_START" <[hH] [tT] [mM] [lL]> "'? –

ответ

5

Вы не выполнили спецификацию программы 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-файл (а не их последовательность) вы разрешили только одно пространство или один символ. Если вы не можете решить эту проблему, вам нужно задать еще один вопрос - или еще лучше внимательно прочитать заметки о преподавателях!

+0

Очень _информативный_ и _helpful_ ответ. **Спасибо!** –

 Смежные вопросы

  • Нет связанных вопросов^_^