123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354(************************************************************************)(* The λΠ-modulo Interactive Proof Assistant *)(************************************************************************)(************************************************************************)(* λΠ-modulo serialization Toplevel *)(* Copyright Inria -- Dual License LGPL 2.1 / GPL3+ *)(* Written by: F. Blanqui, E. J. Gallego Arias, F. Lefoulon *)(************************************************************************)(* Status: Experimental *)(************************************************************************)(* We follow LSP denominations except for end_ being reserved in OCaml. *)typepoint={line:int;character:int}typet={start:point;end_:point}letmake_pointlinecharacter={line;character}letmake_intervalstartend_=(* Fixme: don't rely on the lexicographic order *)assert(start<=end_);{start;end_}letlinept=pt.lineletcolumnpt=pt.characterletinterval_starti=i.startletinterval_endi=i.end_typecmp=Before|In|Afterletin_rangepos{start;end_}=(* Comparison operators work as lexicographic comparison on points (meaning
l is compared, then c is compared). *)ifpos<startthenBeforeelseifpos>end_thenAfterelseInletcompare{start=s1;end_=f1}{start=s2;end_=f2}=if(s1>=s2&&f1<=f2)||(s1<=s2&&f1>=f2)then0elseiff1<=s2then-1elseifs1>=f2then1elsefailwith"Intervals overlap, no inclusion between the two"letpoint_to_stringpt="Line : "^string_of_intpt.line^"; Column : "^string_of_intpt.character^"\n"letinterval_to_string{start;end_}="From :\n"^point_to_stringstart^"To :\n"^point_to_stringend_lettranslate{start;end_}dsdf=lets2=make_point(linestart)(columnstart-ds)inletf2=make_point(lineend_)(columnend_+df)inassert(s2<=f2);make_intervals2f2