/******************************************************************** ODL lexical analyzer (conformant to ODMG 2.0 ODL) The material is provided as-is, with no warrenty of any kind. Author: Daniel Grundmann, Fraunhofer ISST (corrected version) Contact:Deutsche Telekom, Technologiezentrum, D-64307 Darmstadt Fraunhofer ISST, Postfach 520 130, D-44207 Dortmund http://www.isst.fhg.de, mailto:Weissenberg@do.isst.fhg.de Date: 98/03/16 Decription: This file is based on the lex file provided by the ODMG for ODMG-93 ODL and analyzes the lexical correctness of an ODL source file. Modified by Leonidas Fegaras, 9/28/98 *********************************************************************/ %{ int compareStrings(const char *String1, const char *String2) { return strcasecmp(String1, String2); } #define pc(x) parser_column+=x int extractToken(const char *_String) { if (!compareStrings(_String, "module" ) ) return MODULE; if (!compareStrings(_String, "persistent" ) ) return PERSISTENT; if (!compareStrings(_String, "transient" ) ) return TRANSIENT; if (!compareStrings(_String, "interface" ) ) return INTERFACE; if (!compareStrings(_String, "extent" ) ) return EXTENT; if (!compareStrings(_String, "key" ) ) return KEY; if (!compareStrings(_String, "keys" ) ) return KEYS; if (!compareStrings(_String, "const" ) ) return _CONST; if (!compareStrings(_String, "true" ) ) return TRUE; if (!compareStrings(_String, "false" ) ) return FALSE; if (!compareStrings(_String, "typedef" ) ) return TYPEDEF; if (!compareStrings(_String, "float" ) ) return FLOAT; if (!compareStrings(_String, "double" ) ) return DOUBLE; if (!compareStrings(_String, "long" ) ) return LONG; if (!compareStrings(_String, "short" ) ) return SHORT; if (!compareStrings(_String, "unsigned" ) ) return UNSIGNED; if (!compareStrings(_String, "char" ) ) return CHAR; if (!compareStrings(_String, "boolean" ) ) return BOOLEAN; if (!compareStrings(_String, "any" ) ) return ANY; if (!compareStrings(_String, "octet" ) ) return OCTET; if (!compareStrings(_String, "struct" ) ) return STRUCT; if (!compareStrings(_String, "union" ) ) return UNION; if (!compareStrings(_String, "switch" ) ) return SWITCH; if (!compareStrings(_String, "case" ) ) return CASE; if (!compareStrings(_String, "default" ) ) return DEFAULT; if (!compareStrings(_String, "enum" ) ) return ENUM; if (!compareStrings(_String, "array" ) ) return ARRAY; if (!compareStrings(_String, "sequence" ) ) return ARRAY; if (!compareStrings(_String, "String" ) ) return ODL_STRING; if (!compareStrings(_String, "readonly" ) ) return READONLY; if (!compareStrings(_String, "attribute" ) ) return ATTRIBUTE; if (!compareStrings(_String, "set" ) ) return SET; if (!compareStrings(_String, "list" ) ) return LIST; if (!compareStrings(_String, "bag" ) ) return BAG; if (!compareStrings(_String, "inverse" ) ) return INVERSE; if (!compareStrings(_String, "relationship") ) return RELATIONSHIP; if (!compareStrings(_String, "order_by" ) ) return ORDER_BY; if (!compareStrings(_String, "exception" ) ) return EXCEPTION; if (!compareStrings(_String, "oneway" ) ) return ONEWAY; if (!compareStrings(_String, "void" ) ) return ODL_VOID; if (!compareStrings(_String, "in" ) ) return IN; if (!compareStrings(_String, "out" ) ) return OUT; if (!compareStrings(_String, "inout" ) ) return INOUT; if (!compareStrings(_String, "raises" ) ) return RAISES; if (!compareStrings(_String, "context" ) ) return CONTEXT; if (!compareStrings(_String, "class" ) ) return CLASS; if (!compareStrings(_String, "date" ) ) return DATE; if (!compareStrings(_String, "time" ) ) return TIME; if (!compareStrings(_String, "extends" ) ) return EXTENDS; if (!compareStrings(_String, "timestamp" ) ) return TIMESTAMP; if (!compareStrings(_String, "interval" ) ) return INTERVAL; if (!compareStrings(_String, "dictionary" ) ) return DICTIONARY; if (!compareStrings(_String, "sequence" ) ) return SEQUENCE; if (!compareStrings(_String, "import" ) ) return IMPORT; return Identifier; } %} %option noyywrap %% "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/" ; "//".* ; ";" { pc(1);return SEMI; } "{" { pc(1);return LPAR; } "}" { pc(1);return RPAR; } "::" { pc(2);return DOUBLE_COLON; } ":" { pc(1);return COLON; } "(" { pc(1);return LRPAR; } ")" { pc(1);return RRPAR; } "," { pc(1);return COMMA; } "=" { pc(1);return EQUAL; } "|" { pc(1);return VERT; } "^" { pc(1); return HAT; } "&" { pc(1); return AMPER; } ">>" { pc(2); return DOUBLE_RIGHT; } "<<" { pc(2); return DOUBLE_LEFT; } "+" { pc(1); return PLUS; } "-" { pc(1); return MINUS; } "*" { pc(1); return TIMES; } "/" { pc(1); return SLASH; } "%" { pc(1); return PERCENT; } "~" { pc(1); return TILDE; } "<" { pc(1); return LEFT; } ">" { pc(1); return RIGHT; } "[" { pc(1); return LEPAR; } "]" { pc(1); return REPAR; } [0-9]+ { yylval.Integer =(long)atol(yytext); pc(strlen(yytext)); return IntegerLiteral; } [0-9]+"."[0-9]+ { yylval.Float = (double)atof(yytext); pc(strlen(yytext)); return FloatingPtLiteral; } [a-zA-Z0-9_]+ { yylval.StringType=strdup(yytext); pc(strlen(yytext)); return extractToken(yytext); } \"([^"]|\\["\n])*\" { yylval.StringType=strdup(yytext); pc(strlen(yytext)); return StringLiteral; } \'([^']|\\['\n])*\' { yylval.StringType=strdup(yytext); pc(strlen(yytext)); if(strlen(yytext)==3) return CharacterLiteral; else return StringLiteral; } [ \t\r\f]+ {pc(strlen(yytext));} \n { parser_line++; parser_column=0; } . {pc(1);return yytext[0];}