정신을 사용하여 물건을 구문 분석하기 위해 스택 오버 플로우를 계속 얻습니다.

StackOverflow https://stackoverflow.com/questions/1107654

  •  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 기반 도구를 사용하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top