我需要创建一个绑定到标准输入流的lexer
的新实例
但是,当我输入
val lexer = makeLexer( fn n => inputLine( stdIn ) );
我收到一条我不明白的错误:
stdIn:1.5-11.13 Error: operator and operand don't agree [tycon mismatch]
operator domain: int -> string
operand: int -> string option
in expression:
(makeLexer
是我的源代码中的函数名称)
答案 0 :(得分:3)
inputLine返回string option
,我的猜测是string
。
您要做的是makeLexer
采取string option
,如下所示:
fun makeLexer NONE = <whatever you want to do when stream is empty>
| makeLexer (SOME s) = <the normal body makeLexer, working on the string s>
或将您的行更改为:
val lexer = makeLexer( fn n => valOf ( inputLine( stdIn ) ) );
valOf采用选项类型并将其解压缩。
请注意,由于inputLine
在流为空时返回NONE
,因此使用第一种方法而不是第二种方法可能更好。
答案 1 :(得分:2)
User's Guide to ML-Lex and ML-Yacc
的第38页(或论文中的32)给出了如何制作交互式流的示例使用inputLine可以简化示例代码。 所以我会使用Sebastian给出的示例,请记住,如果用户按下CTRL-D,inputLine可能会使用stdIn atleast返回NONE。
val lexer =
let
fun input f =
case TextIO.inputLine f of
SOME s => s
| NONE => raise Fail "Implement proper error handling."
in
Mlex.makeLexer (fn (n:int) => input TextIO.stdIn)
end
此外,第40页上的计算器示例(本文中的34)显示了如何在整个
中使用它通常,用户指南包含一些很好的示例和解释。