2016-09-10 2 views
-1

C++의 문맥 자유 문법 (CFG) 문을 입력으로 받아들이는 플랫폼을 만드는 방법이 궁금합니다. 모범적 인 목적을 위해 CFG가 포커 이동을 지시한다고 가정합니다. 그래서 이동 문의 일반적인 형태는컨텍스트 무료 문법 및 C++

move statement -> PLAYER_ID MOVE_ID MOVE 

될 경우

PLAYER_ID -> INTEGER 
MOVE_ID -> INTEGER 
MOVE -> CHECK | RAISE | CALL | FOLD 
RAISE -> "raise by " INTEGER 

나는 (클래스로 구현 될 수있다) 예를 들어, 특정 이동 문 출력을받을 수있는 플랫폼을 구축 할 , 게임의 현재 상태.

C++에서 이와 같은 플랫폼/프로그램을 만드는 방법은 무엇입니까?

답변

1

따라서 이러한 문법을 ​​위해 파서를 구현해야합니다. 문법이 아주 간단하다면 hand-write을 문법이 간단하면 재귀 적 파생 구문으로 사용할 수 있습니다. 입력으로 주어질 수있는 문맥이없는 문법을 실제로 사용하려면이 경우 or write a simple LR(k) parser generator in C++을 사용해야합니다 (필요한 경우에만 필요하지만 원하는 경우에도 가능합니다. 프로그램을 실행하는 동안 문법을 수정하십시오!). 당신이 C++를 생성 원한다면

은 물론 당신이 파서 생성기를 사용할 수있는 대신에, 대중적인 선택은 GNU의 bisonflex. 또 다른 옵션 옵션은 예를 들어 boost's spirit과 같은 일부 C++ 라이브러리로 파서를 작성한 다음 입력과 같은 동작을 허용하는 것입니다.

+0

"손 쓰기"를 명확히하기 위해 편집 됨. Boost는 인기있는 C++ 라이브러리이며, C++의 표준 라이브러리 중 일부는 먼저 boost에 의해 개발 된 다음 나중에 표준에 통합되었습니다. 이것은 표준이 아니기 때문에 (STL의 일부가 아닌) 영혼의 경우는 아니지만 설치가 쉽고 많은 개발자가 사용하기를 선택합니다. 사용하기 쉽고, 예를 들어 포커싱을 구문 분석하는 데 유용한 옵션이 있습니다. – paulotorrens

+0

나는 당신이 가고 싶은 길을 확실히해야 할 것입니다. 네가 "~라고 생각 했으니"라고 말하면서, 네가하려는 일을 정확히 설명하지 못했고, 나는 너에게 한 가지 이상의 길을 인도 할 수있는 일반적인 대답을했다. C++의 경우, 부스트는 일반적인 해결책이며, 이것은 소개입니다 (http://www.codeproject.com/Articles/20027/JSON-Spirit-A-C-JSON-Parser-Generator-Implemented). 또 다른 인기있는 선택은 bison과 flex로 파서를 생성하는 것입니다. [이것은 간단한 예제입니다] (http://www.jonathanbeard.io/tutorials/FlexBisonC++). 나는'strtok()'이 당신이 물어 본 것에 적합한 해결책이 아니라고 말해야합니다. – paulotorrens