/* * getid - get an identifier. * * identifiers are any isidch conglomerate * that doesn't start with a numeric character. * this set INCLUDES keywords. */ void getid() { register int i; i = 0; while(isidch(lastch)) { if(i < 32) lastid[i++] = lastch; getch(); } lastid[i] = '\0'; lastst = id; }
// // getid - get an identifier. // // identifiers are any isidch conglomerate // that doesn't start with a numeric character. // this set INCLUDES keywords. // void getid() { int i; i = 0; lastid[0] = '_'; while(isidch(lastch)) { if(i < 120) { lastkw[i] = lastch; i++; lastid[i] = lastch; } getch(); } lastkw[i] = '\0'; lastid[i+1] = '\0'; lastst = id; }
/* * NextToken - get next symbol from input stream. * * NextToken is the basic lexical analyzer. It builds * basic tokens out of the characters on the input * stream and sets the following global variables: * * lastch: A look behind buffer. * lastst: type of last symbol read. * laststr: last string constant read. * lastid: last identifier read. * ival: last integer constant read. * rval: last real constant read. * * NextToken should be called for all your input needs... */ void NextToken() { int i, j; SYM *sp; int tch; restart: /* we come back here after comments */ if (backup_token) { backup_token = 0; lastch = '('; lastst = openpa; return; } SkipSpaces(); if( lastch == -1) { lastst = my_eof; dfs.printf("Returning EOF from NextToken.\n"); } else if(isdigit(lastch)) { getnum(); } else if(isidch(lastch)) { getid(); if( (sp = defsyms.Find(lastid,false)) != NULL) { tch = lastch; if (!(lastch==')' && sp->value.s[0]=='(')) { if (lstackptr < 19) { linstack[lstackptr] = lptr; chstack[lstackptr++] = tch; lptr = sp->value.s; } getch(); goto restart; } } } else { switch(lastch) { case '+': getch(); if(lastch == '+') { getch(); lastst = autoinc; } else if(lastch == '=') { getch(); lastst = asplus; } else lastst = plus; break; case '-': getch(); if(lastch == '-') { getch(); lastst = autodec; } else if(lastch == '=') { getch(); lastst = asminus; } else if(lastch == '>') { getch(); lastst = pointsto; } else lastst = minus; break; case '*': getch(); if(lastch == '=') { getch(); lastst = astimes; } else lastst = star; break; case '/': getch(); if(lastch == '=') { getch(); lastst = asdivide; } else if(lastch == '*') { inComment = TRUE; getch(); for(;;) { if(lastch == '*') { getch(); if(lastch == '/') { getch(); inComment = FALSE; goto restart; } } else getch(); } } else if (lastch == '/') { inComment = TRUE; for(;;) { getch(); if (lastch=='\n' || lastch==-1) { //getch(); inComment = FALSE; goto restart; } } } else lastst = divide; break; case '^': getch(); if( lastch == '=') { lastst = asxor; getch(); } else lastst = uparrow; break; case ';': getch(); lastst = semicolon; break; case ':': getch(); if (lastch==':') { lastst = double_colon; getch(); } else lastst = colon; break; case '=': getch(); if(lastch == '=') { getch(); lastst = eq; } else lastst = assign; break; case '>': getch(); if(lastch == '=') { getch(); lastst = geq; } else if(lastch == '>') { getch(); if(lastch == '=') { getch(); lastst = asrshift; } else if (lastch=='>') { getch(); if (lastch=='=') { getch(); lastst = asrrot; } else lastst = rrot; } else lastst = rshift; } else lastst = gt; break; case '<': getch(); if(lastch == '=') { getch(); lastst = leq; } else if(lastch == '<') { getch(); if(lastch == '=') { getch(); lastst = aslshift; } else if (lastch=='<') { getch(); if (lastch=='=') { getch(); lastst = aslrot; } else lastst = lrot; } else lastst = lshift; } else if (lastch == '>') { getch(); lastst = neq; } else lastst = lt; break; case '\'': getch(); ival = getsch(); /* get a string char */ if(lastch != '\'') error(ERR_SYNTAX); else getch(); lastst = cconst; break; case '\"': getch(); for(i = 0;i < MAX_STRLEN;++i) { if(lastch == '\"') break; if((j = getsch()) == -1) break; else laststr[i] = j; } laststr[i] = 0; lastst = sconst; if(lastch != '\"') error(ERR_SYNTAX); else getch(); break; case '!': getch(); if(lastch == '=') { getch(); lastst = neq; } else lastst = nott; break; case '%': getch(); if(lastch == '=') { getch(); lastst = asmodop; } else lastst = modop; break; case '~': getch(); lastst = cmpl; break; case '.': getch(); lastst = dot; if (lastch=='.') { getch(); if (lastch=='.') { getch(); lastst = ellipsis; strcpy_s(lastid, sizeof(lastid), "..."); } } break; case ',': getch(); lastst = comma; break; case '&': getch(); if( lastch == '&') { lastst = land; getch(); } else if( lastch == '=') { lastst = asand; getch(); } else lastst = bitandd; break; case '|': getch(); if(lastch == '|') { lastst = lor; getch(); } else if( lastch == '=') { lastst = asor; getch(); } else lastst = bitorr; break; case '(': getch(); lastst = openpa; break; case ')': getch(); lastst = closepa; break; case '[': getch(); lastst = openbr; break; case ']': getch(); lastst = closebr; break; case '{': getch(); lastst = begin; break; case '}': getch(); lastst = end; break; case '?': getch(); lastst = hook; break; case '\\': getch(); goto restart; default: getch(); error(ERR_ILLCHAR); goto restart; /* get a real token */ } } if(lastst == id) IdentifyKeyword(); // printf("token: %d",lastst); // if (lastst==id) // printf("lastid=%s| ", lastid); }
/* * NextToken - get next symbol from input stream. * * NextToken is the basic lexical analyzer. It builds * basic tokens out of the characters on the input * stream and sets the following global variables: * * lastch: A look behind buffer. * lastst: type of last symbol read. * laststr: last string constant read. * lastid: last identifier read. * ival: last integer constant read. * rval: last real constant read. * * NextToken should be called for all your input needs... */ void NextToken() { register int i, j; SYM *sp; restart: /* we come back here after comments */ SkipSpaces(); if( lastch == -1) lastst = tk_eof; else if(isdigit(lastch)) getnum(); else if(isidch(lastch)) { getid(); if( (sp = search(lastid,&defsyms)) != NULL ) { linstack[lstackptr] = lptr; chstack[lstackptr++] = lastch; lptr = sp->value.s; getch(); goto restart; } } else switch(lastch) { case '+': getch(); if(lastch == '+') { getch(); lastst = autoinc; } else if(lastch == '=') { getch(); lastst = asplus; } else lastst = plus; break; case '-': getch(); if(lastch == '-') { getch(); lastst = autodec; } else if(lastch == '=') { getch(); lastst = asminus; } else if(lastch == '>') { getch(); lastst = pointsto; } else lastst = minus; break; case '*': getch(); if(lastch == '=') { getch(); lastst = astimes; } else lastst = star; break; case '/': getch(); if(lastch == '=') { getch(); lastst = asdivide; } else if(lastch == '*') { inComment = TRUE; getch(); for(;;) { if(lastch == '*') { getch(); if(lastch == '/') { //getch(); inComment = FALSE; goto restart; } } else getch(); } } else if (lastch == '/') { inComment = TRUE; for(;;) { getch(); if (lastch=='\n') { //getch(); inComment = FALSE; goto restart; } } } else lastst = divide; break; case '^': getch(); lastst = uparrow; break; case ';': getch(); lastst = semicolon; break; case ':': getch(); lastst = colon; break; case '=': getch(); if(lastch == '=') { getch(); lastst = eq; } else lastst = assign; break; case '>': getch(); if(lastch == '=') { getch(); lastst = geq; } else if(lastch == '>') { getch(); if(lastch == '=') { getch(); lastst = asrshift; } else lastst = rshift; } else lastst = gt; break; case '<': getch(); if(lastch == '=') { getch(); lastst = leq; } else if(lastch == '<') { getch(); if(lastch == '=') { getch(); lastst = aslshift; } else lastst = lshift; } else if (lastch == '>') { getch(); lastst = neq; } else lastst = lt; break; case '\'': getch(); ival = getsch(); /* get a string char */ if(lastch != '\'') error(ERR_SYNTAX); else getch(); lastst = iconst; break; case '\"': getch(); for(i = 0;i < MAX_STRLEN;++i) { if(lastch == '\"') break; if((j = getsch()) == -1) break; else laststr[i] = j; } laststr[i] = 0; lastst = sconst; if(lastch != '\"') error(ERR_SYNTAX); else getch(); break; case '!': getch(); if(lastch == '=') { getch(); lastst = neq; } else lastst = not; break; case '%': getch(); if(lastch == '=') { getch(); lastst = asmodop; } else lastst = modop; break; case '~': getch(); lastst = compl; break; case '.': getch(); lastst = dot; if (lastch=='.') { getch(); if (lastch=='.') { getch(); lastst = ellipsis; strcpy(lastid, "..."); } } break; case ',': getch(); lastst = comma; break; case '&': getch(); if( lastch == '&') { lastst = land; getch(); } else if( lastch == '=') { lastst = asand; getch(); } else lastst = and; break; case '|': getch(); if(lastch == '|') { lastst = lor; getch(); } else if( lastch == '=') { lastst = asor; getch(); } else lastst = or; break; case '(': getch(); lastst = openpa; break; case ')': getch(); lastst = closepa; break; case '[': getch(); lastst = openbr; break; case ']': getch(); lastst = closebr; break; case '{': getch(); lastst = begin; break; case '}': getch(); lastst = end; break; case '?': getch(); lastst = hook; break; default: getch(); error(ERR_ILLCHAR); goto restart; /* get a real token */ } if(lastst == id) IdentifyKeyword(); }