(item "This is a" (subitem "Te-6ren">
gpt4 book ai didi

使用 Scheme 解析字符串

转载 作者:行者123 更新时间:2023-12-01 04:01:06 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的解析器,它从字符串 e.xml 创建一个 sxml 表达式。 G。

"This is a [Test]" ===> (item "This is a" (subitem "Test"))

任何想知道给定示例中的方括号的人都可以查看所谓的 Leiden conventions .

这是我到目前为止编写的代码:
(define my-sequence '("this" "[" "is" "a" "]" "test"))

(define (left-square-bracket? item)
(or (equal? item "[")
(eq? item #\x005b)))

(define (right-square-bracket? item)
(or (equal? item "]")
(eq? item #\x005d)))

(define (parse-sequence sequence)
(cond ((null? sequence) '())
((left-square-bracket? (car sequence))
(let ((subsequence (get-subsequence (cdr sequence))))
(list subsequence)))
(else
(cons (car sequence)
(parse-sequence (cdr sequence))))))

(define (get-subsequence sequence)
(if (right-square-bracket? (car sequence))
'()
(cons (car sequence)
(get-subsequence (cdr sequence)))))

正在评估 (parse-sequence my-sequence) yield ("this" ("is" "a")) .已创建嵌套表达式,但程序在没有计算最后一项的情况下完成 "test" .问题是,我如何从 get-subsequence 返回至 parse-sequence ?

任何帮助表示赞赏,非常感谢提前! :)

最佳答案

要解决您最初的问题,如何返回多个值:使用“值”表单。这是一个示例实现,其中内部过程返回要处理的剩余列表和到目前为止的结果。它在左括号上递归。

(define (parse-sequence lst)

(define (parse-seq lst)
(let loop ((lst lst) (res null))
(cond
((null? lst) (values null res))
((string=? (car lst) "[")
(let-values ([(lst2 res2) (parse-seq (cdr lst))])
(loop lst2 (append res (list res2)))))
((string=? (car lst) "]")
(values (cdr lst) res))
(else
(loop (cdr lst) (append res (list (car lst))))))))

(let-values ([(lst res) (parse-seq lst)])
res))

然后
(parse-sequence '("this" "is" "a" "test"))
(parse-sequence '("this" "[" "is" "a" "]" "test"))
(parse-sequence '("this" "[" "is" "[" "a" "]" "]" "test"))

会屈服
'("this" "is" "a" "test")
'("this" ("is" "a") "test")
'("this" ("is" ("a")) "test")

关于使用 Scheme 解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com