2016-11-23 47 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。我不会使用比手写标记器更精确的任何东西。而且我绝对不会将行结尾的单个字符呈现给解析器。