end of line
[scilab.git] / scilab / modules / scicos / src / translator / parsing / lexer.mll
1 (*
2  *  Translator from Modelica 2.x to flat Modelica
3  *
4  *  Copyright (C) 2005 - 2007 Imagine S.A.
5  *  For more information or commercial use please contact us at www.amesim.com
6  *
7  *  This program is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU General Public License
9  *  as published by the Free Software Foundation; either version 2
10  *  of the License, or (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20  *
21  *)
22
23 (** Modelica language lexer. *)
24
25 (** Implementation based on {i Modelica language specification 2.0 } *)
26
27 {
28
29 (** Modelica lexer. *)
30
31 (** Implementation based on {i Modelica language specification 2.0 } *)
32
33 open Parser
34
35 let check_reserved = function
36     | "algorithm" -> ALGORITHM
37     | "and" -> AND
38     | "annotation" -> ANNOTATION
39     | "block" -> MODEL
40     | "break" -> BREAK
41     | "class" -> CLASS
42     | "connect" -> CONNECT
43     | "connector" -> CONNECTOR
44     | "constant" -> CONSTANT
45     | "discrete" -> DISCRETE
46     | "each" -> EACH
47     | "else" -> ELSE
48     | "elseif" -> ELSEIF
49     | "elsewhen" -> ELSEWHEN
50     | "encapsulated" -> ENCAPSULATED
51     | "enumeration" -> ENUMERATION
52     | "end" -> END
53     | "equation" -> EQUATION
54     | "expandable" -> EXPANDABLE
55     | "extends" -> EXTENDS
56     | "external" -> EXTERNAL
57     | "false" -> FALSE
58     | "final" -> FINAL
59     | "flow" -> FLOW
60     | "for" -> FOR
61     | "function" -> FUNCTION
62     | "if" -> IF
63     | "import" -> IMPORT
64     | "in" -> IN
65     | "inner" -> INNER
66     | "input" -> INPUT
67     | "loop" -> LOOP
68     | "model" -> MODEL
69     | "noEvent" -> NOEVENT
70     | "not" -> NOT
71     | "or" -> OR
72     | "outer" -> OUTER
73     | "output" -> OUTPUT
74     | "package" -> PACKAGE
75     | "parameter" -> PARAMETER
76     | "partial" -> PARTIAL
77     | "protected" -> PROTECTED
78     | "public" -> PUBLIC
79     | "record" -> RECORD
80     | "redeclare" -> REDECLARE
81     | "replaceable" -> REPLACEABLE
82     | "restricts" -> RESTRICTS
83     | "return" -> RETURN
84     | "then" -> THEN
85     | "true" -> TRUE
86     | "type" -> TYPE
87     | "when" -> WHEN
88     | "while" -> WHILE
89     | "within" -> WITHIN
90     | s -> IDENT s
91
92 }
93
94 let blank = [' ' '\t' '\r']
95 let digit = ['0'-'9']
96 let nondigit = ['_' 'A'-'Z' 'a'-'z']
97 let qchar = [^'`' '\\']
98 let schar = [^'\"' '\\']
99 let sescape = "\\\'" | "\\\"" | "\\?" | "\\\\" | "\\a" | "\\b" | "\\f" |
100               "\\n" | "\\r" | "\\t" | "\\v"
101
102 let comment = "/*" ( [^ '*'] | '*'+ [^ '*' '/'] )* '*'+ '/'
103 let line_comment = "//" [^ '\n']* '\n'
104
105 let separators = (blank | ['\n'] | comment | line_comment)+
106
107 let qident = '`' (qchar | sescape)+ '`'
108
109 let ident = nondigit (nondigit | digit)* | qident
110
111 let unsigned_integer = digit+
112
113 let fractional_constant = unsigned_integer? '.' unsigned_integer | unsigned_integer '.'
114
115 let exponent_part = ('e' | 'E') ('+' | '-')? unsigned_integer
116
117 let unsigned_real = fractional_constant exponent_part? | unsigned_integer exponent_part
118
119 rule token = parse
120
121   | blank
122               { token lexbuf }
123
124   | ['\n']
125               { token lexbuf }
126
127
128   | comment
129               { token lexbuf }
130
131   | line_comment
132               { token lexbuf }
133
134   | unsigned_integer as lxm
135               { UNSIGNED_INTEGER lxm }
136
137   | unsigned_real as lxm
138               { UNSIGNED_REAL lxm }
139
140   | "initial" separators "algorithm"
141               { INITIAL_ALGORITHM }
142
143   | "initial" separators "equation"
144               { INITIAL_EQUATION }
145
146   | "end" separators "for"
147               { END_FOR }
148
149   | "end" separators "if"
150               { END_IF }
151
152   | "end" separators "when"
153               { END_WHEN }
154
155   | "end" separators "while"
156               { END_WHILE }
157
158   | "end" separators (ident as lxm)
159               { END_IDENT lxm }
160
161   | ident as lxm
162               { check_reserved lxm }
163
164   | '\"' ((schar | sescape)* as lxm) '\"'
165               { STRING lxm }
166
167   | '('       { LP }
168   | ')'       { RP }
169   | '['       { LSB }
170   | ']'       { RSB }
171   | '{'       { LCB }
172   | '}'       { RCB }
173
174   | '.'       { DOT }
175   | ','       { CM }
176   | ';'       { SC }
177   | ':'       { CL }
178
179   | '+'       { PLUS }
180   | '-'       { MINUS }
181   | '*'       { STAR }
182   | '/'       { SLASH }
183   | '^'       { EXP }
184
185   | '='       { EQ }
186   | ":="      { COLEQ }
187
188   | '<'       { LT }
189   | '>'       { GT }
190   | "<="      { LE }
191   | ">="      { GE }
192   | "=="      { EE }
193   | "<>"      { NE }
194
195   | eof       { EOF }
196
197   | _         { raise (SyntacticError
198                   {err_msg = ["_IllegalCharacter"];
199                    err_info = [];
200                    err_ctx =
201                      {location = {start = Lexing.lexeme_start lexbuf;
202                                   enddd = Lexing.lexeme_end lexbuf;
203                                   filename = !inputfile}}}) }