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;
}