私は、パーサーコンビネータ用のターミナルパーサーをゼロから作成しようとしています。私のアプローチは、入力文字列に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)
する必要がある理由私は理解していない。)