home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
04
/
txl
/
3_preis
/
fast
/
scan.c
< prev
next >
Wrap
Text File
|
1990-11-16
|
6KB
|
259 lines
/**********************************************************/
/* 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;
char *save;
save = buffer;
GetChar (); /* Stringanfang überlesen */
while ( (Charakter != '"') &&
(count++ < ZEILENLAENGE))
{
*buffer++ = Charakter;
GetChar ();
*buffer = '\0';
if (Charakter == EOLFEHLER) {
*(save+5) = '\0';
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! ");
return;
}
}
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 ***************/