我想在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.
答案 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
中提取值。