%{ /* $Id: lexer.l,v 1.4 2001/05/22 10:00:21 sandro Exp $ */ #include #include "y.tab.h" #undef YY_INPUT #define YY_INPUT(buf,result,max_size) (result=my_yyinput(buf,max_size)) int my_yyinput(char *buf, int max_size); extern int lineno; extern char linebuf[]; char linebuf[2048]; extern "C" void yyerror(char*); int loopcount=0; %} %s GOTLINE alpha [_A-Za-z$!] digit [0-9] hexdigit [0-9a-fA-F] word {alpha}({alpha}|{digit})* string_text ([^\"]|(\"\"))* /* Does not recognize nested comments as a comment! */ c_comment ([^/*\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* white [\n\ \t\b\012\r] w {white}* wordchar ({alpha}|{digit}) urichar [^ \n\t<>"] u {urichar}* %% ^.*$ { if (loopcount>1000) { loopcount-=1000; yyerror("loop caught"); return 0;} loopcount++; int len = strlen(yytext); if (len > sizeof(linebuf)-1) len=sizeof(linebuf)-1; strncpy(linebuf, yytext, len); linebuf[len]='\0'; lineno++; /* printf("Line %3d: %s\n", lineno, linebuf); */ BEGIN(GOTLINE); yyless(0); } "is" { } "has" { return HAS; } "of" { } "default" { yytext=":"; return NSDEFTERM; } "@prefix" { /* printf("Got PREFIX; yytext=\"%s\"\n", yytext); */ return PREFIX; } "bind" { /* printf("Got PREFIX; yytext=\"%s\"\n", yytext); */ return PREFIX; } "<"{u}">" { /* printf("Got ABSTERM; yytext=\"%s\"\n", yytext); */ return ABSTERM; } "this" { yytext="<>"; return ABSTERM; /* is this right??? */ } {wordchar}*":"{wordchar}+ { /* printf("Got NSTERM; yytext=\"%s\"\n", yytext); */ return NSTERM; } {wordchar}*":" { /* printf("Got NSDEFTERM; yytext=\"%s\"\n", yytext); */ return NSDEFTERM; } "." { /* printf("Got period; yytext=\"%s\"\n", yytext); */ return PERIOD; } [\(\)=\{\}\[\],.;] { /* printf("Got char; yytext=\"%s\"\n", yytext); */ return *yytext; } \"[^\"]*\" { /* printf("Got STRING; yytext=\"%s\"\n", yytext); */ return DQSTRING; } \"\"\"([^\"]|(\"\"?[^\"]))*\"\"\" { /* printf("Got STRING; yytext=\"%s\"\n", yytext); */ return TQSTRING; } {white} { /* printf( "Skipping Whitespace '%s'\n", yytext ); */ loopcount=0; BEGIN(INITIAL); } "#".* /* comment */ "a" { return A; } {wordchar}* { return OTHER_WORD; } . printf( "Unrecognized character: %s (%d)\n", yytext, *yytext ); %% int yywrap() { return 1; } extern char* lexer_source_begin; extern char* lexer_source_end; int my_yyinput(char *buf, int max_size) { if (lexer_source_begin) { int n = lexer_source_end-lexer_source_begin; if (n > max_size) n = max_size; if (n > 0) { memcpy(buf, lexer_source_begin, n); lexer_source_begin += n; } return n; } else { int result; if ( ((result = fread( buf, 1, max_size, yyin )) == 0) && ferror( yyin ) ) YY_FATAL_ERROR( "input in flex scanner failed" ); return result; } }