2013-05-12 25 views
1

我想要編譯Libra toolkit運行Ubuntu哈代與OCaml的3.10的機器上之前NEW_LINE等價,我不能升級操作系統,也沒有更新OCaml的,我不知道OCaml的事情。只有一條線,讓我一個綁定值錯誤,因爲它使用的NEW_LINE功能,這是在ocaml的3.11(http://caml.inria.fr/pub/docs/manual-ocaml/libref/Lexing.html)介紹,有人能告訴我如何改變它與OCaml的3.10兼容?它的鄰近該代碼的末尾行:OCaml的:3.11

{ 
open MnParseTypes;; 
open MnParser;; 
(* Raised when parsing ends *) 
exception Eof;; 

module L = Lexing 
let linenum lexbuf = lexbuf.L.lex_curr_p.L.pos_lnum 

let line = ref 1;; 

let keywords = Hashtbl.create 10 
let _ = 
    List.iter2 (Hashtbl.add keywords) 
    ["mn"; "features"; "tree"; "table"; "w"; "eof"] 
    [Tmn; Tfeatures; Ttree; Ttable; Tweight; EOF];; 
} 

let digits = ['0'-'9']+ 
let identifier = ['a'-'z' 'A'-'Z']+ 

rule lexer = parse 
(* eat blank characters *) 
    [' ' '\t'] {lexer lexbuf} 
(* | "Feature list:" {lexer lexbuf} *) 
    | '{' {Tlbrace} 
    | '}' {Trbrace} 
    | '(' {Tlparen} 
    | ')' {Trparen} 
    | ('-')? "inf" {Tfloat(float_of_string(L.lexeme lexbuf))} 
    | identifier { 
     let x = String.lowercase (Lexing.lexeme lexbuf) in 
     try Hashtbl.find keywords x 
     with Not_found -> 
     failwith((Lexing.lexeme lexbuf) 
     ^": unknown identifier on line "^string_of_int (linenum lexbuf))} 
    | digits {Tint (int_of_string (L.lexeme lexbuf))} 
    | ('-')? digits ('.' digits)? (['e' 'E'] ['+' '-']? digits)? 
     {Tfloat(float_of_string(L.lexeme lexbuf))} 
    | '+' 'v' (digits as var) '_' (digits as value) 
     {Tcond(true, int_of_string var, int_of_string value)} 
    | '-' 'v' (digits as var) '_' (digits as value) 
     {Tcond(false, int_of_string var, int_of_string value)} 
    | 'v' (digits as var) '_' (digits as value) 
     {Tvar(int_of_string var, int_of_string value)} 
    | ['\n' '\r']+ {L.new_line lexbuf; TEOL} (* THIS GIVES THE ERROR *) 
    | eof {EOF} 
    | _ {failwith((L.lexeme lexbuf)^
     ": mistake on line "^string_of_int lexbuf.L.lex_curr_p.L.pos_lnum)} 
+0

這將幫助,它實際上是說我想要做什麼的功能,但我不知道如何將它插入我的代碼:http://caml.inria.fr/mantis/view.php?id=3930 – user2059990 2013-05-12 03:41:33

+0

我試圖使用這樣的:在 '(*讓start_next_line lexbuf =()*) 讓start_next_line lexbuf = 讓LCP = lexbuf.lex_curr_p lexbuf.lex_curr_p < - { LCP與 pos_lnum = lcp.pos_lnum + 1 ; pos_bol = lcp.pos_cnum;} }'然後'| ['\ n''\ r'] + {start_next_line lexbuf; TEOL}'但是我得到錯誤**致命錯誤:異常Data.Eof **有時候 – user2059990 2013-05-12 04:04:39

+0

如果相關,你應該在你的問題體中包含這些錯誤。 – didierc 2013-05-12 08:18:18

回答

3

在OCaml的源(從SVN或RELASE壓縮包)的目錄,標準庫的模塊Foo的源將在stdlib/foo.{ml,mli}.mli是接口文件,.ml執行文件)。看着stdlib/lexing.ml爲您提供:

let new_line lexbuf = 
    let lcp = lexbuf.lex_curr_p in 
    lexbuf.lex_curr_p <- { lcp with 
    pos_lnum = lcp.pos_lnum + 1; 
    pos_bol = lcp.pos_cnum; 
    } 

你可以在你的代碼實現這個爲好,用open Lexing有範圍的字段名稱,或使用lexbuf.Lexing.lex_curr_p{ lcp with Lexing.pos_lnum = lcp.Lexing.pos_lnum ...來代替。

編輯:因爲你可能不打算自己破解OCaml的代碼,讓我們給你完整的東西:

let new_line lexbuf = 
    let lcp = lexbuf.Lexing.lex_curr_p in 
    lexbuf.Lexing.lex_curr_p <- { lcp with 
    Lexing.pos_lnum = lcp.Lexing.pos_lnum + 1; 
    Lexing.pos_bol = lcp.Lexing.pos_cnum; 
    } 

在文件中使用new_line(如果它說Lexing.new_line頂部添加此,把它變成new_line),你應該沒問題。

+0

我試過,但我得到了分段錯誤和「致命錯誤:異常數據。Eof「與一些輸入文件,我在他們看到的唯一的東西是他們可能比其他更大 – user2059990 2013-05-12 19:48:42

+0

我剛剛發現我在修改文件時犯了一個錯誤,我按照你的說法改變了行解析新線'| [「\ n」「\ r」] + {NEW_LINE lexbuf; TEOL}!'現在它的工作原理非常感謝你 – user2059990 2013-05-12 20:49:04

2

您可以實現new_line自己,但我想升級OCaml的效果會更好。我知道你說你不能升級操作系統,但是可以在你的主目錄下安裝新版本的Ocaml,而不需要任何超級用戶權限。 OPAM是OCaml的數據包管理器,可以很容易地安裝最新版本的OCaml。

+0

我無法安裝OPAM,我無法改變的來源。.LIST和我試圖下載ocamlbrew,捲曲時「無法解析主機」我可以使用沒有問題易於得到,但我不能使用捲曲或wget的 – user2059990 2013-05-12 20:21:23

+0

只抓ocaml的來源和編譯。這並不難,OPAM非常棒,因爲它更簡化了流程,並且使處理依賴性變得非常簡單,但是如果你沒有安裝那麼多的庫,你可以「手工」構建一切。 'configure && make && make install')。你甚至可以看看debian軟件包的依賴關係,以瞭解哪些來源你需要(除ocaml lang之外的其他東西),並使用debian打包數據將你的構建與系統正確集成。由於您使用的是Ubuntu,所以爲什麼不升級到更新的版本? – didierc 2013-05-14 01:47:43

+0

? – didierc 2013-05-14 01:50:39