2013-09-22 4 views
0

Treetop은 첫 번째 규칙 이후에 추가 규칙을 무시한 것으로 보이며 문법 파일의 첫 번째 규칙과 일치하지 않는 구문을 모두 구문 분석하지 못합니다. 이미 규칙의 순서를 바꾸려고 시도했지만 여전히 첫 번째 규칙 만 고려합니다. 1 열 (바이트 1), 라인 1에 -Treetop은 문법 규칙을 무시합니다

# grammar_pov.treetop 
grammar Pov 
    rule numeric 
     '-'? [0-9]+ ('.' [0-9]+)? <::PovFabric::Nodes::NumericLiteral> 
    end 
    rule comma 
     ',' 
    end 
    rule space 
     [\s]+ 
    end 
end 

이 문법 파일의 모든 정수를 일치하고 수레하지만, '123, 456'또는 일치하지 않는 '123456' 파서 FAILURE_REASON 속성은이 '이 예상 말한다 이후 '

내가 뭔가를 놓친가요?

답변

0

Jörg와 마찬가지로 문법에 commaspace 규칙을 사용해야합니다. 나는 당신이 아래에서 성취하려고 노력하고 있다고 생각하는 것을 보여주는 간단한 예를 만들었습니다. 그것은 "100", "1,000", "1,000,000", 일치해야합니다 등

먼저 그때 나는, 1 ~ 3 자리 숫자를 테스트 그때의 0 개 이상의 조합을 테스트, 뺄셈 기호 '-'? 테스트, 숫자 규칙을 보면 comma 및 세 자리

require 'treetop' 
Treetop.load_from_string DATA.read 

parser = PovParser.new 

p parser.parse('1,000,000') 

__END__ 
grammar Pov 
    rule numeric 
     '-'? digit 1..3 (comma space* (digit 3..3))* 
    end 

    rule digit 
     [0-9] 
    end 

    rule comma 
     ',' 
    end 

    rule space 
     [\s] 
    end 
end 
+0

좋은 예, 고마워요! –

+0

문제 없으니 기꺼이 도와 드리겠습니다. :) –

1

귀하의 commaspace 규칙은 어디에도 사용되지 않습니다. 그래서 그들은 단지 죽은 코드 일뿐입니다.

+0

정교하게 설명 할 수 있습니까? 쉼표 규칙이 '123,456'및 '123, 456'과 일치해야합니까? –

+0

아니요,'쉼표'규칙은'', ''과 일치합니다. 그러나 규칙은 아무 데서도 사용되지 않기 때문에 이것은 어쨌든 전혀 관련이 없습니다. 서브 루틴을 정의하고 절대로 호출하지 않는 것과 같습니다. –