www.pudn.com > subpas.rar > scan.l


/****************************************************/ 
/* File: scan.L                                     */ 
/* Lex specification for Sub_Pascal                 */ 
/* FGQ                              */ 
/****************************************************/ 
%{ 
#include "globals.h" 
#include "util.h" 
#include "scan.h" 
#include "parse.h" 
 
char tokenString[MAXTOKENLEN+1]; 
%} 
 
 
%include { 
 
  extern char tokenString[MAXTOKENLEN+1]; 
 
  TokenType getToken(void); 
} 
 
digit       [0-9] 
number      {digit}+ 
letter      [a-zA-Z] 
identifier  {letter}({letter}|{digit})* 
newline     \n 
whitespace  [ \t]+ 
realnumber  {number}"."{number} 
 
%% 
"and"           {return AND;} 
"array"         {return ARRAY;} 
"begin"         {return MYBEGIN;} 
"boolean"       {return BOOLEAN;} 
"do"            {return DO;} 
"else"          {return ELSE;} 
"end"           {return END;} 
"false"         {return MYFALSE;} 
"function"      {return FUNCTION;} 
"if"            {return IF;} 
"integer"       {return INTEGER;} 
"not"           {return NOT;} 
"of"            {return OF;} 
"or"            {return OR;} 
"procedure"     {return PROCEDURE;} 
"program"       {return PROGRAM;} 
"real"          {return REAL;} 
"then"          {return THEN;} 
"true"          {return MYTRUE;} 
"var"           {return VAR;} 
"while"         {return WHILE;} 
";"             {return SEMI;} 
","             {return COMMA;} 
":"				{return COLON;} 
"("             {return LP;} 
")"             {return RP;} 
"["             {return LSP;} 
"]"             {return RSP;} 
"."				{return DOT;} 
":="            {return ASSIGNOP;} 
"="             {return EQ;} 
"<>"            {return NE;} 
"<"             {return LT;} 
"<="            {return LE;} 
">"             {return GT;} 
">="            {return GE;} 
"+"             {return PLUS;} 
"-"             {return MINUS;} 
"*"             {return TIMES;} 
"/"             {return OVER;} 
"div"           {return DIV;} 
"mod"           {return MOD;} 
{number}        {return NUM;} 
{realnumber}    {return REALNUM;} 
{identifier}    {return ID;} 
{newline}       {lineno++;} 
{whitespace}    {/* skip whitespace */} 
"{"             { char c; 
                  do 
                  { c = yyinput(); 
                    if (c == EOF) return ERROR; 
                    if (c == '\n') lineno++; 
                  } while (c != '}'); 
                } 
.               {return ERROR;} 
 
%% 
 
TokenType getToken(void) 
{ static int firstTime = TRUE; 
  TokenType currentToken; 
  if (firstTime) 
  { firstTime = FALSE; 
    lineno++; 
    yyin = source; 
    yyout = listing; 
  } 
  currentToken = yylex(); 
  if(currentToken == ERROR){ 
	printf("error: Unknown character:%s.\n",lineno,yytext); 
	Error = TRUE; 
  } 
  if(currentToken==ID || currentToken==NUM || currentToken==REALNUM)  
	strncpy(tokenString,yytext,MAXTOKENLEN); 
  if (TraceScan) { 
    fprintf(listing,"\t%d: ",lineno); 
    printToken(currentToken,yytext); 
  }    
  return currentToken; 
}