%{
/*******************************************************************************
* Scan.l BEAM IDL Lexical analyser
* T.Barnaby, BEAM Ltd, 2/5/03
*******************************************************************************
*/
#include <stdio.h>
#include <string.h>
#include "bidl.h"
#include "cgram.hh"
extern Node* yylval;
static void comment0();
static void comment1();
static void preProcess();
static void nextLine();
static void count();
static int typeCheck();
#define DOECHO 0
%}
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
%%
"/*" { comment0(); }
"//" { comment1(); return(COMMENT); }
"#" { preProcess(); }
"\n" { nextLine(); }
"module" { count(); return(MODULE); }
"interface" { count(); return(INTERFACE); }
"struct" { count(); return(STRUCT); }
"class" { count(); return(CLASS); }
"typeDomain" { count(); return(TYPEDOMAIN); }
"apiVersion" { count(); return(APIVERSION); }
"enum" { count(); return(ENUM); }
"Error" { count(); return(ERROR); }
"Bool" { count(); return(BOOL); }
"Int8" { count(); return(INT8); }
"UInt8" { count(); return(UINT8); }
"Int16" { count(); return(INT16); }
"UInt16" { count(); return(UINT16); }
"Int32" { count(); return(INT32); }
"UInt32" { count(); return(UINT32); }
"Int64" { count(); return(INT64); }
"UInt64" { count(); return(UINT64); }
"String" { count(); return(STRING); }
"Double" { count(); return(DOUBLE); }
"Id" { count(); return(ID); }
"Date" { count(); return(DATE); }
"DateTime" { count(); return(DATETIME); }
"List" { count(); return(LIST); }
"Array" { count(); return(ARRAY); }
"in" { count(); return(IN); }
"inref" { count(); return(INREF); }
"out" { count(); return(OUT); }
{L}({L}|{D})* { count(); return(typeCheck()); }
0[xX]{H}+{IS}? { count(); return(CONSTANT); }
0{D}+{IS}? { count(); return(CONSTANT); }
{D}+{IS}? { count(); return(CONSTANT); }
'(\\.|[^\\'])+' { count(); return(CONSTANT); }
{D}+{E}{FS}? { count(); return(CONSTANT); }
{D}*"."{D}+({E})?{FS}? { count(); return(CONSTANT); }
{D}+"."{D}*({E})?{FS}? { count(); return(CONSTANT); }
\"(\\.|[^\\"])*\" { count(); return(STRING_LITERAL); }
";" { count(); return(';'); }
"{" { count(); return('{'); }
"}" { count(); return('}'); }
"," { count(); return(','); }
":" { count(); return(':'); }
"=" { count(); return('='); }
"(" { count(); return('('); }
")" { count(); return(')'); }
"[" { count(); return('['); }
"]" { count(); return(']'); }
"." { count(); return('.'); }
"&" { count(); return('&'); }
"!" { count(); return('!'); }
"~" { count(); return('~'); }
"-" { count(); return('-'); }
"+" { count(); return('+'); }
"*" { count(); return('*'); }
"/" { count(); return('/'); }
"%" { count(); return('%'); }
"<" { count(); return('<'); }
">" { count(); return('>'); }
"^" { count(); return('^'); }
"|" { count(); return('|'); }
"?" { count(); return('?'); }
[ \t\v\f] { count(); }
. { /* ignore bad characters */ }
%%
int column = 0;
int line = 1;
int yywrap()
{
return 1;
}
static void comment0(){
char c, c1;
#if DOECHO
loop:
while ((c = yyinput()) != '*' && c != 0)
putchar(c);
if ((c1 = yyinput()) != '/' && c != 0)
{
unput(c1);
goto loop;
}
if (c != 0)
putchar(c1);
#else
loop:
while ((c = yyinput()) != '*' && c != 0);
if ((c1 = yyinput()) != '/' && c != 0) {
unput(c1);
goto loop;
}
#endif
}
static void comment1(){
char c;
BString comment;
while((c = yyinput()) != '\n' && c != 0){
comment = comment + c;
}
if(c != 0){
unput(c);
}
yylval = new Node(Node::TCOMMENT, comment);
}
static void preProcess() {
char c;
BString linestr;
char file[256];
int lineno;
#if DOECHO
ECHO;
while ((c = yyinput()) != '\n' && c != 0){
putchar(c);
if (c == '\n')
putchar(c);
}
#else
while ((c = yyinput()) != '\n' && c != 0)
linestr = linestr + c;
file[0] = '\0';
sscanf(linestr.retStr(), "%d \"%s\"", &lineno, file);
if(strlen(file))
file[strlen(file) - 1] = 0;
line = lineno;
fileName = file;
#endif
}
static void nextLine(){
column = 0;
line++;
#if DOECHO
ECHO;
#endif
}
static void count()
{
int i;
for (i = 0; yytext[i] != '\0'; i++)
if (yytext[i] == '\n')
column = 0;
else if (yytext[i] == '\t')
column += 8 - (column % 8);
else
column++;
yylval = new Node(Node::TNONE, yytext);
#if DOECHO
ECHO;
#endif
}
/* Check if type exists */
static int typeCheck(){
if(gtypelist.search(yytext))
return(TYPE_NAME);
else
return(IDENTIFIER);
}