home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************/
- /* SCAN.C */
- /* Der Scanner für den Interpreter */
- /* */
- /* (c) 1989 Michael Beising & TOOLBOX */
- /**********************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include "interp.h"
-
- /* lokale Funktionen dieses Files */
- static void GetChar (void);
- static void GetNextChar (void);
- static void GetZahl (char *buffer);
- static void GetBezeichner (char *buffer);
- static void GetString (char *buffer);
- static void SkipSpace (void);
-
- /* In diesem File benutzte Globalvariablen */
- /* Zeichenposition der aktuellen Zeile */
- extern char *LinePos;
- /* der aufrufenden Routine wird mitgeteilt,
- um was es sich handelt. */
- extern int Steuer;
- /* Ergebnisbuffer des Scanners */
- extern char ScanBuffer[ZEILENLAENGE];
-
- /* Modulglobale Variablen */
- static int NeedNext;
- static char Charakter;
-
- /* Scan
- liest den Quelltext Zeichen um Zeichen ein
- und meldet zusammengehörige Zeichenfolge
- */
-
- int
- Scan ()
- {
- unsigned int test;
- char *buffer;
-
- GetChar ();
- SkipSpace (); /* Leerzeichen überlesen */
-
- if ((test = isalpha(Charakter)) != FALSE)
- test = ALPHA;
- else
- if ((test = isdigit (Charakter)) != FALSE)
- test = ZIFFER;
- else
- test = Charakter;
-
- switch (test) {
- case ALPHA : /* Zeichenkette lesen */
- Steuer = ALPHA;
- GetBezeichner (ScanBuffer);
- NoSkipChar ();
- break;
- case ZIFFER : /* Ziffernfolge lesen */
- Steuer = ZIFFER;
- GetZahl (ScanBuffer);
- NoSkipChar ();
- break;
- case '"' : /* beliebige Zeichenkette lesen */
- Steuer = STRING;
- GetString (ScanBuffer);
- break;
- case '(' :
- case ')' :
- case '=' :
- case '<' :
- case '>' :
- case '/' :
- case '*' :
- case '+' :
- case '-' :
- ScanBuffer[0] = Charakter; /* Charakter in Buffer */
- ScanBuffer[1] = '\0'; /* Stringende setzen */
- Steuer = SONDER;
- break;
- case ';':
- ScanBuffer[0] = Charakter; /* Charakter in Buffer */
- ScanBuffer[1] = '\0'; /* Stringende setzen */
- Steuer = EOLCHAR;
- break;
- case EOLFEHLER:
- return (UNEOL);
- default : /* Default-Scanergebnis */
- Steuer = UNKNOWN;
- fatal_error (" Ungültiges Zeichen gefunden! ");
- return (INVCHAR);
- } /* switch */
-
- return (SCANOK);
- }
-
- /* SkipSpace
- Überspringen von Leerzeichen im Eingabedatenstrom
- */
-
- void
- SkipSpace ()
- {
- while (Charakter == SPACE)
- GetChar (); /* Leerzeichen überlesen */
- }
-
- /* GetChar liest, wenn notwendig, das nächste Zeichen oder
- beläßt das alte im Eingabebuffer.
- Für Lookahead notwendig. */
-
- void
- GetChar ()
- {
- extern int NeedNext;
-
- if (NeedNext == TRUE)
- GetNextChar ();
- else
- NeedNext = TRUE; /* beim nächsten Mal erst */
- }
-
- /* GetNextChar
- liest das nächste gültige Zeichen vom Eingabebuffer */
-
- void
- GetNextChar ()
-
- {
- extern char Charakter;
- extern char *LinePos;
-
- if (*LinePos != '\0') {
- Charakter = *LinePos++;
- }
- else
- Charakter = EOLFEHLER; /* Zeile zu Ende - Befehl noch
- nicht vollständig */
- }
-
- /* GetBezeichner
- Befehl oder Variablenname Einlesen
- */
-
- void
- GetBezeichner (buffer)
- char *buffer;
-
- {
- int count = 0;
-
- while ((isalpha (Charakter) || isdigit (Charakter)) &&
- (Charakter != ';') && (count++ < NAMLEN))
- {
- *buffer++ = Charakter;
- GetChar ();
- }
- *buffer = '\0';
- }
-
- /* GetZahl ()
- Ziffernfoge in Buffer einlesen
- */
-
- void
- GetZahl (buffer)
- char *buffer;
-
- {
- int count = 0;
-
- while (((Charakter == '.') || isdigit (Charakter)) &&
- (count++ < NAMLEN))
- {
- if (Charakter == '.') Steuer = FLONUM;
- *buffer++ = Charakter;
- *buffer = '\0';
- GetChar ();
- }
- }
-
- /* GetString
- Einen Sting einlesen.
- */
-
- void
- GetString (buffer)
- char *buffer;
-
- {
- int count = 0;
-
- GetChar (); /* Stringanfang überlesen */
-
- while ( (Charakter != '"') &&
- (count++ < ZEILENLAENGE))
- {
- *buffer++ = Charakter;
- GetChar ();
- *buffer = '\0';
- if (Charakter == EOLFEHLER) {
- fatal_error ("Stringende läßt sich nicht finden!");
- break;
- }
- }
- GetChar (); /* erstes Zeichen nach Stringende lesen */
- }
-
- /* GetGeklammert
- einen durch Klammern eingeschlossenen Ausdruck
- einlesen
- */
-
- void
- GetGeklammert (buffer)
- char *buffer;
-
- {
- int count = 0;
-
- GetChar (); /* NeedNext = TRUE */
-
- while ( (Charakter != ')') &&
- (count++ < ZEILENLAENGE))
- {
- *buffer++ = Charakter;
- GetChar ();
- *buffer = '\0';
- if (Charakter == EOLFEHLER)
- fatal_error ("Rechte Klammer nicht gefunden! ");
- }
- GetChar (); /* nächstes Zeichen nach der
- Klammer lesen */
- }
-
- void
- NoSkipChar ()
- {
- NeedNext = FALSE; /* kein neues Zeichen holen,
- altes noch gültig */
- }
-
- void
- SkipChar ()
- {
- NeedNext = TRUE; /* neues Zeichen holen */
- }
-
- /******************** Ende des Files SCAN.C ***************/
-