문제

문법이있는 파일에서 C ++에서 파서를 만드는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

또한 다음 링크를 살펴볼 수도 있습니다.

다른 팁

그것은 문법에 크게 의존합니다. 나는 일반적으로 손으로 쓰여진 재귀 적 출신 파서를 좋아하는 경향이 있습니다 (문법에 대한 설명에서 하나를 생성 할 수는 있지만).

파서 생성기를 사용하려면 BYACC와 Antlr의 두 가지 좋은 선택이 있습니다. YACC와 (합리적으로) 호환되는 것을 원한다면 BYACC는 최선의 선택입니다. 처음부터 시작하는 경우 기존 코드 나 YACC와 호환되는 것을 사용하는 경험이없는 경험이 없다면 Antlr은 거의 확실히 최선의 방법입니다.

언급되었으므로 Bison에 대해서도 조금 이야기하겠습니다. 나는 전염병과 같은 들소를 피할 것입니다. "하나를 던질 계획"에 대한 Brooks의 조언은 여기에 적용됩니다. Robert Corbett (Byacc의 저자)는 Parser Generator에서의 첫 번째 시도로 Bison을 썼습니다. 불행히도, 그는 그것을 버리는 대신 GNU에게 주었다. 기술적 우수성을 치는 마케팅의 고전적인 사례에서 Bison은 비교적 모호한 상태로 남아있는 반면 Bison은 널리 사용되며 (더 잘 모르는 사람들)에게 널리 사용됩니다 (더 잘 모르는 사람들).

편집 : 나는 그것을 싫어하지만, 그것이 언급 된 이후로, 나는 또한 boost.spirit에 대해 언급 할 것입니다. 이것이 주변의 템플릿 메타 프로그래밍의 가장 멋진 예일 수 있지만, 몇 가지 문제가있어서 그것을 진지하게 사용하는 것을 추천하게됩니다.

  1. 그것과 함께 컴파일 시간이 극심해질 수 있습니다. 10 분은 일반적이며 더 크고 복잡한 문법이 더 오래 걸릴 수 있습니다 (컴파일러가 충돌하지 않는다고 가정).
  2. 당신이 전혀 실수를 저지르면, 그것은 종종 해독하기가 불가능한 미친듯한 긴 오류 메시지를 생성 할 수 있습니다. 템플릿이 많은 코드의 오류 메시지는 어쨌든 악명 높고 나쁘고 정신은 시스템을 거의 다른 것보다 강조합니다.

나를 믿으십시오 : 당신이 정신 같은 것을 전혀 쓸 수 있다는 사실은 인상적이고 놀라운 것 사이의 국경에 옳습니다. 그러나 내가 다루고있는 문법이 (그리고 항상 남아있을 것임) 확실하다고 확신한다면 여전히 그것을 사용할 것입니다. 상당히 작고 간단합니다.

거기 있습니다 몸을 풀다 그리고 바이슨. C ++ 존재를 고려한 Lex & Yacc 사촌.

당신은 보셨습니까? Lex와 YACC ? 링크 된 문서 5 장에서 인용 할 수 있습니다.

C ++ 파서를 만드는 것이 선호하는 방법은 LEX가 일반 C 파일을 생성하고 YACC가 C ++ 코드를 생성하도록하는 것입니다. 그런 다음 응용 프로그램을 연결하면 기본적으로 C ++ 코드가 C 함수를 찾을 수 없기 때문에 일부 문제가 발생할 수 있습니다. 해당 함수가 "C"라고 말하지 않는 한 C 함수를 찾을 수 없습니다.

나는 사용했다 바이슨, 내 레벨에 맞는 예제를 발견했습니다. 간단한 계산기를 만들 수있었습니다. 물론 훨씬 더 많은 일을 할 수 있습니다.

예를 들어 계산기는 1+2*3을 가져 와서 구문 트리를 만들었습니다. 그러나이 문서는 나무를 만드는 방법을 설명하지 않았으며 운동에 약간의 시간이 걸렸습니다.

내가 다시 가고 있다면 나는 'antlr'을 잘 보았고 잘 보이고 잘 지원되는 것을 조사 할 것이다.

남자 이름.

파서를 만드는 가장 좋은 방법은 Lex와 YACC를 사용하는 것입니다.

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