nelson33

Untitled

Apr 11th, 2023
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 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) || c == '_') {
  79.         lexeme[0] = c;
  80.         c = fgetc(stdin);
  81.         i = 1;
  82.         while(c = fgetc(stdin) != ' '){
  83.             lexeme[i] = c;
  84.             ++i;
  85.             c = fgetc(stdin);
  86.         }
  87.         ungetc(c, stdin);
  88.         return ID;
  89.     } else if (c == EOF) {
  90.         return ENDFILE;
  91.     } else {
  92.         return UNKNOWN;
  93.     }
  94. }
  95.  
  96. void advance(void) {
  97.     curToken = getToken();
  98. }
  99.  
  100. int match(TokenSet token) {
  101.     if (curToken == UNKNOWN)
  102.         advance();
  103.     return token == curToken;
  104. }
  105.  
  106. char *getLexeme(void) {
  107.     return lexeme;
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment