Home
 

Source Code

Appendix B. Source Code

These are the source code files for the project. Modifications and additions are emphasized.

scanner.l

%{
/* 
 *  scanner.l
 */

#include "scanparse.h"

// If we are just scanning and not parsing, we don't want to refer
// to parser classes.
#if defined SCANONLY
    #define TOKEN(ttype, ttext)
    #define YYSTYPE int
#else
    #define TOKEN(type,txt) lex_tok = new LexTokCls(yylineno, type, txt)
    #define YYSTYPE PPTreeNodeCls
    #include "p_tree.h"
    PLexTokCls lex_tok;
#endif

#include <string.h>
#include <iostream.h>

#include "ctrl.h"
#include "parser.tab.h"

char *textline = new char[257];
int yylineno = 1;

int ck_reserved_wd();
void ckout();

%}

digit           [0-9]
digits          {digit}+
letter          [A-Za-z]
letter_or_digit     ({letter}|{digit})
ident           {letter}{letter_or_digit}*
whitespace      [ \t]
cr          [\n]
other           .

%x COMMENT

%%

"//"            BEGIN(COMMENT);
<COMMENT>[^\n]*\n       { textline[0] = '\0'; BEGIN(INITIAL); }

{whitespace}    {ckout();}

{cr}        {ckout();}


";"     {ckout();
        TOKEN(SCTK, 0);
        return SCTK;}

"("     {ckout();
        TOKEN(LPARENTK, 0);
         return LPARENTK;}

")"     {ckout();
        TOKEN(RPARENTK, 0);
         return RPARENTK;}

","             {ckout();
                TOKEN(COMMATK, 0);
                return COMMATK;}

":"             {ckout();
                TOKEN(COLONTK, 0);
                return COLONTK;}

"["             {ckout();
                TOKEN(LBRACKTK, 0);
                 return LBRACKTK;}

"]"             {ckout();
                TOKEN(RBRACKTK, 0);
                 return RBRACKTK;}

":="        {ckout();
        TOKEN(ASGTK, 0);
         return ASGTK;}

".."            {ckout();
                TOKEN(RANGETK, 0);
                 return RANGETK;}

"."     {ckout();
        TOKEN(DOTTK, 0);
         return DOTTK;}

"+"             {ckout();
                TOKEN(PLUSTK, 0);
                 return PLUSTK;}

"-"             {ckout();
                TOKEN(MINUSTK, 0);
                 return MINUSTK;}

"*"             {ckout();
                TOKEN(STARTK, 0);
                 return STARTK;}

"/"             {ckout();
                TOKEN(SLASHTK, 0);
                 return SLASHTK;}

"<"             {ckout();
                TOKEN(LTTK, 0);
                 return LTTK;}

"<="            {ckout();
                TOKEN(LETK, 0);
                 return LETK;}

"="             {ckout();
                TOKEN(EQTK, 0);
                 return EQTK;}

"<>"            {ckout();
                TOKEN(NETK, 0);
                 return NETK;}

">="            {ckout();
                TOKEN(GETK, 0);
                 return GETK;}

">"             {ckout();
                TOKEN(GTTK, 0);
                 return GTTK;}

{digits}    {ckout();
        TOKEN(NUMLITERALTK, yytext);
        return NUMLITERALTK;}

{ident}     {ckout();
        int actual_tk = ck_reserved_wd();
        TOKEN( actual_tk, yytext);
        return actual_tk;}

{other}     {ckout(); 
        return yytext[0];}

%%

void ckout() {
   textline = strcat(textline,yytext);
   if (yytext[0] == '\n') {
       #if !defined SCANONLY
       if (OptionCls::option_info() % 2) {  //List option is a 1
       cout << "[";
       cout.width(5);
       cout <<  yylineno -1 << "]    " << textline ;
       }
       #endif
       textline[0] = '\0'; 
   }
}

struct rwtable_str {
    char *rw_name;  /* lexeme */
    int  rw_yylex;  /* token  */
};

rwtable_str rwtable[] = {
    "",         IDENTIFIERTK,
    "array",            ARRAYTK,
    "begin",        BEGINTK,
    "else",             ELSETK,
    "end",      ENDTK,
    "exit",             EXITTK,
    "if",               IFTK,
    "integer",          INTEGERTK,
    "loop",             LOOPTK,
    "of",               OFTK,
    "program",      PROGRAMTK,
    "then",             THENTK,
    "var",              VARTK,
    "writeln",      WRITETK
};

#define LEN(x)      (sizeof(x)/sizeof((x)[0]))
#define ENDTABLE(v) (v - 1 + LEN(v))

int ck_reserved_wd() {
    rwtable_str *low = rwtable;
    rwtable_str *high = ENDTABLE(rwtable);
    rwtable_str *mid;
    int comp;
    char temp[80];

    strcpy(temp,yytext);

    while (low <= high)
    {   mid = low + (high-low)/2;
        
        if ((comp=strcmp(mid->rw_name, temp)) == 0)
            return mid->rw_yylex;
        else if (comp < 0)
            low = mid+1;
        else
            high = mid-1;
    }
    return rwtable->rw_yylex;  /* ie. token: IDENTIFIER! */
}

#if !defined __alpha
// For some reason, alpha doesn't like us to define yywrap!
int yywrap() {
   return 1;
}
#endif