使用ml-lex构建词法分析器

时间:2011-01-25 13:24:02

标签: sml ml ml-lex

我需要创建一个绑定到标准输入流的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是我的源代码中的函数名称)

2 个答案:

答案 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)显示了如何在整个

中使用它

通常,用户指南包含一些很好的示例和解释。