TXR:编写递归模式匹配指令

时间:2017-04-07 14:51:32

标签: recursion grammar text-processing txr

我无法理解如何在TXR中编写递归模式匹配函数。下面我尝试定义一个用于识别文件路径的递归指令。我知道在这种情况下,我可以用正则表达式([a-z]+\/)+[a-z]+来表示这个语法,但是我有一个更复杂的规则设置,我的真实代码将受益于它。当存在正斜杠时,是什么导致该指令失败?

@(define location)@\
@  (cases)@\
@/[a-z]+/@\
@  (or)@\
@/[a-z]+//@(location)@\
@  (end)@\
@(end)
@(repeat)
@(cases)
@{location (location)}
@  (output)
@location is a valid location.
@  (end)
@(or)
@location
@  (output)
@location is not a valid location.
@  (end)
@(end)
@(end)

示例有效输入:

this/is/valid
this/is/also/valid
this
a/b/c

1 个答案:

答案 0 :(得分:2)

(当然,您几乎肯定知道location与常规语言匹配,我们可以使用正则表达式进行匹配:/[a-z]+(\/[a-z]+)*/。我假设这只是a"递归你好世界"为更复杂的事情做准备。)

关于cases的事情是它使用自上而下的短路评估。第二种情况无法匹配,因为第一种情况与其前缀匹配。它不像正则表达式分支运算符,子表达式的顺序并不重要。

如果我只是交换这两个案例,那么样本对我有效。

还有效(在此特定情况下)将cases更改为somesome指令在第一场比赛时不会停止。

使用some对于这种cases排序问题并不是万能药,因为有时你需要在一个案例周围进行短路来终止递归(例如,在某些条件下避免左递归)被击中)或避免退化的表现(指数时间)。我想起了一位大学教授的笑话:"你听说过分而治之;这是多次投降"

some也具有后面的条款"见"来自早期成功匹配子句的绑定。这可能会干扰它成为cases - 排序问题的解决方案。也就是说,由于变量冲突,后一个子句可能无法匹配。 :resolve的{​​{1}}功能在这种情况下可能会有所帮助,也可能不会。