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)*
%{
/*
* Copyright (C) 1995-1997 Christopher D. Granz
*
* This header may not be removed.
*
* Refer to the file "License" included in this package for further
* information and before using any of the following.
*/
/*
* (This lexer is based on an ANSI C lexer by Jeff Lee.)
*/
#include <stdio.h>
#include "emc.h"
#include "y.tab.h"
void count( );
void comment( );
int iLineNum = 0;
%}
%%
"/*" { count( ); comment( ); }
"info" { count( ); return( INFO ); }
"global" { count( ); return( GLOBAL ); }
"returned" { count( ); return( RETURNED ); }
"int" { count( ); return( INT ); }
"float" { count( ); return( FLOAT ); }
"string" { count( ); return( STRING ); }
"object" { count( ); return( OBJECT ); }
"array" { count( ); return( ARRAY ); }
"if" { count( ); return( IF ); }
"else" { count( ); return( ELSE ); }
"do" { count( ); return( DO ); }
"while" { count( ); return( WHILE ); }
"for" { count( ); return( FOR ); }
"broken" { count( ); return( BROKEN ); }
"continued" { count( ); return( CONTINUED ); }
"break" { count( ); return( BREAK ); }
"continue" { count( ); return( CONTINUE ); }
"return" { count( ); return( RETURN ); }
{L}({L}|{D})* { count( ); return( IDENTIFIER ); }
0[xX]{H}+{IS}? { count( ); return( INT_CONSTANT ); }
0{D}+{IS}? { count( ); return( INT_CONSTANT ); }
{D}+{IS}? { count( ); return( INT_CONSTANT ); }
'(\\.|[^\\'])+' { count( ); return( INT_CONSTANT ); }
{D}+{E}{FS}? { count( ); return( FLOAT_CONSTANT ); }
{D}*"."{D}+({E})?{FS}? { count( ); return( FLOAT_CONSTANT ); }
{D}+"."{D}*({E})?{FS}? { count( ); return( FLOAT_CONSTANT ); }
\"(\\.|[^\\"])*\" { count( ); return( STRING_LITERAL ); }
"*=" { count( ); return( MUL_ASSIGN ); }
"/=" { count( ); return( DIV_ASSIGN ); }
"%=" { count( ); return( MOD_ASSIGN ); }
"+=" { count( ); return( ADD_ASSIGN ); }
"-=" { count( ); return( SUB_ASSIGN ); }
">>=" { count( ); return( LEFT_ASSIGN ); }
"<<=" { count( ); return( RIGHT_ASSIGN ); }
"&=" { count( ); return( AND_ASSIGN ); }
"^=" { count( ); return( XOR_ASSIGN ); }
"|=" { count( ); return( OR_ASSIGN ); }
"++" { count( ); return( INC_OP ); }
"--" { count( ); return( DEC_OP ); }
">>" { count( ); return( LEFT_OP ); }
"<<" { count( ); return( RIGHT_OP ); }
"&&" { count( ); return( AND_OP ); }
"||" { count( ); return( OR_OP ); }
"<=" { count( ); return( LE_OP ); }
">=" { count( ); return( GE_OP ); }
"==" { count( ); return( EQ_OP ); }
"!=" { count( ); return( NE_OP ); }
"{" { 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( '|' ); }
"\n" { count( ); iLineNum++; }
[ \t\v\r\f] { count( ); /* Skip whitespace. */ }
. { /* We don't like bad characters :) */ }
%%
int yywrap( void )
{
return( 1 );
}
void comment( void )
{
char c, c1;
for ( ; ; )
{
while ( ( c = input( ) ) != '*' && c != 0 );
if ( ( c1 = input( ) ) != '/' && c != 0 )
unput( c1 );
else
break;
}
}
int column = 0;
void count( void )
{
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++;
}
fprintf( stderr, "%s", yytext );
}
/*
* End of em.l
*/