2016-11-23 4 views
-1

私はYACCにHTTPヘッダーパーサーを作成しています。 HTTPリクエストとレスポンスは、最初の行を除いて同じ構造をしているので、同じパーサーを使いたいと思っています。私は個別にrequest_lineresponse_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_linerequest_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ラインプラスヘッダの残りの部分である。私はそれの名前を認識していないです。)

+0

問題の診断に役立つ文法を追加する必要があります。あなたの苦情には "t_backslash"が含まれていますが、それを生成するレクサー/文法のルールは表示されませんでした。 –

+0

@IraBaxter最新の投稿を更新しました。 「予期しないバックスラッシュ」エラーは、yaccがresponse_lineをrequest_lineとして解析しようとしていることに起因します。私が意図したのは、最初の行でパターンを一致させ、request_lineルールと一致する場合はrequest_line、応答ラインルールと一致する場合はresponse_lineとして処理することです。ただし、現在のところ、request_lienルールのみを適用し、一致しない場合はエラーを発生させます。 – user274602

+1

なぜあなたはそれにバックスラッシュを与えていますか?実際の改行と実際の改行には、バックスラッシュではなく、それを入力する必要があります。 – EJP

答えて

0

あなたはそれを供給していますキャリッジリターン/改行の代わりにバックスラッシュを使用します。明らかに、C文字列リテラルをC文字列エスケープ規則を実装していないものにコピーしました。

私はyaccのような正確なものを使用しません。私は手書きのトークナイザよりも正確なものは使用しません。そして、私は確かに、行の最後からパーザまでの個々の文字を提示しません。

関連する問題