4

この例を実装しましたが、うまく機能します。

ここで、 から読み取るのではなく、文字列から読み取りたいので、次stdinのように変更しcalc.mlます。

let _ =
  try
    let lexbuf = Lexing.from_string "1+3" in
    let result = Parser.main Lexer.token lexbuf in
    print_int result
  with Lexer.Eof ->
    print_string "Lexer.Eof";
    exit 0

そして奇妙なことにLexer.Eof、結果として返されます。と から削除| eof { raise Eof }するlexer.mllと、 と表示されますFatal error: exception Failure("lexing: empty token")。条件の周りに何か問題があると思いend-of-inputます...文字列をレックスできるようにレクサーを変更する方法を知っている人はいますか?

4

1 に答える 1

4

EOL を忘れた場合:

let _ =
  try
    let lexbuf = Lexing.from_string "1+3\n" in
    let result = Parser.main Lexer.token lexbuf in
    print_int result
  with Lexer.Eof ->
    print_string "Lexer.Eof";
    exit 0

編集

または、EOL を追加したくない場合:

parser.mly、トークンを追加し、次の操作を行いますEOF

| expr EOF                    { $1 }

ではlexer.mll、eof を上げずにトークンを返しますEOF

| eof            { EOF }

そして最後に、calc.ml:

let _ =
    let lexbuf = Lexing.from_string "3+1" in
    let result = Parser.main Lexer.token lexbuf in
    print_int result
于 2012-12-21T14:31:36.313 に答える