2014-12-13 4 views
5

qi 문법에서 키워드/식별자 사용의 뉘앙스와 관련된 몇 가지 게시물을 보았습니다. 그러나이 방법이 부스트 예제에서 어떻게 입증되었는지 이해할 수 없습니다boost :: spirit :: qi 키워드 및 식별자

qi::symbols<char> keywords; 

예 키워드 세트 :

keywords.add 
     ("foo") 
     ("bar") 
     ; 

식별자 규칙 선언 :

...

키워드 선언 작동하도록되어 여기

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier; 

은 식별자 규칙은 제나라 CALC 및 컴파일러 예에서 정의하는 방법은 다음과 같습니다

identifier = !keywords >> qi::raw[ qi::lexeme[ (qi::alpha | '_') >> *(qi::alnum | '_') ] ]; 

은 아마도 내가 제나라의 구문이 잘못 읽고 있어요,하지만이 모든 문자를 허용하지 않을 것이라고 나에게 보인다 일치하거나 으로 시작합니다. 전체 키워드 일치를 거부하면 원하는 동작입니다. 그러나 키워드 "foo"로 시작하는 경우에도 "음식"을 식별자로 사용하고 싶습니다. 이것은 꽤 표준적인 유스 케이스처럼 보이지만 실제로 이것을 못살게 굴는 문서를 찾는 데 어려움이 있습니다.

누구나 키워드와 정확히 일치하는 항목 만 거부하는 식별자 규칙을 제공 할 수 있습니까?

감사합니다.

+0

사실이 질문은 투표권이 있습니다.훨씬 더 많이 실현되어야하며, 성령의 튜토리얼에서 종종 다루어 져야합니다. 종종 간과되기도합니다 (분명히 ** [컴파일러 샘플] (http://www.boost.org/doc/libs/1_57_0/libs/spirit/example/qi/compiler_tutorial /) ** ok) – sehe

답변

3

사실이 질문은 투표 수의 자격이 있습니다. 훨씬 더 자주 실현, 그리고 아마도 성령 자습서에서 해결 될, 그것은 종종


아마도 내가 잘못 제나라 구문을 읽고 있어요 (분명히 the compiler samples이 확인됩니다 ) 간과으로 만해야한다 이것은 키워드와 일치하거나 시작하는 리터럴을 허용하지 않는다고 생각합니다.

맞습니다. 당신이 내 자신의 대답 중 하나 (아주 좋은 기회)에 얼룩을지게 한 경우, 나는 이것을 적절한 키워드 가드가없는 문법을 수정하기위한 신속하고도 더러운 방법으로 생각하는 경향이 있습니다.

그래도 별개의 키워드/식별자가 필요하다면 더 많은 작업이 필요합니다. 나는 그것이 올바르게 끝난 답에 대한 링크를 발견 할 수도있다 (어렵지도 않다. 지루하다). 한편

는에서 매우 관련

당신이 정말 강력한 범용 언어 문법을 구축하는 경우는, 이것이 대한 인 Spirit Lexer 사용을 고려해야하는 지점. 그리고 다시 저의 겸손한 견해로 스피릿은 성령의 표현 템플릿 인 eDSL을 사용하여 간결하게 개발 된 소규모의 일회성 문법과 빠른 개발을 목표로합니다. 많은 측면에서, 이것이 중요한 문제의 대칭점입니다.

+0

답변 해 주셔서 대단히 감사합니다. 이것은 그것을 지 웁니다. 나는 별개의 지시어를 알고 있었지만, 나는 그 빠른 수정으로 무언가를 놓칠 수도 있다고 생각했다. 감사! – pt3dNyc