#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _key_woed_end "Waiting for your Expanding"//keyword END flag
typedef struct
{
int typenum;
char * word;
}word;
Char input[255]; Input Swap Buffer
Char token[255]= ""; Word buffer
int p_input; Input Swap buffer pointer
int P_token; Word buffer pointer
Char ch; Characters currently being read
Char *rwtab[]={' begin ', ' if ', ' then ', ' while ', ' Do ', ' End ', _key_woed_end}; C language Keywords
WORD * Scaner (); Lexical scan function, get keyword
Main ()
{
int over=1;
WORD *oneword;
oneword= (Word *) malloc (sizeof (word));
printf ("Please enter your string (with # as the end flag):");
scanf ("%[^#]s", input);
p_input=0;
printf ("The string you entered is:%s\n\n", input);
while (Over<1000&&over!=-1)
{
Oneword=scaner ();
printf ("(%d,%s) \ n", Oneword->typenum,oneword->word);
over=oneword->typenum;
}
}
A reference implementation of the self-made function to be used
Reads a character from the input buffer into CH
Char M_getch () {
Ch=input[p_input];
p_input=p_input+1;
return (CH);
}
Remove whitespace characters
void Getbc ()
{
while (ch== ' | | ch==10) {
Ch=input[p_input];
p_input=p_input+1;
}
}
Stitching words
void Concat ()
{
Token[p_token]=ch;
p_token=p_token+1;
token[p_token]= ' + ';
}
Determine if the letter
int letter ()
{
if (ch>= ' a ' &&ch<= ' Z ' | | ch>= ' A ' &&ch<= ' Z ') return 1;
else return 0;
}
Judging whether the number
int digit ()
{
if (ch>= ' 0 ' &&ch<= ' 9 ')
return 1;
Else
return 0;
}
Retrieving a keyword table
int reserve ()
{
int i=0;
for (i=0;i<7;i++)
{
if (!strcmp (Rwtab[i],token))
{
return i+1;
}
i=i+1;
}
return 10;
}
Fallback one character
void Retract ()
{
p_input=p_input-1;
}
WORD *scaner ()
{
WORD *myword;
myword= (Word *) malloc (sizeof (word));
myword->typenum=10;
Myword->word= "";
p_token=0;
M_getch ();
GETBC ();
if (letter ())
{
while (letter () | | | Digit ())
{
Concat ();
M_getch ();
}
Retract ();
Myword->typenum=reserve ();
myword->word=token;
return (MyWord);
}
else if (digit ())
{
while (digit ())
{
Concat ();
M_getch ();
}
Retract ();
myword->typenum=20;
myword->word=token;
return (MyWord);
}
Else
{
Switch (CH)
{
Case ' = ': M_getch ();
if (ch== ' = ')
{
myword->typenum=39;
myword->word= "= =";
return (MyWord);
}
Retract ();
myword->typenum=21;
myword->word= "=";
return (MyWord);
Break
Case ' + ':
myword->typenum=22;
Myword->word= "+";
return (MyWord);
Break
Case '-':
myword->typenum=23;
Myword->word= "-";
return (MyWord);
Break
Case ' * ':
myword->typenum=24;
myword->word= "*";
return (MyWord);
Break
Case '/':
myword->typenum=25;
Myword->word= "/";
return (MyWord);
Break
Case ' (':
myword->typenum=26;
Myword->word= "(";
return (MyWord);
Break
Case ') ':
myword->typenum=27;
Myword->word= ")";
return (MyWord);
Break
Case ' [':
myword->typenum=28;
Myword->word= "[";
return (MyWord);
Break
Case '] ':
myword->typenum=29;
Myword->word= "]";
return (MyWord);
Break
Case ' {':
myword->typenum=30;
Myword->word= "{";
return (MyWord);
Break
Case '} ':
myword->typenum=31;
Myword->word= "}";
return (MyWord);
Break
Case ', ':
myword->typenum=32;
Myword->word= ",";
return (MyWord);
Break
Case ': ':
myword->typenum=33;
Myword->word= ":";
return (MyWord);
Break
Case '; ':
myword->typenum=34;
Myword->word= ";";
return (MyWord);
Break
Case ' > ':
myword->typenum=35;
Myword->word= ">";
return (MyWord);
Break
Case ' < ':
myword->typenum=36;
Myword->word= "<";
return (MyWord);
Break
Case '! ':
M_getch ();
if (ch== ' = ')
{
myword->typenum=40;
myword->word= "! =";
return (MyWord);
}
Retract ();
myword->typenum=-1;
Myword->word= "ERROR";
return (MyWord);
Break
Case ' + ':
myword->typenum=1000;
Myword->word= "Over";
return (MyWord);
Break
Default
myword->typenum=-1;
Myword->word= "ERROR";
return (MyWord);
}
}
}
0916 Job Two lexical analysis