2016-04-10 17 views
0

このコードはインターネット上のOCamlの式を評価する方法であり、どのように動作するかを理解しようとしましたが、エディタに入力して実行すると、次のエラーが発生します。OCaml評価関数の構文エラー

type t = 
| Integer of int 
| Binary of binary * t * t 
and binary = 
| Add 
| Sub 
| Mult 
| Div 

type token = 
| INTEGER of int 
| ADD 
| SUB 
| MULT 
| DIV 
let rec eval = function 
| Integer(k) -> k 
| Binary(op, a, b) -> 
(match op with 
| Add -> (+) 
| Sub -> (-) 
| Mult -> (*) 
| Div -> (/)) (eval a) (eval b) 

let lexer s = 
let open Str in 
let split s = 
let rec splitchar x l = 
if x< 0 then l else splitchar (x-1) (s.[x]:: l) in 
splitchar (String.length s -1) [] 
|> List.map 
(function 
| "+" -> ADD 
| "-" -> SUB 
| "*" -> MULT 
| "/" -> DIV 
| _ ->  failwith "lexer: Invalid token: %s");; 

文字280-282: | _ - > failwith "レクサー:無効なトークン:%s")); ^^ エラー:構文エラー

エラーメッセージはあまり役に立ちませんし、状況を悪化させるだけの変更をいくつか試してみました。誰でも私が構文エラーが何であるかを理解することによって始めることができますか?

答えて

1

問題のカップルがあります:

  • 分割が定義されているが使用されていません。
  • failwithには、フォーマットではなく文字列が必要です。最初の問題については

:あなたがList.map前にスプリットを使用する必要があります。

...in split s | List.map... 

failwith文字列を期待して、現在のケースでは、間違いはそれがより多くのAに見える文字列であるということです別の文字列を待つフォーマット文字列。 修正は以下の通りです: - 最初の文字列 をキャッチ - その後、failwith

(function 
| "+" -> ADD <br> 
| "-" -> SUB <br> 
| "*" -> MULT <br> 
| "/" -> DIV <br> 
| _ as s ->  failwith ("lexer: Invalid token: "^s));; 

によって期待される最終列を形成するためにそれを使用しかし、私はすべてのコード全体が動作する時にわからない....