add translator & XML2modelica
[scilab.git] / scilab / modules / scicos / src / translator / parsing / linenum.mll
1 (*\r
2  *  Translator from Modelica 2.x to flat Modelica\r
3  *\r
4  *  Copyright (C) 2005 - 2007 Imagine S.A.\r
5  *  For more information or commercial use please contact us at www.amesim.com\r
6  *\r
7  *  This program is free software; you can redistribute it and/or\r
8  *  modify it under the terms of the GNU General Public License\r
9  *  as published by the Free Software Foundation; either version 2\r
10  *  of the License, or (at your option) any later version.\r
11  *\r
12  *  This program is distributed in the hope that it will be useful,\r
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  *  GNU General Public License for more details.\r
16  *\r
17  *  You should have received a copy of the GNU General Public License\r
18  *  along with this program; if not, write to the Free Software\r
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
20  *\r
21  *)\r
22 \r
23 {\r
24 \r
25 (** Convert {! Parser.location } to line and column numbers. *)\r
26 \r
27 let linenum = ref 0\r
28 let linebeg = ref 0\r
29 \r
30 }\r
31 \r
32 rule skip_line = parse\r
33   | [^ '\n' '\r']* ('\n' | '\r' | "\r\n")\r
34       { incr linenum;\r
35         linebeg := Lexing.lexeme_start lexbuf;\r
36         Lexing.lexeme_end lexbuf }\r
37   | [^ '\n' '\r']* eof\r
38       { incr linenum;\r
39         linebeg := Lexing.lexeme_start lexbuf;\r
40         raise End_of_file }\r
41 \r
42 {\r
43 \r
44 let for_position file loc =\r
45   let ic = open_in_bin file in\r
46   let lb = Lexing.from_channel ic in\r
47   linenum := 1;\r
48   linebeg := 0;\r
49   begin try\r
50     while skip_line lb <= loc do () done\r
51   with End_of_file -> ()\r
52   end;\r
53   close_in ic;\r
54   (!linenum - 1, !linebeg)\r
55 \r
56 }\r