使用正则表达式在 SML 中编写语法规则

Writing grammar rules in SML Using Regular Expressions

我想用 SML 为 iCalendar 编写一个到 CSV 的转换器。因此,我需要为它编写语法规则。我了解到某些规则可以通过定义为 datatype 来编写。首先,我在为正则表达式(终端)编写规则时遇到问题。

例如,我想用 SML 编写给定的正则表达式:

label → [a-zA-Z0-9-]+

谁能告诉我如何用 SML 编写此规则?

编辑

到目前为止,我已经声明了一个数据类型variables,它表示语法的各种变量。

datatype variables = Label of String

我已经声明了一个函数isLabel。如果满足给定的正则表达式(通过检查 ASCII 值是否在给定范围内),它将 s(类型 string)和 returns Label(s) 作为输入,否则引发异常.感觉找到解决方法了

其他symbols/variables的语法可以在datatype variables.

中类似定义

请参阅 Unix Programming with Standard ML 第 163+ 页以了解 SML/NJ 正则表达式库的实际应用示例。

步骤:

添加SML/NJ 库。在 smlnj REPL 中使用:

CM.make "$/regexp-lib.cm"

制作正则表达式引擎:

structure RE = RegExpFn (structure P = AwkSyntax
                         structure E = BackTrackEngine)

定义label:

val label = RE.compileString "[a-zA-Z0-9-]+"

定义目标:

val target = "ab9A-f"

根据目标匹配标签:

val match = StringCvt.scanString (RE.find label) target

根据程序逻辑从match中提取值。