Exemple #1
0
void literal() {
    if (lookahead == TRUE_T) {
        match(TRUE_T);
        emit("1");
    } else if (lookahead == FALSE_T) {
        match(FALSE_T);
        emit("0");
    } else if (lookahead == ID) {
        symtable_record_ptr rec = symtable_get(token_value_str);
        match(ID);
        char s[33];
        sprintf(s, "%d", rec->value);
        emit(s);
    } else {
        char s[33];
        sprintf(s, "%d", token_value);
        match(NUM);
        emit(s);
    }
}
Exemple #2
0
/*
 * Export a variable in our symbol table to the environment. 
 */
int builtin_export(int argc, char **argv, int in, int out, int err){

  char *symdata;

  /* Ignore the name of the command. */
  argc--;
  argv++;

  /* Now attempt to export each passed argument. */
  while ( *argv ){

    symdata = symtable_get(*argv);
    setenv(*argv, symdata, 1);

    argv++;

  }

  return RSH_OK;

}
Exemple #3
0
token lex() {
    int state = 0;  

    // remove last token from buffer.
    int n = BUFFER_SIZE - forward;
    strncpy(buffer, buffer+forward, n);
    buffer[n] = '\0';     
    lexeme_beginning = 0;
    forward = 0;

    int buffer_end = strlen(buffer);

    if (!end_reached) {
        // fill buffer
        while (buffer_end < BUFFER_SIZE - 1) {
            char c = getchar();
            if (!feof(stdin)) {
                buffer[buffer_end++] = c;
            } else {
                end_reached = 1;
                // EOF marker.
                buffer[buffer_end++] = EOF_MARKER;
                break;
            }
        }      
        buffer[buffer_end] = '\0';    
    }

    while (1) {
        char c = buffer[forward++];
        switch(state) {
            case 0: if (c == ' ' || c == '\t' || c == '\n') {
                state = 0;
                lexeme_beginning++;
            } else {
                switch(c) {
                    case ';': return SEMICOLON;
                    case ')': return CLOSE_BRACKET;
                    case '(': return OPEN_BRACKET; 
                    case '=': return EQUALS;
                    case EOF_MARKER: return EOF;
                    default: if (isalpha(c)) { state = 1; }
                             else if (isdigit(c)) { state = 2; }
                             else { lex_error(); }
                             break;
                }
            } break;
            case 1: if (isdigit(c) || isalpha(c)) {
                state = 1;
            } else {
                // retract forward pointer.
                forward--;
                int n = forward - lexeme_beginning;

                strncpy(token_value_str, buffer+lexeme_beginning, n);
                token_value_str[n] = '\0';

                symtable_record_ptr rec = symtable_get(token_value_str);
                if (rec) {
                    return rec->token;
                } else {
                    return ID;
                }
            } break;
            case 2: if (isdigit(c)) {
                state = 2;
            } else {
                // retract forward pointer.
                forward--;
                int n = forward - lexeme_beginning;

                strncpy(token_value_str, buffer+lexeme_beginning, n);
                token_value_str[n] = '\0';

                token_value = atoi(token_value_str);
                return NUM;
            } break;
            default: lex_error();
        }
    }
}