su4sml/src/ocl_parser/ocl.lex

187 lines
10 KiB
Plaintext

(*****************************************************************************
* su4sml --- an SML repository for managing (Secure)UML/OCL models
* http://projects.brucker.ch/su4sml/
*
* ocl.lex ---
* This file is part of su4sml.
*
* Copyright (c) 2005-2007, ETH Zurich, Switzerland
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************)
(* $Id$ *)
open Rep_OclTerm
open Rep_OclType
open Context
structure Tokens = Tokens
type pos = int * int * int
type svalue = Tokens.svalue
type ('a,'b) token = ('a,'b) Tokens.token
type lexresult= (svalue,pos) token
val pos = ref (0,0,0)
fun eof () = Tokens.EOF((!pos,!pos))
fun error (e,p : (int * int * int),_) = TextIO.output (TextIO.stdOut,
String.concat[
"line ", (Int.toString (#1 p)), "/",
(Int.toString (#2 p - #3 p)),": ", e, "\n"
])
fun inputPos yypos = ((#1 (!pos), yypos - (#3(!pos)), (#3 (!pos))),
(#1 (!pos), yypos - (#3(!pos)), (#3 (!pos))))
fun inputPos_half yypos = (#1 (!pos), yypos - (#3(!pos)), (#3 (!pos)))
%%
%header (functor OclParserLexFun(structure Tokens: OclParser_TOKENS));
alpha=[A-Za-z_];
digit=[0-9];
ws = [\ \t];
%%
\n => (pos := ((#1 (!pos)) + 1, yypos - (#3(!pos)),yypos ); lex());
{ws}+ => (pos := (#1 (!pos), yypos - (#3(!pos)), (#3 (!pos))); lex());
(--)[^\n]*\n => (pos := ((#1 (!pos)) + 1, yypos - (#3(!pos)),yypos ); lex());
"/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/" => (lex());
"," => (Tokens.COMMA(yytext,inputPos_half yypos,inputPos_half yypos));
"->" => (Tokens.ARROW_RIGHT(yytext,inputPos_half yypos,inputPos_half yypos));
"." => (Tokens.DOT(yytext,inputPos_half yypos,inputPos_half yypos));
".." => (Tokens.DBL_DOT(yytext,inputPos_half yypos,inputPos_half yypos));
":" => (Tokens.COLON(yytext,inputPos_half yypos,inputPos_half yypos));
"::" => (Tokens.DBL_COLON(yytext,inputPos_half yypos,inputPos_half yypos));
";" => (Tokens.SEMI_COLON(yytext,inputPos_half yypos,inputPos_half yypos));
"=" => (Tokens.EQUALS(yytext,inputPos_half yypos,inputPos_half yypos));
"?" => (Tokens.QUESTION_MARK(yytext,inputPos_half yypos,inputPos_half yypos));
"#" => (Tokens.HASH(yytext,inputPos_half yypos,inputPos_half yypos));
"@pre" => (Tokens.AT_PRE(yytext,inputPos_half yypos,inputPos_half yypos));
"Bag" => (Tokens.BAG(yytext,inputPos_half yypos,inputPos_half yypos));
"Collection" => (Tokens.COLLECTION(yytext,inputPos_half yypos,inputPos_half yypos));
"OrderedSet" => (Tokens.ORDERED_SET(yytext,inputPos_half yypos,inputPos_half yypos));
"Sequence" => (Tokens.SEQUENCE(yytext,inputPos_half yypos,inputPos_half yypos));
"Set" => (Tokens.SET(yytext,inputPos_half yypos,inputPos_half yypos));
"Tuple" => (Tokens.TUPLE(yytext,inputPos_half yypos,inputPos_half yypos));
"TupleType" => (Tokens.TUPLE_TYPE(yytext,inputPos_half yypos,inputPos_half yypos));
"[" => (Tokens.BRACKET_OPEN(yytext,inputPos_half yypos,inputPos_half yypos));
"]" => (Tokens.BRACKET_CLOSE(yytext,inputPos_half yypos,inputPos_half yypos));
"^" => (Tokens.CARAT(yytext,inputPos_half yypos,inputPos_half yypos));
"^^" => (Tokens.DBL_CARAT(yytext,inputPos_half yypos,inputPos_half yypos));
"body" => (Tokens.BODY(body,inputPos_half yypos,inputPos_half yypos));
"context" => (Tokens.CONTEXT(yytext,inputPos_half yypos,inputPos_half yypos));
"def" => (Tokens.DEF(yytext,inputPos_half yypos,inputPos_half yypos));
"derive" => (Tokens.DERIVE(derive,inputPos_half yypos,inputPos_half yypos));
"else" => (Tokens.ELSE(yytext,inputPos_half yypos,inputPos_half yypos));
"endif" => (Tokens.ENDIF(yytext,inputPos_half yypos,inputPos_half yypos));
"endpackage" => (Tokens.ENDPACKAGE(yytext,inputPos_half yypos,inputPos_half yypos));
"false" => (Tokens.FALSE(yytext,inputPos_half yypos,inputPos_half yypos));
"null" => (Tokens.NULL(yytext,inputPos_half yypos,inputPos_half yypos));
"if" => (Tokens.IF(yytext,inputPos_half yypos,inputPos_half yypos));
"in" => (Tokens.IN(yytext,inputPos_half yypos,inputPos_half yypos));
"init" => (Tokens.INIT(init,inputPos_half yypos,inputPos_half yypos));
"inv" => (Tokens.INV(yytext,inputPos_half yypos,inputPos_half yypos));
"let" => (Tokens.LET(yytext,inputPos_half yypos,inputPos_half yypos));
"package" => (Tokens.PACKAGE(yytext,inputPos_half yypos,inputPos_half yypos));
"pre" => (Tokens.PRE(pre,inputPos_half yypos,inputPos_half yypos));
"post" => (Tokens.POST(post,inputPos_half yypos,inputPos_half yypos));
"then" => (Tokens.THEN(yytext,inputPos_half yypos,inputPos_half yypos));
"true" => (Tokens.TRUE(yytext,inputPos_half yypos,inputPos_half yypos));
"(" => (Tokens.PAREN_OPEN(yytext,inputPos_half yypos,inputPos_half yypos));
")" => (Tokens.PAREN_CLOSE(yytext,inputPos_half yypos,inputPos_half yypos));
"{" => (Tokens.BRACE_OPEN(yytext,inputPos_half yypos,inputPos_half yypos));
"}" => (Tokens.BRACE_CLOSE(yytext,inputPos_half yypos,inputPos_half yypos));
"|" => (Tokens.VERTICAL_BAR(yytext,inputPos_half yypos,inputPos_half yypos));
"guard" => (Tokens.GUARD(yytext,inputPos_half yypos,inputPos_half yypos));
"iterate" => (Tokens.ITERATE(yytext,inputPos_half yypos,inputPos_half yypos));
"select" => (Tokens.SELECT(yytext,inputPos_half yypos,inputPos_half yypos));
"reject" => (Tokens.REJECT(yytext,inputPos_half yypos,inputPos_half yypos));
"collect" => (Tokens.COLLECT(yytext,inputPos_half yypos,inputPos_half yypos));
"forAll" => (Tokens.FORALL(yytext,inputPos_half yypos,inputPos_half yypos));
"any" => (Tokens.ANY(yytext,inputPos_half yypos,inputPos_half yypos));
"exists" => (Tokens.EXISTS(yytext,inputPos_half yypos,inputPos_half yypos));
"one" => (Tokens.ONE(yytext,inputPos_half yypos,inputPos_half yypos));
"isUnique" => (Tokens.ISUNIQUE(yytext,inputPos_half yypos,inputPos_half yypos));
"oclIsTypeOf" => (Tokens.OCLISTYPEOF(yytext,inputPos_half yypos,inputPos_half yypos));
"oclIsKindOf" => (Tokens.OCLISKINDOF(yytext,inputPos_half yypos,inputPos_half yypos));
"oclAsType" => (Tokens.OCLASTYPE(yytext,inputPos_half yypos,inputPos_half yypos));
"-" => (Tokens.MINUS(yytext,inputPos_half yypos,inputPos_half yypos));
"*" => (Tokens.STAR(yytext,inputPos_half yypos,inputPos_half yypos));
"/" => (Tokens.SLASH(yytext,inputPos_half yypos,inputPos_half yypos));
"+" => (Tokens.PLUS(yytext,inputPos_half yypos,inputPos_half yypos));
">" => (Tokens.REL_GT(yytext,inputPos_half yypos,inputPos_half yypos));
"<" => (Tokens.REL_LT(yytext,inputPos_half yypos,inputPos_half yypos));
">=" => (Tokens.REL_GTE(yytext,inputPos_half yypos,inputPos_half yypos));
"<=" => (Tokens.REL_LTE(yytext,inputPos_half yypos,inputPos_half yypos));
"<>" => (Tokens.REL_NOTEQUAL(yytext,inputPos_half yypos,inputPos_half yypos));
"and" => (Tokens.LOG_AND(yytext,inputPos_half yypos,inputPos_half yypos));
"or" => (Tokens.LOG_OR(yytext,inputPos_half yypos,inputPos_half yypos));
"xor" => (Tokens.LOG_XOR(yytext,inputPos_half yypos,inputPos_half yypos));
"implies" => (Tokens.LOG_IMPL(yytext,inputPos_half yypos,inputPos_half yypos));
"not" => (Tokens.NOT(yytext,inputPos_half yypos,inputPos_half yypos));
"model" => (Tokens.MODEL(yytext,inputPos_half yypos,inputPos_half yypos));
"class" => (Tokens.CLASS(yytext,inputPos_half yypos,inputPos_half yypos));
"attributes" => (Tokens.ATTRIBUTES(yytext,inputPos_half yypos,inputPos_half yypos));
"operations" => (Tokens.OPERATIONS(yytext,inputPos_half yypos,inputPos_half yypos));
"constraints" => (Tokens.CONSTRAINTS(yytext,inputPos_half yypos,inputPos_half yypos));
"association" => (Tokens.ASSOCIATIONS(yytext,inputPos_half yypos,inputPos_half yypos));
"between" => (Tokens.BETWEEN(yytext,inputPos_half yypos,inputPos_half yypos));
"end" => (Tokens.END(yytext,inputPos_half yypos,inputPos_half yypos));
{digit}+"."{digit}+(E|e)?({digit})* => (Tokens.REAL_LITERAL(yytext,inputPos_half yypos,inputPos_half yypos));
{digit}+ => (Tokens.INTEGER_LITERAL(yytext,inputPos_half yypos,inputPos_half yypos));
"'"({alpha}|{ws}|{digit})*(("."|"_"|"/"|"-")*({alpha}|{ws}|{digit})*)*"'" => (Tokens.STRING_LITERAL(yytext,inputPos_half yypos,inputPos_half yypos));
{alpha}+(_)?({alpha}|{digit})* => (Tokens.SIMPLE_NAME(yytext,inputPos_half yypos,inputPos_half yypos));
. => (error ("ignoring bad character "^yytext,
((#1 (!pos), yypos - (#3(!pos)), (#3 (!pos)))),
((#1 (!pos), yypos - (#3(!pos)), (#3 (!pos)))));
lex());