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

时间:2015-03-28 17:28:14

标签: regex csv icalendar sml

我想在iML中将iCalendar的转换器写入CSV。因此,我需要为它编写语法规则。我理解某些规则可以通过将它们定义为datatype来编写。首先,我面临着为正则表达式(终端)编写规则的问题。

作为一个例子,我想用SML编写给定的Regex:

  

标签→[a-zA-Z0-9 - ] +

有人能告诉我如何用SML编写这个规则吗?

修改

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

datatype variables = Label of String

我已声明了一个函数isLabel。它接受输入s(类型string)并返回Label(s)如果它满足给定的正则表达式(通过检查ASCII值是否位于给定范围内),否则引发异常。我觉得我找到了解决问题的方法。

语法的其他符号/变量可以在datatype variables.

中类似地定义

1 个答案:

答案 0 :(得分:2)

有关SML / NJ正则表达式库的示例,请参阅Unix Programming with Standard ML第163页以及。

步骤:

添加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中提取值。