【发布时间】:2018-03-29 10:27:35
【问题描述】:
我正在尝试从头开始制作终端解析器(用于解析器组合器)。我的方法是在输入字符串上使用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) 才能从匹配的缺点中获取实际的索引值。)
【问题讨论】:
标签: regex pattern-matching racket parser-combinators