我正在尝试实现匹配“语法”和语言的模式。 我知道正则表达式,但这些对我的范围来说还不够。 我个别化了一些“数学”运算符。 在下面的例子中,我将假设模式mathing的主题是字符串,但它不是必需的。
阅读下面的描述:问题是,是否有任何机构知道一种数学理论,该数学理论明确表示采用相同方法实现它的语言或任何语言?我想看看它是为了有想法!
方法的描述:
起初我们有角色。可以聚合字符以形成字符串。
模式是: a)单个字符 b)运算符matchAny的有序模式组 c)运算符matchAll的有序模式组 d)其他各种运营商稍后会看到。
说明: 我们有一个主题字符串和一个起始位置。
如果我们检查单个字符的匹配,那么如果它匹配则将当前位置向前移动一个位置。
如果我们检查一个有序的模式组与运算符matchAny的匹配,那么它将按顺序检查组中的每个元素,并且我们将获得多个起始位置,这些位置将乘以可能的匹配数量按比赛的长度提前。
E.G假设模式组是{“a”“aba”“ab”“x”“dd”}并且正在检查的字符串是: “Dabaxddc”,当前位置为2(从1开始计算)。 然后将matchAny应用于前一组,我们得到“a”数学“aba”匹配,“ab”匹配,而“x”和“dd”不匹配。 在进行了这些比赛之后,有3个起始位置3 4 5(对应于“a”“ab”“aba”)。
我们可以通过接受多个起始位置来继续我们的模式匹配。所以现在我们可以继续检查下一个案例并检查一下matchAll。 matchAll表示所有模式必须按顺序匹配并按顺序应用。 matchAll的子类是match0 + match1 + etc。
我必须补充一点,尝试提出这个问题的同样事实已经帮助了我并清除了一些东西。 但我想知道类似的方法来研究它们。 请只使用您使用的语言,而不是参考书目!
答案 0 :(得分:1)
我建议您查看论文"Parsing Permutation Phrases"。它涉及以任何顺序识别一组事物,其中“事物”可以是识别者本身。论文中的陈述可能与您的期望略有不同;他们不编译成有限自动机。但是,它们确实以函数式语言实现,并且对您有所帮助。
答案 1 :(得分:1)
您对模式匹配字符串的描述正是编译器所做的。特别是,您对多个潜在匹配的描述非常让人联想到LR解析器的工作方式。
如果模式是静态的并且可以由EBNF描述,那么您可以使用LR解析器生成器(例如YACC)来生成识别器。
如果模式是动态的,但仍可以表示为EBNF,则可以应用其他工具。它变得有点复杂。
[至少在澳大利亚,计算机科学是1975年的大学课程,当时我做了我的。 YACC的历史可以追溯到1970年左右。 EBNF甚至更老了。]