귀하의 입력 일치하는, 1
시작 모두number
및 string
(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"
감사합니다 Jörg, 네, 맞습니다. 나는 값 규칙에서 문자열에 숫자를 매치하는 것을 선호한다. 어떻게하면 "가치 규칙을 여러 번 일치시킬 수 있습니까?" 위의 예제가 작동하도록하기. – lchanmann
@mann : Treetop의 반복 연산자는'Regexp'와 비슷한 의미로'+'와'*'입니다. 자세한 내용은 편집을 참조하십시오. –
@Clifford on Treetop 개발 Google 그룹에서 "!"을 사용하도록 제안합니다. 숫자 규칙을 "[1-9] [0-9]!"로 변경 한 후 EOF와 일치 시키십시오. 이제는 숫자와 문자열을 완벽하게 일치시킬 수 있습니다. Jörg 감사합니다! – lchanmann