Parsing 为YACC中的表达式指定两个可选规则

Parsing 为YACC中的表达式指定两个可选规则,parsing,grammar,yacc,context-free-grammar,Parsing,Grammar,Yacc,Context Free Grammar,我正在用YACC编写一个HTTP头解析器。由于HTTP请求和响应除了第一行之外具有相同的结构,所以我希望对它们使用相同的解析器。我分别测试了请求行和响应行,它们分别处理HTTP请求和HTTP响应。但是,当我以以下方式组合它们时,http\u header仅匹配http请求规则,并引发语法错误、意外的t\u反斜杠,在给定http响应http/1.1200 OK\r\nHost:foo.com\r\n连接:Keep alive\r\n\r\n时,应为t\u digit或t\u dot或t\u tok

我正在用YACC编写一个HTTP头解析器。由于HTTP请求和响应除了第一行之外具有相同的结构,所以我希望对它们使用相同的解析器。我分别测试了
请求行
响应行
,它们分别处理HTTP请求和HTTP响应。但是,当我以以下方式组合它们时,
http\u header
仅匹配http请求规则,并引发语法错误、意外的t\u反斜杠,在给定http响应
http/1.1200 OK\r\nHost:foo.com\r\n连接:Keep alive\r\n\r\n
时,应为t\u digit或t\u dot或t\u token\u char或t\u sp。如何使
开始行
请求行
响应行
匹配

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

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


对于这个任务,我不会使用像yacc这样精确的东西。我不会使用任何比手写标记器更精确的东西。当然,我不会将行尾序列中的单个字符呈现给解析器。

您需要向我们提供更多语法来帮助诊断问题。您的投诉中包含一个“t_反斜杠”,但您没有向我们展示产生它的词法/语法规则。@IraBaxter更新了原始帖子。“意外反斜杠”错误来自yacc试图将响应行解析为请求行。我打算在第一行进行模式匹配,如果匹配请求行规则,则将其作为请求行处理;如果匹配响应行规则,则作为响应行处理。然而,目前它只应用请求留置权规则,如果不匹配则会引发错误。为什么要给它一个反斜杠?您应该给它一个真正的回车符和换行符,而不是反斜杠。@EJP我从C代码复制了输入字符串,所以我应该给它一个读回车符和换行符,而不是\r\n。显然不是。lexer将其识别为反斜杠从C代码复制的输入字符串“不能证明其他情况”。