私はYACCにHTTPヘッダーパーサーを作成しています。 HTTPリクエストとレスポンスは、最初の行を除いて同じ構造をしているので、同じパーサーを使いたいと思っています。私は個別にrequest_line
とresponse_line
をテストし、それぞれHTTP要求とHTTP応答で動作します。しかし、私が次のように組み合わせた場合、http_header
はHTTP要求の規則にのみ一致し、HTTP/1.1 200 OK\r\nHost: foo.com\r\nConnection: Keep-alive\r\n\r\n
というHTTP応答が与えられると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で式の2つの代替ルールを指定する
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ラインプラスヘッダの残りの部分である。私はそれの名前を認識していないです。)
問題の診断に役立つ文法を追加する必要があります。あなたの苦情には "t_backslash"が含まれていますが、それを生成するレクサー/文法のルールは表示されませんでした。 –
@IraBaxter最新の投稿を更新しました。 「予期しないバックスラッシュ」エラーは、yaccがresponse_lineをrequest_lineとして解析しようとしていることに起因します。私が意図したのは、最初の行でパターンを一致させ、request_lineルールと一致する場合はrequest_line、応答ラインルールと一致する場合はresponse_lineとして処理することです。ただし、現在のところ、request_lienルールのみを適用し、一致しない場合はエラーを発生させます。 – user274602
なぜあなたはそれにバックスラッシュを与えていますか?実際の改行と実際の改行には、バックスラッシュではなく、それを入力する必要があります。 – EJP