Write a simple C ++ word scanner.

xiaoxiao2021-03-06  19

The interface is as shown: http://blog.9cbs.net/images/blog_9cbs_net/zjt621/111594/o_ui.jpg

/ ****************************************** * File: Unit2. H (scan.h) * // * a scanner for Lexical Analysis for C * // * Author: zhanjianTao (Compower) * // ******************** ********************** / # include #define maxno 48typedef strunt type {int line; ANSISTRING WORDS; ANSISUSTRING TYPE;} atoken; typedef Atoken * listnd;

class scan {public: bool IsReserveWord (AnsiString Token); void InitRW (); void DoScan (char * infile); void Print (int lineno, AnsiString stoken, int strgrdl, AnsiString Type); void MakeTL (int line, AnsiString words, Ansistring type); void compress (char * zipfname); public: char * file; char ch; ANSISTRING STRTOKEN; ANSISTRING RESERVEWS [MAXNO]; TLIST * tokenlist; listND anode;

#ENDIF

/ ****************************************** * File: Unit2. CPP (Scan.cpp) * // * a Scanner for Lexical Analysis for C * /// * Author: zhanjianTao (Compower) * // ******************** ******************************** / # include "Unit2.h" #include #include // initiate reserved Words ListVoid Scan :: init buflen = 10; char buf [buflen]; Ansistring gotword = "; ifstream inIrw (" initrw.ini "); int i = 0; While (InIrw.getLine (buf, buflen) ) {GotWord = BUF; Reservews [i ] = gotword;} inIrw.close (); tokenlist = new tlist;}

// judge the chin the rw list or notbool scan :: isReServeWord (ANSISTRING TOKEN) {BOOL RESULT = false; int low = 0; int high = maxno-1; while (low <= high) {INT MID = (Low high) / 2; int in (RSComp == 0) {result = true; Break;} if (RScomp <0) {rscomp == 0) {results = true; low = mid 1;}} return result;} // print on StringGridvoid scan :: Print (int lineno, AnsiString stoken, int strgrdl, AnsiString Type) {Form1-> StringGrid1-> RowCount ; Form1-> StringGrid1-> Cells [0] [strgrdl] = line1-> stringgrid1-> cells [1] [strgrdl] = stokeen; form1-> stringgrid1-> cells [2] [strgrdl] = type;}

// make a token listvoid scan :: manetl (int line, Ansistring Words, Ansistring Type) {

Anode = new atoken; anode-> line = line; anode-> words = words; anode-> type = type; tokenlist-> add (anode);

// scan - the hardcore of the scannervoid scan :: doscan (char * infile) {file = infile; ifstream scanfile (file);

INT LINECUNT = 1; // the Word in which line strtoken = ""; // Member of class scan int strgrdline = 1; // Temp Var for Show Result On StringGrid

Const int bflength = 254; // length of getline buffer char buffer [bflength]; // getline buffer

BOOL Comment = false; // for this kind of comment - "/ ** /" char prech = '@'; // pre be for / ** / comment

Ansistring pretoken = ""; // pre token for judging pointee and multi '*'

While (SCANFILE.GETLINE (Buffer, Bflength)) // Get Each Line of the .cpp file {int lnscptr = 0; while (buffer [lnscptr] == ') // Trim Left space LNSCPTR ; ch = buffer [lnscptr ]; / * Scan: important archmetic * / if (comment) {prech = ch; goto flag1;} else {while (ch! = '/ 0') // while not the line finish symbol do analysis {ix (isalpha) CH) || CH == '_') // id or keyword {while (isalpha (ch) || isdigit (ch) || ch == '_') {startken = strtoken ch ;CH = Buffer [ lnscptr];} IF (isReServeWord (STRTOKEN)) // is ReserveWord {Print (Linecount, Strtoken, Strgrdline, "Reserved Word"); Maketl (Linecount, Strtoken, "Reserved Word");} else // is id { Print (Linecount, Strtoken, Strgrdline, "Identifier"); Maketl (LineCount, Strtoken, "Identifier");} Pretoken = STRTOKEN; STRGRDLINE ; STRTOKEN.DELETE (1, STRTO Ken.Length ());} else IF (isdigit (ch)) // numerci {while (isdigit (ch) || CH == '.') {startken = strtoken ch ;CH = Buffer [ lnscptr] }

Bool isint = true; for (int POS = 1; POS <= stroken.Length (); POS ) {IF (strtoken [POS] == '.') {isint = false; Break;}} if (isint) / / is int {print (Linecount, STRTOKEN, STRGRDLINE, "integer"); Maketl (LineCount, STRTOKEN, "integer");} else // is float {print (Linecount, Strtoken, Strgrdline, "Floating point number"; MAKETL (LineCount, Strtoken, "Floating point number");} strgrdline ; strtoken.delete (1, strtoken.Length ());} else if (ch == '|| CH ==' / t '|| CH == '/ n') // skip space, tab and enter {ch = buffer [ lnscptr];} else // Other special symbols {switch (ch) {copy '#': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; while (ch! = '/ 0' && ch! = '/') {strtoken = strtoken ch; CH = Buffer [ LNSCPTR];} Print (Linecount, Strtoken, Strgrdline, "Predefined"); Maketl (LineCount, STRTOKEN, "Best"); Break;

Case '/' ': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; while (ch! =' / ') {strtoken = strtoken ch ;CH = Buffer [ lnscptr];} startken = STRTOKEN CH; CH = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "Character Constant"); Maketl (Linecount, Strtoken, "Character Constant"); Break; Case '": Strtoken = STRTOKEN CH; ch = buffer [ lnscptr]; while (ch! = '") {strtoken = strtoken ch ;CH = Buffer [ lnscptr];} strand = strtoken ch ;CH = Buffer [ LNSCPTR ]; Print (Linecount, Strtoken, Strgrdline, "String"); Maketl (Linecount, Strtoken, "String"); Break; Case '=': strtoken = STRTOKEN CH ;CH = Buffer [ LNSCPTR];IF (CH == '=') {Strtoken = STRTOKEN CH; CH = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "Logic, etc.); Maketl (Linecount, Strtoken," Logic, etc.) Else {Print (Linecount, Strtoken, Strgrdline, "Assign"); Maketl (LineCount, Strtoken, "Assignment No.");} Break;

