end of line
[scilab.git] / scilab / modules / scicos / src / translator / parsing / lexer.mll
index 31618b6..c93ebc2 100644 (file)
-(*\r
- *  Translator from Modelica 2.x to flat Modelica\r
- *\r
- *  Copyright (C) 2005 - 2007 Imagine S.A.\r
- *  For more information or commercial use please contact us at www.amesim.com\r
- *\r
- *  This program is free software; you can redistribute it and/or\r
- *  modify it under the terms of the GNU General Public License\r
- *  as published by the Free Software Foundation; either version 2\r
- *  of the License, or (at your option) any later version.\r
- *\r
- *  This program is distributed in the hope that it will be useful,\r
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- *  GNU General Public License for more details.\r
- *\r
- *  You should have received a copy of the GNU General Public License\r
- *  along with this program; if not, write to the Free Software\r
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
- *\r
- *)\r
-\r
-(** Modelica language lexer. *)\r
-\r
-(** Implementation based on {i Modelica language specification 2.0 } *)\r
-\r
-{\r
-\r
-(** Modelica lexer. *)\r
-\r
-(** Implementation based on {i Modelica language specification 2.0 } *)\r
-\r
-open Parser\r
-\r
-let check_reserved = function\r
-    | "algorithm" -> ALGORITHM\r
-    | "and" -> AND\r
-    | "annotation" -> ANNOTATION\r
-    | "block" -> MODEL\r
-    | "break" -> BREAK\r
-    | "class" -> CLASS\r
-    | "connect" -> CONNECT\r
-    | "connector" -> CONNECTOR\r
-    | "constant" -> CONSTANT\r
-    | "discrete" -> DISCRETE\r
-    | "each" -> EACH\r
-    | "else" -> ELSE\r
-    | "elseif" -> ELSEIF\r
-    | "elsewhen" -> ELSEWHEN\r
-    | "encapsulated" -> ENCAPSULATED\r
-    | "enumeration" -> ENUMERATION\r
-    | "end" -> END\r
-    | "equation" -> EQUATION\r
-    | "expandable" -> EXPANDABLE\r
-    | "extends" -> EXTENDS\r
-    | "external" -> EXTERNAL\r
-    | "false" -> FALSE\r
-    | "final" -> FINAL\r
-    | "flow" -> FLOW\r
-    | "for" -> FOR\r
-    | "function" -> FUNCTION\r
-    | "if" -> IF\r
-    | "import" -> IMPORT\r
-    | "in" -> IN\r
-    | "inner" -> INNER\r
-    | "input" -> INPUT\r
-    | "loop" -> LOOP\r
-    | "model" -> MODEL\r
-    | "noEvent" -> NOEVENT\r
-    | "not" -> NOT\r
-    | "or" -> OR\r
-    | "outer" -> OUTER\r
-    | "output" -> OUTPUT\r
-    | "package" -> PACKAGE\r
-    | "parameter" -> PARAMETER\r
-    | "partial" -> PARTIAL\r
-    | "protected" -> PROTECTED\r
-    | "public" -> PUBLIC\r
-    | "record" -> RECORD\r
-    | "redeclare" -> REDECLARE\r
-    | "replaceable" -> REPLACEABLE\r
-    | "restricts" -> RESTRICTS\r
-    | "return" -> RETURN\r
-    | "then" -> THEN\r
-    | "true" -> TRUE\r
-    | "type" -> TYPE\r
-    | "when" -> WHEN\r
-    | "while" -> WHILE\r
-    | "within" -> WITHIN\r
-    | s -> IDENT s\r
-\r
-}\r
-\r
-let blank = [' ' '\t' '\r']\r
-let digit = ['0'-'9']\r
-let nondigit = ['_' 'A'-'Z' 'a'-'z']\r
-let qchar = [^'`' '\\']\r
-let schar = [^'\"' '\\']\r
-let sescape = "\\\'" | "\\\"" | "\\?" | "\\\\" | "\\a" | "\\b" | "\\f" |\r
-              "\\n" | "\\r" | "\\t" | "\\v"\r
-\r
-let comment = "/*" ( [^ '*'] | '*'+ [^ '*' '/'] )* '*'+ '/'\r
-let line_comment = "//" [^ '\n']* '\n'\r
-\r
-let separators = (blank | ['\n'] | comment | line_comment)+\r
-\r
-let qident = '`' (qchar | sescape)+ '`'\r
-\r
-let ident = nondigit (nondigit | digit)* | qident\r
-\r
-let unsigned_integer = digit+\r
-\r
-let fractional_constant = unsigned_integer? '.' unsigned_integer | unsigned_integer '.'\r
-\r
-let exponent_part = ('e' | 'E') ('+' | '-')? unsigned_integer\r
-\r
-let unsigned_real = fractional_constant exponent_part? | unsigned_integer exponent_part\r
-\r
-rule token = parse\r
-\r
-  | blank\r
-              { token lexbuf }\r
-\r
-  | ['\n']\r
-              { token lexbuf }\r
-\r
-\r
-  | comment\r
-              { token lexbuf }\r
-\r
-  | line_comment\r
-              { token lexbuf }\r
-\r
-  | unsigned_integer as lxm\r
-              { UNSIGNED_INTEGER lxm }\r
-\r
-  | unsigned_real as lxm\r
-              { UNSIGNED_REAL lxm }\r
-\r
-  | "initial" separators "algorithm"\r
-              { INITIAL_ALGORITHM }\r
-\r
-  | "initial" separators "equation"\r
-              { INITIAL_EQUATION }\r
-\r
-  | "end" separators "for"\r
-              { END_FOR }\r
-\r
-  | "end" separators "if"\r
-              { END_IF }\r
-\r
-  | "end" separators "when"\r
-              { END_WHEN }\r
-\r
-  | "end" separators "while"\r
-              { END_WHILE }\r
-\r
-  | "end" separators (ident as lxm)\r
-              { END_IDENT lxm }\r
-\r
-  | ident as lxm\r
-              { check_reserved lxm }\r
-\r
-  | '\"' ((schar | sescape)* as lxm) '\"'\r
-              { STRING lxm }\r
-\r
-  | '('       { LP }\r
-  | ')'       { RP }\r
-  | '['       { LSB }\r
-  | ']'       { RSB }\r
-  | '{'       { LCB }\r
-  | '}'       { RCB }\r
-\r
-  | '.'       { DOT }\r
-  | ','       { CM }\r
-  | ';'       { SC }\r
-  | ':'       { CL }\r
-\r
-  | '+'       { PLUS }\r
-  | '-'       { MINUS }\r
-  | '*'       { STAR }\r
-  | '/'       { SLASH }\r
-  | '^'       { EXP }\r
-\r
-  | '='       { EQ }\r
-  | ":="      { COLEQ }\r
-\r
-  | '<'       { LT }\r
-  | '>'       { GT }\r
-  | "<="      { LE }\r
-  | ">="      { GE }\r
-  | "=="      { EE }\r
-  | "<>"      { NE }\r
-\r
-  | eof       { EOF }\r
-\r
-  | _         { raise (SyntacticError\r
-                  {err_msg = ["_IllegalCharacter"];\r
-                   err_info = [];\r
-                   err_ctx =\r
-                     {location = {start = Lexing.lexeme_start lexbuf;\r
-                                  enddd = Lexing.lexeme_end lexbuf;\r
-                                  filename = !inputfile}}}) }\r
+(*
+ *  Translator from Modelica 2.x to flat Modelica
+ *
+ *  Copyright (C) 2005 - 2007 Imagine S.A.
+ *  For more information or commercial use please contact us at www.amesim.com
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *)
+
+(** Modelica language lexer. *)
+
+(** Implementation based on {i Modelica language specification 2.0 } *)
+
+{
+
+(** Modelica lexer. *)
+
+(** Implementation based on {i Modelica language specification 2.0 } *)
+
+open Parser
+
+let check_reserved = function
+    | "algorithm" -> ALGORITHM
+    | "and" -> AND
+    | "annotation" -> ANNOTATION
+    | "block" -> MODEL
+    | "break" -> BREAK
+    | "class" -> CLASS
+    | "connect" -> CONNECT
+    | "connector" -> CONNECTOR
+    | "constant" -> CONSTANT
+    | "discrete" -> DISCRETE
+    | "each" -> EACH
+    | "else" -> ELSE
+    | "elseif" -> ELSEIF
+    | "elsewhen" -> ELSEWHEN
+    | "encapsulated" -> ENCAPSULATED
+    | "enumeration" -> ENUMERATION
+    | "end" -> END
+    | "equation" -> EQUATION
+    | "expandable" -> EXPANDABLE
+    | "extends" -> EXTENDS
+    | "external" -> EXTERNAL
+    | "false" -> FALSE
+    | "final" -> FINAL
+    | "flow" -> FLOW
+    | "for" -> FOR
+    | "function" -> FUNCTION
+    | "if" -> IF
+    | "import" -> IMPORT
+    | "in" -> IN
+    | "inner" -> INNER
+    | "input" -> INPUT
+    | "loop" -> LOOP
+    | "model" -> MODEL
+    | "noEvent" -> NOEVENT
+    | "not" -> NOT
+    | "or" -> OR
+    | "outer" -> OUTER
+    | "output" -> OUTPUT
+    | "package" -> PACKAGE
+    | "parameter" -> PARAMETER
+    | "partial" -> PARTIAL
+    | "protected" -> PROTECTED
+    | "public" -> PUBLIC
+    | "record" -> RECORD
+    | "redeclare" -> REDECLARE
+    | "replaceable" -> REPLACEABLE
+    | "restricts" -> RESTRICTS
+    | "return" -> RETURN
+    | "then" -> THEN
+    | "true" -> TRUE
+    | "type" -> TYPE
+    | "when" -> WHEN
+    | "while" -> WHILE
+    | "within" -> WITHIN
+    | s -> IDENT s
+
+}
+
+let blank = [' ' '\t' '\r']
+let digit = ['0'-'9']
+let nondigit = ['_' 'A'-'Z' 'a'-'z']
+let qchar = [^'`' '\\']
+let schar = [^'\"' '\\']
+let sescape = "\\\'" | "\\\"" | "\\?" | "\\\\" | "\\a" | "\\b" | "\\f" |
+              "\\n" | "\\r" | "\\t" | "\\v"
+
+let comment = "/*" ( [^ '*'] | '*'+ [^ '*' '/'] )* '*'+ '/'
+let line_comment = "//" [^ '\n']* '\n'
+
+let separators = (blank | ['\n'] | comment | line_comment)+
+
+let qident = '`' (qchar | sescape)+ '`'
+
+let ident = nondigit (nondigit | digit)* | qident
+
+let unsigned_integer = digit+
+
+let fractional_constant = unsigned_integer? '.' unsigned_integer | unsigned_integer '.'
+
+let exponent_part = ('e' | 'E') ('+' | '-')? unsigned_integer
+
+let unsigned_real = fractional_constant exponent_part? | unsigned_integer exponent_part
+
+rule token = parse
+
+  | blank
+              { token lexbuf }
+
+  | ['\n']
+              { token lexbuf }
+
+
+  | comment
+              { token lexbuf }
+
+  | line_comment
+              { token lexbuf }
+
+  | unsigned_integer as lxm
+              { UNSIGNED_INTEGER lxm }
+
+  | unsigned_real as lxm
+              { UNSIGNED_REAL lxm }
+
+  | "initial" separators "algorithm"
+              { INITIAL_ALGORITHM }
+
+  | "initial" separators "equation"
+              { INITIAL_EQUATION }
+
+  | "end" separators "for"
+              { END_FOR }
+
+  | "end" separators "if"
+              { END_IF }
+
+  | "end" separators "when"
+              { END_WHEN }
+
+  | "end" separators "while"
+              { END_WHILE }
+
+  | "end" separators (ident as lxm)
+              { END_IDENT lxm }
+
+  | ident as lxm
+              { check_reserved lxm }
+
+  | '\"' ((schar | sescape)* as lxm) '\"'
+              { STRING lxm }
+
+  | '('       { LP }
+  | ')'       { RP }
+  | '['       { LSB }
+  | ']'       { RSB }
+  | '{'       { LCB }
+  | '}'       { RCB }
+
+  | '.'       { DOT }
+  | ','       { CM }
+  | ';'       { SC }
+  | ':'       { CL }
+
+  | '+'       { PLUS }
+  | '-'       { MINUS }
+  | '*'       { STAR }
+  | '/'       { SLASH }
+  | '^'       { EXP }
+
+  | '='       { EQ }
+  | ":="      { COLEQ }
+
+  | '<'       { LT }
+  | '>'       { GT }
+  | "<="      { LE }
+  | ">="      { GE }
+  | "=="      { EE }
+  | "<>"      { NE }
+
+  | eof       { EOF }
+
+  | _         { raise (SyntacticError
+                  {err_msg = ["_IllegalCharacter"];
+                   err_info = [];
+                   err_ctx =
+                     {location = {start = Lexing.lexeme_start lexbuf;
+                                  enddd = Lexing.lexeme_end lexbuf;
+                                  filename = !inputfile}}}) }