정신을 사용하여 물건을 구문 분석하기 위해 스택 오버 플로우를 계속 얻습니다.
-
12-09-2019 - |
문제
나는 스택 오버플로를 얻기 시작했을 때 여기에 와서 물어볼 시간이라고 생각했다;)
나는 지금 부스트 정신을 사용하는 방법을 배우려고 노력하고 있습니다. 나는 기본적인 것들을 알아 냈습니다. K & R Handy (C의 문법이 포함되어 있음)가 있었기 때문에 언어 수용자를 만들 수 있는지 확인하기로 결정했습니다. 결국 데이터 구조와 물건에서 일부 정보를 수집하기 위해 전처리 자로 사용하기를 원하기 때문에 이것은 어쨌든 원래 목표였습니다.
상수와 줄을 구문 분석 할 수 있지만, 구문 분석을 시도 할 때 문제가 발생합니다.
postfix_expression =
primary_expression
// omitting some other rules for simplicity's sake
| (postfix_expression >> chseq+p("++"))
| (postfix_expression >> chseq_p("--"));
primary_expression =
identifier
| constant
| string_literal;
// The parsers for constants and strings are
// pretty trivial so I'm not going to C+P them here.
내가 같은 것을 지나갈 때 i++
실패합니다. 나는 이것이 때문이라고 생각한다 i
유효합니다 primary_expression
그래서 계속 확인하지 않습니다. ++
또는 --
. 나는 그것을 바닥에 놓고 시도한 다음 스택 오버플로를 얻는다. 나는 여기서 무한한 왼쪽 재귀를 얻고 있지만 그것을 해결하는 방법을 모르겠습니다.
해결책
왼쪽 재귀를 제거해야합니다. 이 Wikipedia 기사는 몇 가지 기술을 설명합니다.
http://en.wikipedia.org/wiki/left_recursion
그러나 불가능할 수 있습니다. C는 상당히 유연한 구문을 가지며, 부스트 정신이 역 추적을 허용하지 않는 한 재귀 하강 파서가 기능 할 수있는 충분한 컨텍스트를 제공하지 않을 수 있습니다. 또는 당신은 그것을 할 수 있지만 협회는 거꾸로 될 것입니다.
Bison과 같은 LALR 기반 도구를 사용하는 것이 좋습니다.