2016-11-23 12 views
-1

저는 YACC에 HTTP 헤더 구문 분석기를 쓰고 있습니다. HTTP 요청과 응답은 첫 번째 줄을 제외하고는 동일한 구조를 가졌으므로 동일한 파서를 사용하기를 바랍니다. 개별적으로 request_lineresponse_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_linerequest_line 또는 response_line과 어떻게 일치시킬 수 있습니까?YACC에서 표현식에 대한 두 가지 대체 규칙 지정

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에 의해 무엇을 의미는 첫 번째 라인 플러스 헤더의 나머지 부분입니다. 나는 그것을 이름을 인식하지입니다.)

+0

문제 진단에 도움이되는 더 많은 문법을 제공해야합니다. 귀하의 불만에는 "t_ 백 슬래시"가 포함되어 있지만 귀하가 작성한 렉서/문법 규칙을 표시하지 않았습니다. –

+0

@IraBaxter 업데이트 된 원본 게시물. "예기치 않은 백 슬래시"오류는 yacc이 response_line을 request_line로 구문 분석하려고 시도 할 때 발생합니다. 필자가 의도 한 것은 첫 번째 라인에서 일치 패턴을 만들고 request_line 규칙과 일치하는 경우 request_line으로 처리하고 응답 라인 규칙과 일치하는 경우 response_line으로 처리하는 것입니다. 그러나 현재 request_lien 규칙 만 적용되고 일치하지 않으면 오류가 발생합니다. – user274602

+1

왜 백 슬래시를 먹이고 있습니까? 실제 캐리지 리턴과 실제 줄 바꿈을 제공해야하며 백 슬래시는 제공하지 않아야합니다. – EJP

답변

0

당신은 그것을 먹이 캐리지 리턴/줄 바꿈 대신 백 슬래시. 분명히 C 문자열 리터럴을 C 문자열 이스케이프 규칙을 구현하지 않는 다른 이름으로 복사했습니다.

이 작업에는 yacc과 같은 정확한 내용을 사용하지 않을 것입니다. 필자는 손으로 쓰는 토크 나이저보다 더 정확한 것을 사용하지 않을 것이다. 그리고 필자는 파서에 줄 끝 시퀀스의 개별 문자를 제시하지 않을 것입니다.