2010-12-22 3 views
1

아래와 같이 Treetop을 사용하여 문자열과 숫자를 구문 분석하기위한 간단한 문법을 ​​정의했습니다.Treetop ruby ​​parser - 순서 선택을 구문 분석 할 수 없습니다.

grammar Simple 
    rule value 
     number/string 
    end 

    rule string 
     word space string 
     /
     word 
    end 

    rule word 
     [0-9a-zA-Z]+ 
    end 

    rule number 
     [1-9] [0-9]* 
    end 

    rule space 
     ' '+ 
    end 
end 

루비 :

parser = SimpleParser.new 
parser.parse('123abc wer') # => nil 

나는 파서가 문자열 노드을 반환하지만 입력을 이해할 수 없었다 파서 처럼 보일 전망이다. 어떤 아이디어라도 감사 할 것입니다.

답변

4

트리 톱 (실제로는 일반적으로 PEG)에서 대부분의 다른 구문 분석 방식과 달리 선택 연산자는 으로 지정되어입니다.

그래서,

rule value 
    number/string 
end 

에 당신은 당신이 string 이상number를 선호 그 나무 꼭대기를 말하고있다.

귀하의 입력 일치하는, 1 시작 모두numberstring (word를 통해),하지만 당신은 그것이 number로 구문 분석 있도록 number 해석을 선호하는 나무 꼭대기 말했다. 입력의 a에 대해서는 더 이상 적용 할 규칙이 없으므로 Treetop에서 전체 입력 스트림을 소비하지 않으므로 오류가 발생하므로 아무 것도 반환하지 않습니다 (nil). 당신이 그대로 순서를 유지하지만, value 규칙을 허용 할 수있는,

SyntaxNode+String0 offset=0, "123abc wer" (word,space,string): 
    SyntaxNode offset=0, "123abc": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "2" 
    SyntaxNode offset=2, "3" 
    SyntaxNode offset=3, "a" 
    SyntaxNode offset=4, "b" 
    SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
    SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
    SyntaxNode offset=7, "w" 
    SyntaxNode offset=8, "e" 
    SyntaxNode offset=9, "r" 

을 또는 : 당신은 단순히 선택의 순서를 반대로하면

은 전체 입력은 string 대신 number (A)의 해석됩니다 여러 번 일치시킬 수 있습니다. 어느 쪽이 같은 새로운 최상위 규칙 삽입 :

rule values 
    value+ 
end 

또는이 같은 value 규칙 수정 :

rule value 
    (number/string)+ 
end 

과 같이 대략 당신에게 AST를 줄 것이다 :

SyntaxNode offset=0, "123abc wer": 
    SyntaxNode+Number0 offset=0, "123": 
    SyntaxNode offset=0, "1" 
    SyntaxNode offset=1, "23": 
     SyntaxNode offset=1, "2" 
     SyntaxNode offset=2, "3" 
     SyntaxNode+String0 offset=3, "abc wer" (word,space,string): 
     SyntaxNode offset=3, "abc": 
      SyntaxNode offset=3, "a" 
      SyntaxNode offset=4, "b" 
     SyntaxNode offset=5, "c" 
    SyntaxNode offset=6, " ": 
     SyntaxNode offset=6, " " 
    SyntaxNode offset=7, "wer": 
     SyntaxNode offset=7, "w" 
     SyntaxNode offset=8, "e" 
     SyntaxNode offset=9, "r" 
+0

감사합니다 Jörg, 네, 맞습니다. 나는 값 규칙에서 문자열에 숫자를 매치하는 것을 선호한다. 어떻게하면 "가치 규칙을 여러 번 일치시킬 수 있습니까?" 위의 예제가 작동하도록하기. – lchanmann

+0

@mann : Treetop의 반복 연산자는'Regexp'와 비슷한 의미로'+'와'*'입니다. 자세한 내용은 편집을 참조하십시오. –

+0

@Clifford on Treetop 개발 Google 그룹에서 "!"을 사용하도록 제안합니다. 숫자 규칙을 "[1-9] [0-9]!"로 변경 한 후 EOF와 일치 시키십시오. 이제는 숫자와 문자열을 완벽하게 일치시킬 수 있습니다. Jörg 감사합니다! – lchanmann