2013-05-12 44 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