2009-11-18 3 views
0

저는 성경 텍스트를 중심으로 한 오픈 소스 프로젝트에서 작업하고 있습니다. 검색 문자열을 작성하기위한 표준 문자열 형식을 만들고 싶습니다. 그런 다음 검색 문자열을 구문 분석하고 주어진 옵션을 사용하여 검색을 실행해야합니다. 검색 범위, 여러 텍스트 검색, 와일드 카드 검색 등 여러 가지 옵션이 있습니다.C/C++의 검색 문자열 파서

lex/yacc와 같은 형식을 사용하여이 형식의 파서를 생성하면 좋은 것 같습니다. 생각. 나는 Xapian 프로젝트가 비슷한 목적을 달성하기 위해 레몬을 사용한다고 생각한다. 내 질문은 이러한 도구 중 하나 이상을 사용하여이 작업을 수행하는 가장 좋은 방법이라고 생각하십니까?

이 질문에 덧붙여,이 도구들 (그리고 옵션 일 수있는 다른 것들)에 대한 자원에 대한 링크를 보내 주시면 감사하겠습니다. 지금까지 실행 해 본 가장 큰 문제는 대부분의 예제와 튜토리얼이 프로그래밍 언어 또는 문자열 형식을 파싱하는 것보다 계산기와 같은 단순한 것에 적합하다는 것입니다.

답변

1

Lex 및 Yacc와 같은 도구가 사용자의 목적에 적합합니다. 검색 문자열에 대한 파서는 프로그래밍 언어에 대한 파서와 다르지 않습니다 (큰 차이는 검색 문자열 파서가 검색을 안내하는 규칙을 생성하는 반면 프로그래밍 언어 파서는 코드가 생성되는 곳에서 파스 트리를 생성한다는 것입니다)

나는 당신의 구문은 다음과 같은 규칙이 포함됩니다 가정

expression : word 
      | expression AND expression 
      | expression OR expression 
      | NOT expression 
      | '(' expression ')' 

모두 Yacc에에서 표현하기 쉽다.

당신은 내가 렉스와 Yacc에

+0

네, 정확히 같은 규칙이 필요합니다. 나는 이와 같은 것으로부터 파생되는 방법, 예를 들어 데이터 구조에 파싱의 결과를 채우는 방법을 여전히 명확하지 않다. 여기에서 다음 단계는 무엇입니까? –

+0

나는 다음 단계를 보여주는 튜토리얼 또는 예제를 참조하기 만하면되는 단계별 지침을 제공 할 것을 요구하지 않습니다. –

+0

내가 제공 한 링크는 간단한 프로그래밍 언어를 트리로 구문 분석합니다. 다음 장에서 인터프리터를 구현하는 데 사용합니다. 그것은 당신을 계몽해야한다 – Wernsey

0

마음에 "구문 오류 진단 및 메시지"를 계속 표시하십시오. 사용자가 실수를하면 수작업으로 만든 재귀 - 내려감 스타일 파서가 지금까지 스캔 한 내용, 사용자가 실수 할 수있는 내용 만들었 어. 자동화 된 도구를 사용하려는 경우 일반 사용자의 오타에 어떻게 반응하는지 테스트해야합니다. 천재성 - 프로그래머는 컴파일러의 암호화 된 메시지를 처리 ​​할 수 ​​있지만 사용자가 필요로하는 훨씬 덜 정교한 사용자를 대상으로하는 것처럼 들립니다. 친숙한 인터페이스.

1

당신이

boost::sprit

이를 한 번 봐 가지고 ++ C의 파서를 구축하려는 경우 학습을위한 매우 유용한 것으로 나타났습니다되는 A Compact Guide to Lex & Yacc 볼 수 있습니다 확실히 고급 C++이지만 코드 생성없이 C++ 템플릿에서 상당히 복잡하고 성능이 뛰어난 파서를 만들 것입니다. 그것에 들어가려면 며칠이 걸렸지 만 곧장 샘플을 사용하고 수정했습니다. 또한 다음과 같은 책을 읽어 보시기 바랍니다 :

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond by David Abrahams and Aleksey Gurtovoy

+0

나는 정신을 보았다. 한 가지 확실하지 않은 점은 결과가 부스트 DLL에 달려 있는지 여부입니다. 절대적으로 필요한 것이 아니라면 다른 의존성을 추가하는 것에별로 관심이 없습니다. –

+0

아니요 - DLL 또는 라이브러리가 필요하지 않습니다. 부스트 라이브러리의 대부분은 헤더 전용 라이브러리입니다. 연결할 필요가 없습니다. –

+0

정규식 일치를 사용하는 경우 나타납니다, 그때 당신은 그것이 헤더로만 링크가 필요합니다 부스트 regex 라이브러리를 사용해야합니다. 정보를 제공해 주셔서 감사합니다. 그러나 저는 다른 해결책을 시도 할 것입니다. –