2016-11-23 54 views
-1

我正在YACC中編寫HTTP頭分析器。由於HTTP請求和響應除第一行外都具有相同的結構,所以我希望對它們使用相同的解析器。我個別測試了request_lineresponse_line,它們分別處理HTTP請求和HTTP響應。但是,當我按照以下方式組合它們時,http_header只與HTTP請求規則匹配,並在給出HTTP響應HTTP/1.1 200 OK\r\nHost: foo.com\r\nConnection: Keep-alive\r\n\r\n時引發syntax error, unexpected t_backslash, expecting t_digit or t_dot or t_token_char or t_sp。我如何使start_line匹配request_lineresponse_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_backlash」,但你沒有向我們展示產生它的詞法/規則。 –

+0

@IraBaxter更新了原來的帖子。 「意外反斜槓」錯誤來自yacc嘗試將response_line解析爲request_line。我的目標是在第一行模式匹配,並將它作爲request_line處理,如果它匹配request_line規則,並且如果匹配響應行規則則作爲response_line處理。但是目前它只適用於request_lien規則,如果不匹配會引發錯誤。 – user274602

+1

你爲什麼給它一個反斜槓?你應該給它一個真正的回車和一個真正的換行符,而不是反斜槓。 – EJP

回答

0

你餵養它反斜槓而不是回車/換行符。很明顯,您將C字符串文字複製到其他不執行C字符串轉義約定的其他字符中。

對於這個任務,我不會使用精確的東西yacc。我不會使用比手寫標記器更精確的任何東西。而且我絕對不會將行結尾的單個字符呈現給解析器。