使用正则表达式在 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
中提取值。
我想用 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
中提取值。