Case ' ': strtoken = strtoken ch ;CH = Buffer [ LNSCPTR]; if (CH == '=') {strtoken = strtoken ch ;CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN , strgrdline, " = operator"); Maketl (LineCount, Strtoken, " = operator");} else if (ch == ' ') {startken = strtoken ch ;CH = Buffer [ LNSCPTR ]; Print (LineCount, STRTOKEN, STRGRDLINE, "Incremental Operators"); Maketl (LineCount, Strtoken, "Incremental Operator");} else {print (Linecount, Strtoken, Strgrdline, "plus operator"); Maketl (Linecount, Strtoken, "plus operator");

Case '-': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '=') {startken = strtoken ch ;CH = Buffer [ lnscptr]; print (Linecount, STRTOKEN , strgrdline, "- = operator"); Maketl (Linecount, Strtoken, "- = operator");} else if (ch == '>') {startken = strtoken ch ;CH = Buffer [ LNSCPTR ]; Print (Linecount, Strtoken, Strgrdline, "Pointer operator"); Maketl (LineCount, Strtoken, "Pointer operator");} else if (ch == '-') {startken = strtoken ch ;CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN, STRGRDLINE, "Decreasing Operators"); Maketl (Linecount, Strtoken, "Decreasing Operators");} else {print (Linecount, STRTOKEN, STRGRDLINE, "minus runtime "); Maketl (Linecou) NT, STRTOKEN, "minus operator");} Break;

