/********************************
*
* fsl-0.1.0-01.l
*
* Scanner for Atoms of FSL1.0.1
*
* Standalone Test Version
*
* author: gerd doeben-henisch
* first: may-14, 2004
* last: may-14, 2004
*
**************************************
*
* Which kinds of tokens are needed?
*
* DATA TYPES <---------> {system, int, float, bool, str, struct, [] }
* VARIABLE NAMES <------> {First sign UPPER, then LOWER or UPPER or DIGIT or MINUS or UNDER }
* UNIT ITEMS <----------> {year, month, week, day, hour, minute, sec, msec, usec }
* SYSTEM NAMES <--------> {First sign LOWER, then LOWER or UPPER or DIGIT or MINUS or UNDER }
* KONSTANT ITEMS <------> {INT, FLOAT, BOOL, CHAR, STRING }
* SPECIAL SIGNS <-------> {COLON, LB, RB, LSB, RSB, LCB, RCB, SEP, EQU, MINUS, UNDER }
* COMMENTS <------------> '\/\/' as one-line-comment or '\/\* ... \*\/' as multi-line-comment
*
*********************************************************************************************
* STRING
* Everything between two \" ... \" except the \" itself is a string
* Only the signs between the \"-signs are comitted
*
********************************************************************/
%{
#include <stdio.h>
#include <string.h>
%}
%s FSL FSLSTR
%x COMMENT
LB \(
RB \)
LSB "["
RSB "]"
LCB "{"
RCB "}"
SEP ","
COLON ";"
EQU "="
MINUS "-"
UNDER "_"
LOWER [a-z]+
UPPER [A-Z]+
DIGIT [0-9]+
INT [-]?{DIGIT}
FLOAT {INT}+"."{DIGIT}
ALPHANUM [[:alnum:]]+
NEWLINE ("\r"|"\n"|"\r\n")
VARNAME {UPPER}+[[:alnum:]{MINUS}{UNDER}]*
SYSNAME {LOWER}+[[:alnum:]{MINUS}{UNDER}]*
%%
%{
BEGIN (FSL);
%}
<FSL>"//".*{NEWLINE} { printf( "ONE-LINE-COMMENT: %s\n", yytext );
/*throw away comment*/
;}
<FSL>"/*" { printf( "multi-LINE-COMMENT, Begin: %s\n", yytext );
BEGIN (COMMENT);
yymore();
}
<COMMENT>[^*]+ {
yymore();
}
<COMMENT>"*/" { printf( "multi-LINE-COMMENT, End: %s\n", yytext );
/*throw away comment*/
BEGIN (FSL);
}
<COMMENT>"*" {
yymore();
}
<FSL>["] { printf( "STRING-START: %s\n", yytext );
BEGIN (FSLSTR);
}
<FSLSTR>["] { printf( "\n STRING-END: %s\n", yytext );
BEGIN (FSL);
}
<FSL>[ \t] ;
<FSL>\( { printf( "LB: %s\n", yytext ); }
<FSL>\) { printf( "RB: %s\n", yytext ); }
<FSL>"[" { printf( "LSB: %s\n", yytext ); }
<FSL>"]" {printf( "RSB: %s\n", yytext ); }
<FSL>"{" { printf( "LCB: %s\n", yytext ); }
<FSL>"}" { printf( "RCB: %s\n", yytext ); }
<FSL>"," { printf( "SEP: %s\n", yytext ); }
<FSL>";" { printf( "COLON: %s\n", yytext ); }
<FSL>"." { printf( "DOT: %s\n", yytext ); }
<FSL>"=" { printf( "EQU: %s\n", yytext ); }
<FSL>"-" { printf( "MINUS: %s\n", yytext ); }
<FSL>"_" { printf( "UNDER: %s\n", yytext ); }
<FSL>int {printf( "TYPE: %s \n", yytext); }
<FSL>float {printf( "TYPE: %s \n", yytext); }
<FSL>str {printf( "TYPE: %s \n", yytext); }
<FSL>struct {printf( "TYPE: %s \n", yytext); }
<FSL>system {printf( "TYPE: %s \n", yytext); }
<FSL>year {printf( "UNIT: %s \n", yytext); }
<FSL>month {printf( "UNIT: %s \n", yytext); }
<FSL>week {printf( "UNIT: %s \n", yytext); }
<FSL>day {printf( "UNIT: %s \n", yytext); }
<FSL>hour {printf( "UNIT: %s \n", yytext); }
<FSL>min {printf( "UNIT: %s \n", yytext); }
<FSL>sec {printf( "UNIT: %s \n", yytext); }
<FSL>msec {printf( "UNIT: %s \n", yytext); }
<FSL>usec {printf( "UNIT: %s \n", yytext); }
<FSL>if {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>while {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>add {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>concat {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>findsubstr {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>isequ {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>less {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>receive {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>send {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>subst {printf( "BUILT-IN SYS-CALL: %s \n", yytext); }
<FSL>{INT} {printf( "INT: %s \n", yytext); }
<FSL>{FLOAT} {printf( "FLOAT: %s \n", yytext); }
<FSL>true {printf( "BOOL: %s \n", yytext); }
<FSL>false {printf( "BOOL: %s \n", yytext); }
<FSL>{VARNAME} {printf( "VARNAME: %s \n", yytext); }
<FSL>{SYSNAME} {printf( "SYSNAME: %s \n", yytext); }
%%
int main( int argc, char **argv ) {
++argv;
--argc; /* skip over program name */
if ( argc > 0 ){
yyin = fopen( argv[0], "r" ); }
else {
yyin = stdin; }
yylex();
}