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); } }
/* * 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; }
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(); } } }