2017-04-07 1 views
1

TXR에서 재귀 패턴 일치 기능을 작성하는 방법을 이해하는 데 문제가 있습니다. 아래에서는 파일 경로를 인식하기위한 재귀 적 지시문을 정의하려고합니다. 이 경우 정규식 ([a-z]+\/)+[a-z]+을 사용하여이 문법을 나타낼 수 있지만이 규칙의 이점을 누릴 수있는 실제 코드는 더 복잡한 규칙을 염두에두고 있습니다. 슬래시가있을 때이 지시문의 실패 원인은 무엇입니까?TXR : 재귀 패턴 일치 지시문을 작성하는 중

@(define location)@\ 
@ (cases)@\ 
@/[a-z]+/@\ 
@ (or)@\ 
@/[a-z]+//@(location)@\ 
@ (end)@\ 
@(end) 
@(repeat) 
@(cases) 
@{location (location)} 
@ (output) 
@location is a valid location. 
@ (end) 
@(or) 
@location 
@ (output) 
@location is not a valid location. 
@ (end) 
@(end) 
@(end) 

예 유효한 입력 :. /[a-z]+(\/[a-z]+)*/ 내가 있으리라 믿고있어 :

this/is/valid 
this/is/also/valid 
this 
a/b/c 

답변

1

(물론, 당신은 거의 확실 location 우리가 정규식 단지로 찾으면 할 수있는 일반 언어와 일치하는 것을 알고 이것은 단지 더 복잡한 무언가를위한 "재귀 hello world"예열입니다.)

cases에 대한 것은 위에서 아래로, 단락 평가를 사용한다는 것입니다. 두 번째 대/소문자는 첫 번째 대/소문자가 접두사와 일치하기 때문에 일치 할 수 없습니다. 서브 표현식의 순서가 중요하지 않은 정규 표현식 연산자와는 다릅니다.

두 사례를 단순히 바꾸면 샘플이 저에게 적합합니다.

casessome으로 변경됩니다. some 지시어는 첫 번째 일치시 중지되지 않습니다. 때때로 당신은 (예를 들어, 어떤 조건 치면 왼쪽 재귀를 방지) 또는 퇴화를 방지하기 위해 재귀를 종료 할 경우 주위 단락에 필요하기 때문에 some를 사용

은 만병 통치약 cases 주문 문제 이런 종류의에 대한되지 않습니다 성능 (지수 시간). 나는 대학 교수의 농담을 생각 나게한다 : "당신은 나누고 정복한다고 들었는데 이것은 곱해서 항복한다".

some에는 나중 절이 이전에 성공적으로 일치하는 절의 바인딩을 "확인"하는 속성도 있습니다. 이 문제로 인해 cases-ordering 문제가 해결 될 수 있습니다. 다시 말하면, 가변적 인 충돌 때문에 일치하지 않을 수도 있습니다. :resolve 기능이 some이면 도움이 될 수도 있고 그렇지 않을 수도 있습니다.

+0

나는 "곱하기와 항복"을 기억할 것입니다 :) – wdkrnls

+0

"곱하기와 항복"녀석이 바로 여기에 있습니다. 그래서 당신은 그것을 어딘가에 돌릴 수 있습니다 : https://www.math.ubc.ca/~anstee/ – Kaz