3

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私のソースコードにある関数名です)

4

2 に答える 2

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、2番目のアプローチではなく最初のアプローチを使用することをお勧めします。

于 2011-01-25T13:31:06.297 に答える
2

インタラクティブストリームを作成する方法の例は、ML-LexおよびML-Yaccのユーザーガイドの38ページ(または論文では32ページ)に記載されています。

inputLineを使用すると、サンプルコードをより簡単にすることができます。したがって、ユーザーがCTRL-Dを押すと、inputLineが少なくともstdInを使用してNONEを返す可能性があることを念頭に置いて、Sebastianによって提供された例を使用します。

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)は、これを全体として使用する方法を示しています

一般的に、ユーザーガイドにはいくつかの素晴らしい例と説明が含まれています。

于 2011-01-26T08:11:57.977 に答える