我試圖從頭開始編寫終端解析器(用於解析器組合器)。我的方法是在輸入字符串上使用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)
獲得實際的指標值進行匹配的利弊。)