OCaml 中的语言词法分析器
language lexer in OCaml
我正在尝试在 Ocaml 中实现词法分析器。我首先需要做的部分工作是获取一个字符串并将它们拆分为字符串列表,以便稍后我可以 "tokenize" 它们并将其放入解析器中。它需要通过忽略空格、制表符、换行符等来遵循基本操作指南。例如:
"1 + 25 *(6^2)"
应该return
["1"; "+"; "25"; "*"; "("; "6"; "^"; "2"; ")"]
如果一个字符串的开头可以是多个东西,应该优先匹配最长的,例如:
"1-1" should be split as ["1"; "-1"] since "-1" is a longer match than just "-"
我正在尝试用 Str.regex
完成第一步,但它的功能还不足以完美地拆分它。我的代码:
Str.split (Str.regexp "[ \t\n]+") input
取 input
并根据 [ \t\n]+
拆分它们,所以这里的问题是,如果我有类似 (5 + 6^8)
的东西,它将 return ["(5"; "+"; "6^8)"]
而不是 ["("; "5"; "+"; "6"; "^"; "8"; ")"]
.
知道我怎样才能做得更好吗?
这就是 ocamllex
的用途。您将需要一个更明确的词法结构列表,而不是想象只是按空格拆分。
作为旁注,请务必阅读描述支持哪些正则表达式结构的部分。一个常见的问题是尝试使用其他语言不支持的结构。
不管怎样,在词汇层面处理负数是很棘手的,因为你通常想要支持像 "x-1" 这样的东西。如果您尝试按词法处理负数,则会出现两个标记。
更新
如果你不会用ocamllex,你还需要从一组正则表达式的角度来思考。
如果您可以使用 Str 模块,则可以使用 Str.regexp
创建与 ocamllex 相同的正则表达式集。要获取下一个标记,请匹配所有正则表达式并进行最长匹配。 (要打破长度上的关系,对正则表达式进行排序并取最长长度的第一个匹配项。)
我正在尝试在 Ocaml 中实现词法分析器。我首先需要做的部分工作是获取一个字符串并将它们拆分为字符串列表,以便稍后我可以 "tokenize" 它们并将其放入解析器中。它需要通过忽略空格、制表符、换行符等来遵循基本操作指南。例如:
"1 + 25 *(6^2)"
应该return
["1"; "+"; "25"; "*"; "("; "6"; "^"; "2"; ")"]
如果一个字符串的开头可以是多个东西,应该优先匹配最长的,例如:
"1-1" should be split as ["1"; "-1"] since "-1" is a longer match than just "-"
我正在尝试用 Str.regex
完成第一步,但它的功能还不足以完美地拆分它。我的代码:
Str.split (Str.regexp "[ \t\n]+") input
取 input
并根据 [ \t\n]+
拆分它们,所以这里的问题是,如果我有类似 (5 + 6^8)
的东西,它将 return ["(5"; "+"; "6^8)"]
而不是 ["("; "5"; "+"; "6"; "^"; "8"; ")"]
.
知道我怎样才能做得更好吗?
这就是 ocamllex
的用途。您将需要一个更明确的词法结构列表,而不是想象只是按空格拆分。
作为旁注,请务必阅读描述支持哪些正则表达式结构的部分。一个常见的问题是尝试使用其他语言不支持的结构。
不管怎样,在词汇层面处理负数是很棘手的,因为你通常想要支持像 "x-1" 这样的东西。如果您尝试按词法处理负数,则会出现两个标记。
更新
如果你不会用ocamllex,你还需要从一组正则表达式的角度来思考。
如果您可以使用 Str 模块,则可以使用 Str.regexp
创建与 ocamllex 相同的正则表达式集。要获取下一个标记,请匹配所有正则表达式并进行最长匹配。 (要打破长度上的关系,对正则表达式进行排序并取最长长度的第一个匹配项。)