2014-05-18 2 views
2

패턴 매칭을 할 욕심 매칭 (경기 0 이상), 할 ...을 가지고 내가 이런 식으로 뭔가 일치 할 경우 : 'no를 인쇄라켓 패턴 매칭이 없음 욕심이 일치에게 라켓 - 언어

#lang racket 

(define (Modifier? t) (equal? t "Modifier")) 

(define (SimpleName? t) (equal? t "SimpleName")) 

(define (SimpleType? t) (equal? t "SimpleType")) 

(define (FieldDeclaration? t) (equal? t "FieldDeclaration")) 


(match (match '("FieldDeclaration" ("Modifier") ("Modifier") ("SimpleType") ("VariableDeclarationFragment" ("SimpleName") ("StringLiteral"))) 
    [(list (? FieldDeclaration? id) (? Modifier? m) ... (? SimpleType? t) (list _ (? SimpleName? n)) _ ...) 
'yes] 

    [else 'no]) 

을, 나는 'yes을 기대하고 있습니다. 그래서,

목록에 0 3-("Modifier")의가있을 수있다) ... 그러나 나는 이것에 대해 매우 확실하지 않다, 그것은 which do a greedy matching이 (단지 링크 된 페이지에 "욕심"검색) ...에 의한 추측 이 양식과 어떻게 일치합니까?는 (사실, 그래서 양식을 사용해야하는 기능 XXX?에서 할 많은 일들이 있습니다 (? XXX? x))

PS : 그래서 m 번에 일치하는 N을 의미 n_m 같은 것을 사용할 수 있는가 그것을 가능 extend the matching syntax에 불과 정규 표현식에서 {n,m}을 좋아합니까?

답변

3

사실 ...은 욕심이 많지 않으므로 에 가깝습니다. 두 가지 문제 :

첫째, 귀하의 술어 중 3 개가 잘못되었습니다. 귀하의 입력 내용은 입니다. ("Modifier")"Modifier"이 아니므로 은 (list "Modifier")이 아니며 "Modifier"과 일치해야합니다.

(define (Modifier? t) 
    (equal? t (list "Modifier"))) 

(define (SimpleName? t) 
    (equal? t (list "SimpleName"))) 

(define (SimpleType? t) 
    (equal? t (list "SimpleType"))) 

이 술어는 OK입니다 :

(define (FieldDeclaration? t) 
    (equal? t "FieldDeclaration")) 

둘째, 당신이 템플릿의 마지막 부분에서 잘못 닫는 괄호 있다고 생각 - 그것은 (list _ (? SimpleName? n) _ ...) 하지 (list _ (? SimpleName? n)) _ ...해야한다.

이 여기에 전체 경기의 표현이다, 나는 그것이 더 읽기 내게하기 위해 일부 행 구분에 넣어 :

(match '("FieldDeclaration" 
     ("Modifier") ("Modifier") 
     ("SimpleType") 
     ("VariableDeclarationFragment" ("SimpleName") ("StringLiteral"))) 
    [(list (? FieldDeclaration? id) 
     (? Modifier? m) ... 
     (? SimpleType? t) 
     (list _ (? SimpleName? n) _ ...)) 
    'yes] 
    [_ 'no]) 

'yes를 인쇄합니다.

+0

많은 많은 많은 감사, 그렉 !! 잘 했어!! –

0

그렉은 "사실 ... 욕심이 아니다", 기록하지만, 이러한 예에서와 같이이 ... 욕심 :

내가 '보고 기대했던
[email protected]> (match '(1 2 7 3 4 5 3 6 7 3 8) [(list a ... 3 b ...) (list a b)]) 
'((1 2 7 3 4 5 3 6 7) (8)) 

(match '(1 2 7 3 4 5 3 6 7 3 8) [(list (? number? a) ... 3 b ...) (list a b)]) 
'((1 2 7 3 4 5 3 6 7) (8)) 

((1 2 7) (4 5 3 6 7 3 8)). 나는 접두사를 원하는 곳에 매칭하는 데 문제가 생겼지 만, 욕심 많은 행동을 취하고있다.