nelson33

Untitled

Apr 11th, 2023
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include "lex.h"
  5.  
  6. static TokenSet getToken(void);
  7. static TokenSet curToken = UNKNOWN;
  8. static char lexeme[MAXLEN];
  9.  
  10. TokenSet getToken(void)
  11. {
  12.     int i = 0;
  13.     char c = '\0';
  14.  
  15.     while ((c = fgetc(stdin)) == ' ' || c == '\t');
  16.  
  17.     if (isdigit(c)) {
  18.         lexeme[0] = c;
  19.         c = fgetc(stdin);
  20.         i = 1;
  21.         while (isdigit(c) && i < MAXLEN) {
  22.             lexeme[i] = c;
  23.             ++i;
  24.             c = fgetc(stdin);
  25.         }
  26.         ungetc(c, stdin);
  27.         lexeme[i] = '\0';
  28.         return INT;
  29.     } else if (c == '+' || c == '-') {
  30.         lexeme[0] = c;
  31.         c = fgetc(stdin);
  32.         i = 1;
  33.         if (((c == '+' && lexeme[0] == '+') || (c == '-' && lexeme[0] == '-')) && i < MAXLEN){
  34.             lexeme[i] = c;
  35.             ++i;
  36.             lexeme[i] = '\0';
  37.             return INCDEC;
  38.         }
  39.         else if (((c == '+' && lexeme[0] == '=') || (c == '-' && lexeme[0] == '=')) && i < MAXLEN){
  40.             lexeme[i] = c;
  41.             ++i;
  42.             lexeme[i] = '\0';
  43.             return ADDSUB_ASSIGN;
  44.         }
  45.         else {
  46.             lexeme[i] = '\0';
  47.             ungetc(c, stdin);
  48.             return ADDSUB;
  49.         }
  50.     } else if (c == '&') {
  51.         lexeme[0] = c;
  52.         lexeme[1] = '\0';
  53.         return AND;
  54.     } else if (c == '|'){
  55.         lexeme[0] = c;
  56.         lexeme[1] = '\0';
  57.         return OR;
  58.     } else if (c == '^'){
  59.         lexeme[0] = c;
  60.         lexeme[1] = '\0';
  61.         return XOR;
  62.     } else if (c == '*' || c == '/') {
  63.         lexeme[0] = c;
  64.         lexeme[1] = '\0';
  65.         return MULDIV;
  66.     } else if (c == '\n') {
  67.         lexeme[0] = '\0';
  68.         return END;
  69.     } else if (c == '=') {
  70.         strcpy(lexeme, "=");
  71.         return ASSIGN;
  72.     } else if (c == '(') {
  73.         strcpy(lexeme, "(");
  74.         return LPAREN;
  75.     } else if (c == ')') {
  76.         strcpy(lexeme, ")");
  77.         return RPAREN;
  78.     } else if (isalpha(c)) {
  79.         lexeme[0] = c;
  80.         lexeme[1] = '\0';
  81.         return ID;
  82.     } else if (c == EOF) {
  83.         return ENDFILE;
  84.     } else {
  85.         return UNKNOWN;
  86.     }
  87. }
  88.  
  89. void advance(void) {
  90.     curToken = getToken();
  91. }
  92.  
  93. int match(TokenSet token) {
  94.     if (curToken == UNKNOWN)
  95.         advance();
  96.     return token == curToken;
  97. }
  98.  
  99. char *getLexeme(void) {
  100.     return lexeme;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment