为 YACC 中的表达式指定两个替代规则
Specifying two alternative rules for an expression in YACC
我正在用 YACC 编写 HTTP header 解析器。由于 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
?
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
是第一行加上 header 的其余部分。我不知道它的名字。)
您输入的是反斜杠而不是回车符 return/line。显然,您将 C 字符串文字复制到其他未实现 C 字符串转义约定的内容中。
我不会使用像 yacc 这样精确的东西来完成这个任务。我不会使用比手写分词器更精确的东西。而且我当然不会将行尾序列中的单个字符呈现给解析器。
我正在用 YACC 编写 HTTP header 解析器。由于 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
?
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
是第一行加上 header 的其余部分。我不知道它的名字。)
您输入的是反斜杠而不是回车符 return/line。显然,您将 C 字符串文字复制到其他未实现 C 字符串转义约定的内容中。
我不会使用像 yacc 这样精确的东西来完成这个任务。我不会使用比手写分词器更精确的东西。而且我当然不会将行尾序列中的单个字符呈现给解析器。