gpt4 book ai didi

pattern-matching - 如何使用 Racket 匹配从堆栈顶部解析 - 关闭贪婪 '...'

转载 作者:行者123 更新时间:2023-12-02 01:42:57 25 4
gpt4 key购买 nike

我有一个解析器,正在寻找堆栈顶部的模式。

例如,'3' 是分隔符,我想要堆栈顶部的下一个项目 否不管那个项目恰好是什么,尽管在这个例子中项目恰好是'(1 2 7)。我这样做:

racket@match.rkt> (match '(1 2 7 3 4 5 3 6 7 3 8) [(list i ... 3 s ...) (list i s)])
'((1 2 7 3 4 5 3 6 7) (8))

(match '(1 2 7 3 4 5 3 6 7 3 8) [(list (? number? i) ... 3 s ...) (list i s)])
'((1 2 7 3 4 5 3 6 7) (8))

我原以为会看到“((1 2 7) (4 5 3 6 7 3 8))”,但因为“...”是“贪婪的”,所以我得到了几乎整个堆栈 - 这不是我想要的.

有没有一种简单的方法可以从堆栈顶部拉出带图案的项目?

这是第二个示例,使用更熟悉的 xml,如“标签”而不是数字。这里我们有一个文件,它是一个标签流,我们想要文件的第一部分,所以:

racket> (match 
(list "<apple>" "apple-stuff" "</apple>"
"<orange>" "orange-stuff" "</orange>"
"<apple>" "more-apple-stuff" "</apple>"
)
[(list "<apple>" a-stuff ... "</apple>" etc ...)
a-stuff
]
)

所以人们可能认为 a-stuff 是“apple-stuff”,但实际上 a-stuff 绑定(bind)到文件的整个其余部分:

  a-stuff>
'("apple-stuff"
"</apple>"
"<orange>"
"orange-stuff"
"</orange>"
"<apple>"
"more-apple-stuff")

这些只是简单的字符串匹配,如果我们有结构化的标记,匹配规则将变得更加复杂,并且“...”意味着“匹配直到结束并退后一步”将与许多人有更细微的区别expect,这是“向前匹配直到下一个模式匹配”。

最佳答案

一种方法是更改​​ i ... 以匹配非 3。

如果你正在搜索像 3 这样的固定数据,那么你可以这样做:

(match '(1 2 7 3 4 5 3 6 7 3 8) 
[(list (and i (not 3)) ... 3 s ...) (list i s)])

如果你需要搜索一个非数据,那么你可以使用:

(let ([stop-value 3])
(match '(1 2 7 3 4 5 3 6 7 3 8)
[(list (and i (not (== stop-value))) ... stop-value s ...) (list i s)]))

关于pattern-matching - 如何使用 Racket 匹配从堆栈顶部解析 - 关闭贪婪 '...',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392379/

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