0

我正在尝试实现匹配“语法”和语言的模式。我知道正则表达式,但这些对于我的范围来说还不够。我已经个性化了一些“数学”运算符。在下面的示例中,我将假设模式数学的主题是字符串,但这不是必需的。

阅读了下面的描述:问题是,有没有人知道一个数学理论明确地表明了这一点,或者任何语言都采用了相同的方法来实现它?我想看看它以便有想法!

方法描述:

起初我们有字符。字符可以聚合形成字符串。

模式是:a) 单个字符 b) 具有操作符 matchAny 的有序模式组 c) 具有操作符 matchAll 的有序模式组 d) 稍后会看到的其他各种运算符。

说明:我们有一个主题字符串和一个起始位置。

如果我们检查单个字符的匹配,那么如果匹配,则将当前位置向前移动一个位置。

如果我们使用操作符 matchAny 检查有序模式组的匹配,那么它将按顺序检查组中的每个元素,并且我们将有一个起始位置的扩散,这些起始位置将乘以可能的匹配数量。比赛的长度。

EG 假设模式组是 { "a" "aba" "ab" "x" "dd" } 并且正在检查的字符串是:"Dabaxddc",当前位置为 2(从 1 开始计数)。然后将 matchAny 与前一组应用,我们得到 "a" mathces "aba" 匹配和 "ab" 匹配,而 "x" 和 "dd" 不匹配。在进行这些匹配之后,有 3 个起始位置 3 4 5(对应于 "a" "ab" "aba" )。

我们可以通过接受多个起始位置来继续我们的模式匹配。所以现在我们可以继续检查下一个案例并检查 matchAll。matchAll 表示所有模式必须按顺序匹配并按顺序应用。matchAll 的子情况是 match0+ match1+ 等。

我必须补充一点,试图提出这个问题的同样事实已经帮助了我并清除了一些事情。但我想知道类似的方法来研究它们。请仅使用您使用的语言,而不是参考书目!!!

4

2 回答 2

1

您对匹配字符串与模式的描述正是编译器所做的。特别是,您对多个潜在匹配的描述非常让人联想到 LR 解析器的工作方式。

如果模式是静态的并且可以由 EBNF 描述,那么您可以使用 LR 解析器生成器(例如 YACC)来生成识别器。

如果模式是动态的,但仍可以表述为 EBNF,则可以应用其他工具。它只是变得有点复杂。

[至少在澳大利亚,计算机科学是 1975 年的一门大学课程,当时我是我的。YACC 的原始形式可以追溯到 1970 年左右。EBNF 甚至更老。]

于 2014-03-15T14:33:10.363 回答
1

我建议你看看论文“Parsing Permutation Phrases”。它处理以任何顺序识别一组事物,其中“事物”本身可以是识别器。论文中的介绍可能与您的预期有所不同;它们不会编译为有限自动机。但是,它们确实提供了函数式语言的实现,这应该对您有所帮助。

于 2014-02-09T23:39:25.037 回答