2014-08-29 3 views
1

다음과 같은 구문 분석 문제가 있습니다. 아래의 첫 번째 샘플 텍스트에서 구문 분석은 두 개의 명령 블록이 텍스트의 일부를 찾으면 충돌합니다.변경 명령 ​​(Rebol2)을 사용할 때 구문 분석 문제

다음을 시도해보십시오 (Rebol 2).


sample-text: {<a href="javascript:gotoURL('displayContent.aspx?contentID=9&language=english#Deferred-member');">deferred member</a>} 

remove-anchors: func [sample-text][ 
    parse sample-text[ 
     some [ 
      to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9} 
      begin: 
      thru {);">} 
      ending: 
      (print "Command 1 executed") 
      to "<" 
      begin: 
      thru ">" 
      ending: 
      (print "Command 2 executed") 
     ] 
    ] 
    return sample-text 
] 

결과 :

remove-anchors sample-text 
Command 1 executed 
Command 2 executed 

그러나, 내가 발견 한 텍스트를 제거 할 것으로 예상되는 명령의 변경/부분 부분을 삽입 할 경우 첫 번째 변경/부분이 실행되지만 두 번째 실행 블록이 트리거되지 않아 parse 명령의 두 번째 부분이 중지됩니다.


sample-text: {<a href="javascript:gotoURL('displayContent.aspx?contentID=9&language=english#Deferred-member');">deferred member</a>} 

remove-anchors: func [sample-text][ 
    parse sample-text[ 
     some [ 
      to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9} 
      begin: 
      thru {);">} 
      ending: 
      (print "Command 1 executed" change/part begin "" ending)  ;<<----- change 
      to "<" 
      begin: 
      thru ">" 
      ending: 
      (print "Command 2 executed" change/part begin "" ending)  ;<<----- change 
     ] 
    ] 
    return sample-text 
] 

결과 : 두 번째 명령은 인쇄가 실행되지 않고 구문 분석이 완료되지 모두에 의해 실행하는 것 같지 않았어요

remove-anchors sample-text 
Command 1 executed 
== "deferred member</a>" 

참고.

텍스트에서 여러 가지 유형의 링크가 있기 때문에 동일한 HTML에서 이러한 부분을 제거하려고하고 있으며 PARSE가 올바른 해결책이라고 생각했습니다.

내가 뭘 잘못하고 있는지 알 수 있습니까? 이

remove-anchors: func [sample-text][ 
parse sample-text[ 
    some [ 
     to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9} 
     begin: 
     thru {);">} 
     ending: 
     (print "Command 1 executed" change/part begin "" ending)  
     :begin             ; note this 
     to "<" 
     begin: 
     thru ">" 
     ending: 
     (print "Command 2 executed" change/part begin "" ending)  
    ] 
] 
return sample-text 

]

설명을 사용하는 경우

답변

1

귀하의 기능이 작동해야합니다
내부 구문 분석 포인터가 {);">} 후 (95)의 내부 숫자 인덱스입니다. 변경 명령 ​​후에도 색인은 여전히 ​​95이지만 샘플 텍스트는 더 짧아지고 두 번째 검색 텍스트 "to "<" 다음의 구문 분석 포인터가 끝날 것입니다. 당신은 당신의 기능이 라인

(print "Command 1 executed" change/part begin "" ending print ending)  ;<<----- change 

를 사용하는 경우,

** Script Error: Out of range or past end 
** Where: remove-anchors 
** Near: print ending 

그래서 당신이 지점의 시작 부분에 구문 분석 색인/포인터를 다시 설정해야합니다 당신에게 다음과 같은 오류를주는 것을 볼 수 있습니다 텍스트를 변경/삭제했습니다. 변경 후 :begin에 도착합니다.

최상의 조언은 구문 분석 입력을 수정 한 경우 내부 구문 분석 포인터를 다시 설정/초기화하는 것입니다. 삭제 후에는 삭제 시작으로 돌아 가야하며 삽입/수정 후 처음부터 시작으로 이동해야합니다. 새 항목의 끝까지.

+0

감사합니다. sqlab. 이 문제가 해결되었습니다. – Brock