CASE '*': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '=') {startken = strtoken ch ;CH = Buffer [ lnscptr]; print (Linecount, STRTOKEN , strgrdline, "* = operator"); Maketl (Linecount, Strtoken, "* = operator");} else if (isReServeWord (Pretoken) {print (Linecount, Strtoken, Strgrdline, "Pointer Definitation"); Maketl (Linecount, Strtoken, "Pointer Definition"); Else {Print (Linecount, Strtoken, Strgrdline, "Multi-line operator"); Maketl (LineCount, Strtoken, "Multi-level operator");} Break; Case '/': Startken = startoke ch ;CH = Buffer [ lnscptr]; if (ch == '/') {startken = strtoken ch ;CH = Buffer [ lnscptr]; while (ch! = ' / 0 ') { STRTOKEN = STRTOKEN CH ;CH = Buffer [ LNSCPTR];} Print (Linecount, Strtoken, Strgrdline, "Notes";

ELSE IF (CH == '*') {flag1: startken = startken ch ;CH = Buffer [ lnscptr]; while ((prech! = '*' || ch! = '/') && ch! = '/ 0') {stranden = STRTOKEN CH; CH = Buffer [ LNSCPTR]; prech = buffer [lnscptr-1];} if (ch! = '/ 0') {strtoken = strtoken ch;}

IF (prech == '*' && ch == '/') {comment = false;} else {comment = true;

IF (ch! = '/ 0') {CH = Buffer [ LNSCPTR];} Print (Linecount, Strtoken, Strgrdline, "Notes";

ELSE IF (CH == '=') {Strtoken = STRTOKEN CH; CH = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "/ = operator"); Maketl (Linecount, Strtoken, "/ = Operator ");} else {print (Linecount, Strtoken, Strgrdline," Separant operator "); Maketl (LineCount, STRTOKEN," Separator ");} Break;

Case '%': strokenuen = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '=') {startken = strtoken ch ;CH = Buffer [ lnscptr]; print (Linecount, STRTOKEN , strgrdline, "% = operator"); Maketl (Linecount, Strtoken, "% = operator");} else {print (Linecount, Strtoken, Strgrdline, "Model Operator"); Maketl (Linecount, Strtoken, " Model ");} Break; Case '<': strtoken = strtoken ch ;CH = Buffer [ LNSCPTR]; if (CH == '=') {startken = STRTOKEN CH ;CH = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "less than or equal to number"); Maketl (Linecount, Strtoken, "less than or equal");} else {print (Linecount, Strtoken, Strgrdline, "less than)); MAKETL (Linecount, STRTOKEN, "less than));

Case '>': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '=') {strTrtoken = STRTOKEN CH ;CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN Strgrdline, "greater than or equal"); MakeTl (LineCount, STRTOKEN, "greater than or equal");} else {print (Linecount, Strtoken, Strgrdline, "bigger than number"); Maketl (Linecount, STRTOKEN, "bigger than number" );} Break; Case '!': Strtoken = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '=') {startken = strtoken ch ;CH = Buffer [ lnscptr]; Print (Linecount, STRTOKEN, STRGRDLINE, "不 等 号"); Maketl (Linecount, Strtoken, "No Part No");} else {print (Linecount, Strtoken, Strgrdline, "Logic Non"); Maketl (Lin ECOUNT, STRTOKEN, "Logic Non";

CASE '&': STRTOKEN = STRTOKEN CH; CH = Buffer [ LNSCPTR]; if (CH == '&') {Strtoken = STRTOKEN CH ;CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN , StrgrdLine, "Logic"); Maketl (Linecount, Strtoken, "Logic and");} else {print (Linecount, Strtoken, Strgrdline, "Bits and Operators"); Maketl (Linecount, Strtoken, "and Computing ");} Break; case '|': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; if (ch == '|') {startken = strtoken ch ;CH = Buffer [ LNSCPTR ]; Print (Logic or "); Maketl (LineCount, Strtoken," Logic or ");} else {print (Linecount, Strtoken, Strgrdline," Bit or Operator "); Maketl (Lin ECOUNT, STRTOKEN, "bit or operator");} Break

Case '^': strTrtoken = STRTOKEN CH; CH = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "Align or Operator"); Maketl (Linecount, Strtoken, "Algorithm"); Break;

Case '[': strtoken = startken ch ;CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN, STRGRDLINE, "Left Bracket"); Maketl (Linecount, Strtoken, "Left Brand"); Break; Case ']': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; print (Linecount, Strtoken, Strgrdline, "Brand Bracket"); Maketl (Linecount, Strtoken, "Right Bracket"); Break; Case '(': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; Print (Linecount, Strtoken, Strgrdline, "Left Brand Brand"); Maketl (Linecount, STRTOKEN, "Left Brand Brand"); BREAK; Case ')': strtoken = strtoken ch ;CH = Buffer [ lnscptr]; Print (Linecount, Strtoken, Strgrdline, "Right Brand Brand"); Maketl (Linecount, Strtoken, "Right Brand Brand"); Break; Case '{': strtoken = strtoken ch ;C = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "Left Brand Brand"); Maketl (Linecount, Strtoken, "Left Brand Brand"); Break; Case '}': Strtoken = STRTOKEN CH ;C = Buffer [ LNSCPTR]; Print (Linecount, Strtoken, Strgrdline, "Right Brand Brand"); Maketl (LineCount, Strtoken, "Right Brand Braces"); Break; Case ',': Case ';': STRTOKEN =

STRTOKEN CH; CH = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN, STRGRDLINE, "Division"); Maketl (Linecount, Strtoken, "Division"); Break; Default: Strtoken = STRTOKEN CH ;C = Buffer [ LNSCPTR]; Print (Linecount, STRTOKEN, STRGRDLINE, "Other Special Symbol"); Maketl (LineCount, Strtoken, "Other Special Symbol"); Break;} // Switch Strgrdline ; STRTOKEN.DELETE (1, STRTOKEN.LENGTH ());} // else

} // _ While Buffer []! = '/ 0'} / * scan: important archmetic * / linecount ;} // _ while getline scanfile.close ();

Void Scan :: Compress (Char * Zipfname) {OfStream Compress (zipfname, ios :: app);

For (INT i = 0; i count; i ) {anode = (listnd) tokenlist-> items [i]; if (anode-> type == "predefined") {compress << anode-> Words.c_str () << Endl;} else if (anode-> type == "reserved word") {compress << anode-> words.c_str (); compress << ";} else {compress << anode -> Words.c_str ();}} compress.close ();

}

转载请注明原文地址:https://www.9cbs.com/read-40049.html

New Post(0)