我正在YACC中編寫HTTP頭分析器。由於HTTP請求和響應除第一行外都具有相同的結構,所以我希望對它們使用相同的解析器。我個別測試了request_line
和response_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_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
的意思是第一行加上頭的其餘部分。我不知道它的名稱的。)
您需要爲我們提供更多的語法來幫助診斷問題。你的投訴包括一個「t_backlash」,但你沒有向我們展示產生它的詞法/規則。 –
@IraBaxter更新了原來的帖子。 「意外反斜槓」錯誤來自yacc嘗試將response_line解析爲request_line。我的目標是在第一行模式匹配,並將它作爲request_line處理,如果它匹配request_line規則,並且如果匹配響應行規則則作爲response_line處理。但是目前它只適用於request_lien規則,如果不匹配會引發錯誤。 – user274602
你爲什麼給它一個反斜槓?你應該給它一個真正的回車和一個真正的換行符,而不是反斜槓。 – EJP