처음부터 파서 연결자 용 터미널 파서를 만들려고합니다. 내 접근 방식은 입력 문자열에 regexp-match-positions*
을 사용하고 패턴이 첫 번째 위치에서 발견되면 분할 문자열을 출력합니다.문자열 시작 부분의 정규 표현식으로 일치 및 분할
이것은 지금까지 내가있어 무엇 :
#lang racket/base
(require racket/match)
(define (make-terminal-parser pattern)
(define (regexp-match-from-start pattern input)
(match (regexp-match-positions* pattern input)
[(list (cons 0 x) ...)
(let ([index (car x)])
(values (substring input 0 index)
(substring input index)))]
[_ (error "Not found!")]))
(lambda (input)
(regexp-match-from-start pattern input)))
(define ALPHA (make-terminal-parser #rx"[a-zA-Z]"))
(ALPHA "hello")
내 ALPHA
가 작동하지 않는 것 그리고 내가 때문에 아무것도 동일시하지 일치하는 패턴으로 생각합니다. REPL에서 (regexp-match-positions* #rx"[a-zA-Z]" "hello")
은 내가 무엇을 기대하는지 ('((0 . 1) (1 . 2) etc.)
) 출력하므로 (list (cons 0 x) ...)
과 일치하지 않는 이유를 실제로 이해하지 못합니다. 정규 표현식을 #rx"h"
으로 변경하면 올바르게 문자열이 분할됩니다. 그러나 이것은 분명히 너무 구체적입니다.
(car x)
에 필요한 이유를 이해하지 않습니다.)