2013-04-17 3 views
2

다음과 같이 서식이 지정된 일부 데이터를 구문 분석하려고합니다.구문 분석시 중첩 된 규칙 사용

data: [a b x b x x b a a x x b b x ] 

나는 그것을 위해 A의와 b의의를 추출하고 각 a와 b에 대해 다른 작업을 수행하기 위해 무엇을해야합니다. 지금까지이 함께 올라와있다

a 
b 
b 
b 
a 
a 
b 
b 
== true 

하지만 되풀이의 실패 :

예상 출력 될 것입니다.

parse data [ 
    some [ 
    thru 'a (print "a") 
    some [ 
     any [ 
     to 'b (print "b") 
     ] 
     to 'a 
    ] 
    ] 
    to end 
] 

모든 포인터? 감사합니다

답변

4
>> data: [a b x b x x b a a x x b b x ] 
== [a b x b x x b a a x x b b x] 

>> parse data [ some [ 'a (print "a") | 'b (print "b") | skip ] ] 
a 
b 
b 
b 
a 
a 
b 
b 
== true 
4

나는 당신이 단순히 원하는 뭔가가 ... 그러나 아니다 될 수있다

당신이 요청하는 출력을 생성
parse data [ 
    any [ 
     thru ['a (print "a") | 'b (print "b")] 
    ] 
    to end 
] 

.

+0

감사합니다. 나는 데이터가 0 또는 그 이상의'b'에 의해''_''로 구조화 된 방법을 생각하면서 멈추었다. 당신의 해결책은 정말로 단지'a'가 이것을하면'b'가되고, parse가 시리즈를 통해 앞으로 나아갈 때 그 순서는 내재적이라는 것을 말하는 것입니다. – johnk

+0

물론입니다. @ GrahamChiu는 조금 나아 졌어. – HostileFork

+1

사실, 이것은 Rebol 3에서 훨씬 좋습니다. Rebol 2에서는 Graham이 잘 작동합니다. – BrianH

3

tothru이므로 실제로 필요하지 않습니다. 여기서 R3를 활용하고없이 사용합시다. and

parse data [ 
    some [ 
     'a (print "a") 
     any [ 
      'b (print "b") | 
      and 'a break | 
      skip 
     ] 
    ] 
    to end 
] 

는 내다을 수행하고 any 규칙 밖으로 break 휴식. 이렇게하면 다음 루프가 시작될 때 내부 루프를 멈출 수 있습니다.

to

thru 당신이 과거를 생략하고 싶지 않은 과거의 물건을 건너 뛰고, 당신의 코드에서 to 'b의 경우 실제로는 대부분의 시간을 아무것도하지 않았다. 당신은 to 'b을 감싸는 any 루프가 진행되지 않았기 때문에 R3이 계속 진행하지 않을 경우 변경되었다는 것은 운이 좋았습니다.

첫 번째 문제는 (print "a") 뒤에있는 내부 some은 선택 가능하도록 any이어야합니다. some은 선택 사항이 아니므로 중간에 데이터가없고 a의 실행에는 작동하지 않았습니다.

PARSE는 까다로울 수 있지만 처리가 지연됩니다.

+0

브라이언에게 감사드립니다. 매우 명확한 설명입니다. 나는 전에'및'을 보지 않고 있었다. http://www.rebol.com/r3/docs/functions/parse.html – johnk

+0

다른 답변도 사용할 수 있지만 중첩하지는 마십시오. 루프 것들 그래서 그들은 정말로 당신의 질문에 대답하지 않습니다.그래도 중첩 루프를 수행하는 방법을 실제로 알 필요가 없다면 작동 할 것입니다. – BrianH

관련 문제