2016-11-23 7 views
-1

Я пишу парсер HTTP-заголовка в YACC. Поскольку HTTP-запрос и ответ имеют одинаковую структуру, кроме первой строки, я надеюсь использовать для них один и тот же парсер. Я индивидуально тестировал request_line и response_line, и они работают на HTTP-запрос и HTTP-ответ соответственно. Однако, когда я их объединяю следующим образом, http_header отвечает только правилам HTTP-запросов и вызывает syntax error, unexpected t_backslash, expecting t_digit or t_dot or t_token_char or t_sp при ответе на HTTP HTTP/1.1 200 OK\r\nHost: foo.com\r\nConnection: Keep-alive\r\n\r\n. Как я могу сделать start_line матч request_line или response_line?Задание двух альтернативных правил для выражения в YACC

0 $accept: request $end 

1 allowed_char_for_token: t_token_char 
2      | t_digit 
3      | t_dot 

4 token: allowed_char_for_token 
5  | token allowed_char_for_token 

6 allowed_char_for_text: allowed_char_for_token 
7      | t_separators 
8      | t_colon 
9      | t_backslash 

10 text: allowed_char_for_text 
11  | text ows allowed_char_for_text 

12 ows: %empty 
13 | t_sp 
14 | t_ws 

15 t_number: t_digit 
16   | t_number t_digit 

17 request_line: token t_sp text t_sp text t_crlf 

18 response_line: text t_sp t_number t_sp text t_crlf 

19 header: token ows t_colon ows text ows t_crlf 

20 headers: header 
21  | header headers 

22 start_line: request_line 
23   | response_line 

24 http_headers: start_line headers t_crlf 

(Мои извинения за путаницу имен. То, что я имею в виду http_head является первой линией плюс остальные заголовки. Я не знаю, как назвать это.)

+0

Вы должны предоставить нам больше грамматики, чтобы помочь диагностировать проблему. Ваша жалоба включает «t_backslash», но вы не указали нам правила lexer/grammar, которые ее производят. –

+0

@IraBaxter Обновлено исходное сообщение. Ошибка «неожиданной обратной косой черты» происходит от yacc, пытаясь проанализировать response_line как request_line. Я планировал совпадение шаблонов в первой строке и обрабатывал его как request_line, если он соответствует правилам request_line и как response_line, если соответствует правилам строки ответа. Однако в настоящее время он применяет только правила request_lien и вызывает ошибку, если не соответствует. – user274602

+1

Почему вы кормите его обратной косой чертой? Вы должны кормить его настоящим возвратом каретки и реальной подачей линии, а не обратной косой чертой. – EJP

ответ

0

Вы кормите его обратная косая черта вместо возврата каретки/линии. Очевидно, вы скопировали литерал строки C во что-то еще, что не реализует соглашения об экранировании строки C.

Я бы не использовал что-то точное, как yacc для этой задачи. Я бы не использовал ничего более точного, чем рукописный токенизатор. И я бы, конечно, не представил отдельные символы от конца строки к парсеру.