add translator & XML2modelica
[scilab.git] / scilab / modules / scicos / src / translator / parsing / lexer.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 (** Modelica language lexer. *)\r
24 \r
25 (** Implementation based on {i Modelica language specification 2.0 } *)\r
26 \r
27 {\r
28 \r
29 (** Modelica lexer. *)\r
30 \r
31 (** Implementation based on {i Modelica language specification 2.0 } *)\r
32 \r
33 open Parser\r
34 \r
35 let check_reserved = function\r
36     | "algorithm" -> ALGORITHM\r
37     | "and" -> AND\r
38     | "annotation" -> ANNOTATION\r
39     | "block" -> MODEL\r
40     | "break" -> BREAK\r
41     | "class" -> CLASS\r
42     | "connect" -> CONNECT\r
43     | "connector" -> CONNECTOR\r
44     | "constant" -> CONSTANT\r
45     | "discrete" -> DISCRETE\r
46     | "each" -> EACH\r
47     | "else" -> ELSE\r
48     | "elseif" -> ELSEIF\r
49     | "elsewhen" -> ELSEWHEN\r
50     | "encapsulated" -> ENCAPSULATED\r
51     | "enumeration" -> ENUMERATION\r
52     | "end" -> END\r
53     | "equation" -> EQUATION\r
54     | "expandable" -> EXPANDABLE\r
55     | "extends" -> EXTENDS\r
56     | "external" -> EXTERNAL\r
57     | "false" -> FALSE\r
58     | "final" -> FINAL\r
59     | "flow" -> FLOW\r
60     | "for" -> FOR\r
61     | "function" -> FUNCTION\r
62     | "if" -> IF\r
63     | "import" -> IMPORT\r
64     | "in" -> IN\r
65     | "inner" -> INNER\r
66     | "input" -> INPUT\r
67     | "loop" -> LOOP\r
68     | "model" -> MODEL\r
69     | "noEvent" -> NOEVENT\r
70     | "not" -> NOT\r
71     | "or" -> OR\r
72     | "outer" -> OUTER\r
73     | "output" -> OUTPUT\r
74     | "package" -> PACKAGE\r
75     | "parameter" -> PARAMETER\r
76     | "partial" -> PARTIAL\r
77     | "protected" -> PROTECTED\r
78     | "public" -> PUBLIC\r
79     | "record" -> RECORD\r
80     | "redeclare" -> REDECLARE\r
81     | "replaceable" -> REPLACEABLE\r
82     | "restricts" -> RESTRICTS\r
83     | "return" -> RETURN\r
84     | "then" -> THEN\r
85     | "true" -> TRUE\r
86     | "type" -> TYPE\r
87     | "when" -> WHEN\r
88     | "while" -> WHILE\r
89     | "within" -> WITHIN\r
90     | s -> IDENT s\r
91 \r
92 }\r
93 \r
94 let blank = [' ' '\t' '\r']\r
95 let digit = ['0'-'9']\r
96 let nondigit = ['_' 'A'-'Z' 'a'-'z']\r
97 let qchar = [^'`' '\\']\r
98 let schar = [^'\"' '\\']\r
99 let sescape = "\\\'" | "\\\"" | "\\?" | "\\\\" | "\\a" | "\\b" | "\\f" |\r
100               "\\n" | "\\r" | "\\t" | "\\v"\r
101 \r
102 let comment = "/*" ( [^ '*'] | '*'+ [^ '*' '/'] )* '*'+ '/'\r
103 let line_comment = "//" [^ '\n']* '\n'\r
104 \r
105 let separators = (blank | ['\n'] | comment | line_comment)+\r
106 \r
107 let qident = '`' (qchar | sescape)+ '`'\r
108 \r
109 let ident = nondigit (nondigit | digit)* | qident\r
110 \r
111 let unsigned_integer = digit+\r
112 \r
113 let fractional_constant = unsigned_integer? '.' unsigned_integer | unsigned_integer '.'\r
114 \r
115 let exponent_part = ('e' | 'E') ('+' | '-')? unsigned_integer\r
116 \r
117 let unsigned_real = fractional_constant exponent_part? | unsigned_integer exponent_part\r
118 \r
119 rule token = parse\r
120 \r
121   | blank\r
122               { token lexbuf }\r
123 \r
124   | ['\n']\r
125               { token lexbuf }\r
126 \r
127 \r
128   | comment\r
129               { token lexbuf }\r
130 \r
131   | line_comment\r
132               { token lexbuf }\r
133 \r
134   | unsigned_integer as lxm\r
135               { UNSIGNED_INTEGER lxm }\r
136 \r
137   | unsigned_real as lxm\r
138               { UNSIGNED_REAL lxm }\r
139 \r
140   | "initial" separators "algorithm"\r
141               { INITIAL_ALGORITHM }\r
142 \r
143   | "initial" separators "equation"\r
144               { INITIAL_EQUATION }\r
145 \r
146   | "end" separators "for"\r
147               { END_FOR }\r
148 \r
149   | "end" separators "if"\r
150               { END_IF }\r
151 \r
152   | "end" separators "when"\r
153               { END_WHEN }\r
154 \r
155   | "end" separators "while"\r
156               { END_WHILE }\r
157 \r
158   | "end" separators (ident as lxm)\r
159               { END_IDENT lxm }\r
160 \r
161   | ident as lxm\r
162               { check_reserved lxm }\r
163 \r
164   | '\"' ((schar | sescape)* as lxm) '\"'\r
165               { STRING lxm }\r
166 \r
167   | '('       { LP }\r
168   | ')'       { RP }\r
169   | '['       { LSB }\r
170   | ']'       { RSB }\r
171   | '{'       { LCB }\r
172   | '}'       { RCB }\r
173 \r
174   | '.'       { DOT }\r
175   | ','       { CM }\r
176   | ';'       { SC }\r
177   | ':'       { CL }\r
178 \r
179   | '+'       { PLUS }\r
180   | '-'       { MINUS }\r
181   | '*'       { STAR }\r
182   | '/'       { SLASH }\r
183   | '^'       { EXP }\r
184 \r
185   | '='       { EQ }\r
186   | ":="      { COLEQ }\r
187 \r
188   | '<'       { LT }\r
189   | '>'       { GT }\r
190   | "<="      { LE }\r
191   | ">="      { GE }\r
192   | "=="      { EE }\r
193   | "<>"      { NE }\r
194 \r
195   | eof       { EOF }\r
196 \r
197   | _         { raise (SyntacticError\r
198                   {err_msg = ["_IllegalCharacter"];\r
199                    err_info = [];\r
200                    err_ctx =\r
201                      {location = {start = Lexing.lexeme_start lexbuf;\r
202                                   enddd = Lexing.lexeme_end lexbuf;\r
203                                   filename = !inputfile}}}) }\r