/* E ::= T{+T} T ::= F{*F} F ::= (E)|i */ #include #include #include #include #define eprintf(...) fprintf(stderr, __VA_ARGS__) typedef enum TokenType { INT, PLUS, MINUS, LBRACE, RBRACE } TokenType; typedef struct _Token { TokenType type; int value; } Token; void fatal(const char* message); void scan(); void e(); void t(); void f(); const int LINE_MAX = 1024; char *line; int symbol; int char_num = 0; int main(int argc, char* argv[]) { line = calloc(sizeof(char), LINE_MAX); memset(line, 0, LINE_MAX); scan(); e(); if (symbol != '\n') { fatal("Syntax invalid"); } printf("Success\n"); free(line); return 0; } void scan() { symbol = getchar(); if (symbol == '\n') line[char_num++] = ' '; else line[char_num++] = symbol; } void e() { t(); while (symbol == '+') { scan(); t(); } } void t() { f(); while (symbol == '*') { scan(); f(); } } void f() { if (symbol == '(') { scan(); e(); if (symbol != ')') { fatal("Expected parentheses"); } } else if (symbol >= '0' && symbol <= '9') { ; } else if (symbol == '\n') { fatal("LF too early"); } else { fatal("Unexpected symbol"); } scan(); } void fatal(const char* message) { eprintf("\nError at char %d\n%s\n", char_num, line); eprintf("%*c\n", char_num, '^'); eprintf("Message: %s\n", message); exit(1); }