
%{
/* $Id: lexer.l,v 1.4 2001/05/22 10:00:21 sandro Exp $ */

#include <string.h>
#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}*

%%


<INITIAL>^.*$      { 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;
   }
}
