저는 YACC에 HTTP 헤더 구문 분석기를 쓰고 있습니다. 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
과 어떻게 일치시킬 수 있습니까?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
에 의해 무엇을 의미는 첫 번째 라인 플러스 헤더의 나머지 부분입니다. 나는 그것을 이름을 인식하지입니다.)
문제 진단에 도움이되는 더 많은 문법을 제공해야합니다. 귀하의 불만에는 "t_ 백 슬래시"가 포함되어 있지만 귀하가 작성한 렉서/문법 규칙을 표시하지 않았습니다. –
@IraBaxter 업데이트 된 원본 게시물. "예기치 않은 백 슬래시"오류는 yacc이 response_line을 request_line로 구문 분석하려고 시도 할 때 발생합니다. 필자가 의도 한 것은 첫 번째 라인에서 일치 패턴을 만들고 request_line 규칙과 일치하는 경우 request_line으로 처리하고 응답 라인 규칙과 일치하는 경우 response_line으로 처리하는 것입니다. 그러나 현재 request_lien 규칙 만 적용되고 일치하지 않으면 오류가 발생합니다. – user274602
왜 백 슬래시를 먹이고 있습니까? 실제 캐리지 리턴과 실제 줄 바꿈을 제공해야하며 백 슬래시는 제공하지 않아야합니다. – EJP