在YACC中为表达式指定两个备用规则

时间:2016-11-23 16:50:05

标签: parsing grammar yacc context-free-grammar

我正在YACC中编写HTTP头解析器。由于HTTP请求和响应除了第一行之外具有相同的结构,我希望对它们使用相同的解析器。我单独测试了request_lineresponse_line,它们分别处理HTTP请求和HTTP响应。但是,当我按以下方式组合它们时,http_header仅匹配HTTP请求规则,并在给定HTTP响应syntax error, unexpected t_backslash, expecting t_digit or t_dot or t_token_char or t_sp时引发HTTP/1.1 200 OK\r\nHost: foo.com\r\nConnection: Keep-alive\r\n\r\n。如何start_line匹配request_lineresponse_line

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的意思是第一行加上其余的标题。我不知道它的名字。)

1 个答案:

答案 0 :(得分:0)

你正在给它一个反斜杠而不是一个回车/换行。显然,您将C字符串文字复制到其他未实现C字符串转义约定的内容中。

我不会为此任务使用像 yacc 这样精确的东西。我不会使用比手写的标记器更精确的东西。而且我肯定不会从行序列的末尾向解析器呈现单个字符。