我正在使用 OCaml 为 Scheme 的子集构建递归下降解析器。这是语法:
S -> a|b|c|(T)
T -> ST | Epsilon
所以说我有:
type expr =
Num of int | String of string | Tuple of expr * expr
伪代码
这些函数必须返回 expr 类型来构建 AST
parseS lr =
if head matches '(' then
parseL lr
else
match tokens a, b, or c
使用第一组 S,它们是令牌和 '(':
parseL lr =
if head matches '(' or the tokens then
Tuple (parseS lr, parseL lr)
else
match Epsilon
我的问题是“我如何返回 Epsilon 部分,因为我无法返回 ()?”。OCaml 函数需要相同的返回类型,即使我将 Epsilon 部分留空,OCaml 仍然采用单位类型。