{ { a test} } CHARSET CHECKCHAR(CHAR CH) { IF (ISLETTER(CH)) { RETURN LETTERS; } IF (ISDIGIT(CH)) { RETURN DIGITS; } IF (ISWHITESPACE(CH)) { RETURN WHITESPACE; } SWITCH(CH) { CASE '+': RETURN SINGLEBEGINS; CASE '-': RETURN SINGLEBEGINS; CASE '*': RETURN SINGLEBEGINS; CASE '/': RETURN SINGLEBEGINS; CASE '^': RETURN SINGLEBEGINS; CASE '!': RETURN SINGLEBEGINS; CASE ';': RETURN SINGLEBEGINS; CASE '=': RETURN SINGLEBEGINS; CASE '#': RETURN SINGLEBEGINS; CASE '(': RETURN SINGLEBEGINS; CASE ')': RETURN SINGLEBEGINS; CASE '[': RETURN SINGLEBEGINS; CASE ':': RETURN MULTIBEGINS; CASE ']': RETURN SINGLEBEGINS; CASE '<': RETURN BOTHBEGINS; CASE '>': RETURN BOTHBEGINS; CASE ',': RETURN BOTHBEGINS; CASE ']': RETURN COMMENTBEGINS; CASE '\'': RETURN SINGLEQUOTE; CASE '"': RETURN DOUBLEQUOTE; DEFAULT: RETURN OTHERS; } } BOOL SCANNER>OPENFILE(CONST CHAR* FILENAME) { STREAM.OPEN(FILENAME, IOS::IN); IF (READCHAR(LASTCHAR)) { COUT<<"READY TO SCAN! BOSS!\N"; RETURN TRUE; } ELSE { COUT<<"THE FILE IS EMPTY\N"; RETURN FALSE; } } BOOL SCANNERISFINAL(STATEKIND STATE, TOKENKIND KIND) { SWITCH (STATE) { CASE ENDSINGLE: KIND=SINGLEKIND; RETURN TRUE; CASE ENDMULTI: KIND=MULTIKIND; RETURN TRUE; CASE ENDID: KIND=IDKIND; RETURN TRUE; CASE ENDNUMBER: KIND=NUMBERKIND; RETURN TRUE; CASE ENDDOUBLESTR: KIND=STRINGKIND; RETURN TRUE; CASE ENDSINGLESTR: KIND=STRINGKIND; RETURN TRUE; CASE ENDCOMMENT: KIND=COMMENTKIND; RETURN TRUE; CASE ERROR: KIND=ERRORKIND; RETURN TRUE; DEFAULT: RETURN FALSE; } } BOOL SCANNER>CH; RETURN TRUE; } } TOKENKIND SCANNER>NEXT() { TOKENKIND KIND=EOF; STATEKIND STATE=READY; COUNTER=0; DO { STATE=DFA[STATE](LASTCHAR); IF (ISFINAL(STATE, KIND))//ERROR IS ALSO CONSIDER TO BE FINAL { BUFFER[COUNTER]='\0'; IF (KIND==IDKIND&&ISRESERVED()) { KIND =RESERVEDKIND; } IF (STATE==ERROR) { COUT<<"ENCOUNTER ERROR\N"; } RETURN KIND; } //BEGIN COUNTING, AND I DON'T WANT TO OUTPUT COMMENT, //BECAUSE COMMENT MAY BE VERY, VERY LONG.... IF (!ISLOOP(STATE)&&STATE!=INSIDECOMMENT) { //IT BEGINS BUFFER[COUNTER]=LASTCHAR; COUNTER++; IF (COUNTER>MAXTOKENLENGTH) { COUT<<"MAX TOKEN LENGTH REACHED!\N"; RETURN ERRORKIND; } } COUT<')&&(CH=='=')) { RETURN BOTHEQUAL; } IF (BUFFER[0]==','&&CH=='.') { RETURN BOTHPERIOD1; } //DEFAULT RETURN ERROR; } } STATEKIND SINGLESYMBOLCHECK(CHAR CH) { RETURN ENDSINGLE; } STATEKIND STARTSINGLESTRCHECK(CHAR CH) { IF (CH=='\'') { RETURN ENDSINGLESTR; } ELSE { RETURN INSIDESINGLESTR; } } STATEKIND INSIDECOMMENTCHECK(CHAR CH) { IF (CH==']') { RETURN ENDBRACKET; } ELSE { RETURN INSIDECOMMENT; } } STATEKIND STARTDOUBLESTRCHECK(CHAR CH) { IF (CH=='"') { RETURN ENDDOUBLESTR; } ELSE { RETURN INSIDEDOUBLESTR; } } STATEKIND INSIDEMULTI1CHECK(CHAR CH) { IF (CH=='=') { RETURN INSIDEMULTI2; } ELSE { RETURN ERROR; } } STATEKIND INSIDEMULTI2CHECK(CHAR CH) { IF (CH==':') { RETURN INSIDEMULTI3; } ELSE { IF (ISWHITESPACE(CH)||ISLETTER(CH)||ISDIGIT(CH)) { RETURN ENDMULTI; } ELSE { RETURN ERROR; } } } STATEKIND INSIDEMULTI3CHECK(CHAR CH) { IF (ISWHITESPACE(CH)||ISLETTER(CH)||ISDIGIT(CH)) { RETURN ENDMULTI; } ELSE { RETURN ERROR; } } STATEKIND ENDBRACKETCHECK(CHAR CH) { RETURN ENDCOMMENT; } STATEKIND INSIDESINGLESTRCHECK(CHAR CH) { IF (CH=='\'') { RETURN ENDSINGLEQUOTE; } ELSE { RETURN INSIDESINGLESTR; } } STATEKIND INSIDEDOUBLESTRCHECK(CHAR CH) { IF (CH=='"') { RETURN ENDDOUBLEQUOTE; } ELSE { RETURN INSIDEDOUBLESTR; } } BOOL ISLETTER(CHAR CH) { RETURN CH>='A'&&CH<='Z'; } BOOL ISDIGIT(CHAR CH) { RETURN CH>='0'&&CH<='9'; }