2012-12-10 3 views
2

입력 파일과 다른 데이터 형식을 파싱하는 파서가 있습니다. 난 이미 그 정신은, 예를 들어, 짧고 INT 사이에 결정할 수 있습니다 알아 냈 :float와 double 사이의 boost :: spirit (qi) 결정

value %= (shortIntNode | longIntNode); 

내가 답변에서 (뿐만 아니라 복식을 감지하는 규칙의이 유형을 사용

shortIntNode %= (qi::short_ >> !qi::double_) 
       [qi::_val = phoenix::bind(&CreateShortIntNode, qi::_1)]; 
longIntNode %= (qi::int_ >> !qi::double_) 
       [qi::_val = phoenix::bind(&CreateLongIntNode, qi::_1)]; 

herehere). 파서는 int> 65535의 숫자와 < = 65535의 short를 int 사이에서 결정할 수있었습니다. 그러나 float_ 및 double_의 경우 예상대로 작동하지 않습니다.

value %= (floatNode | doubleFloatNode); 

floatNode  %= (qi::float_) 
        [qi::_val = phoenix::bind(&CreateFloatNode, qi::_1)]; 
doubleFloatNode %= (qi::double_) 
        [qi::_val = phoenix::bind(&CreateDoubleFloatNode, qi::_1)]; 

과 옵션이나 다른 트릭처럼 뭔가가 있다면 당신은 알고 계십니까 :이 같은 규칙이있는 경우는, float 값으로 구문 분석이 값을 반올림 데이터 유형 범위에 따라 float_와 double_ 사이를 결정 하시겠습니까?

대단히 감사합니다!

답변

4

렉 싱이 도움이 될 수 있습니다. 궁극적으로 결정, 파서가 아닙니다. 지회를 주문하는 것이 도움이됩니다. 부스트 성령과 유사한 구문 분석기의 경우도

를 참조하십시오.

float/double 사이에서 결정하려면 실제 입력 기준이 없습니다. 항상 이중으로 구문 분석을 제안합니다. 그러나 의미 론적 액션을 사용하여 특정 크기의 플로트를 강제로 사용할 수 있습니다.

다음은 C++ 문법이 무엇을 (예를 들어)를 다음과 같습니다

floatrule = lexeme [ float_ >> 'f' ]; 
doublerule = double_; 

float_or_double = floatrule | doublerule;