面接官にやたらウケがいいので2回生のときに実験でコンパイラを書いた!なんて面接ででかい顔して言ってたけど,本当はif文の繰り返しで書いた非常に幼稚なものだったのでオートマトンってなに?な状態だったのでオートマトンを意識して書いてみたのだが,誰にもコードを見せていないのでこれでいいのか全然わからない.
誰か採点してくだしあ!
プログラム概要
文字でできたヘビA,Bを判定するプログラム. ヘビの特徴はそれぞれ ・ヘビA >'のあと1個以上の=が続き,#をはさんで前と同数の=のあと~で終わる. <例> >'===#===~ >'==#==~ >'===#==~ は=の数が違うので判定されない. ・ヘビB >^のあと1個以上のQ=が続き,~~で終わる. <例> >^Q=Q=Q=Q=~~ >^Q=Q=~~
snake.c
#include"snakes.h" #define MAX_LEN 256 void parse_snakes(char *str); void print_result(char *str, int state); int main(int argc, char* argv[]){ char *snake = argv[1]; //">'===#===~"; parse_snakes(snake); return 0; } void print_result(char *str, int state){ switch (state){ case SNAKE_A: printf("SNAKE_A "); break; case SNAKE_B: printf("SNAKE_B "); break; case ERROR: printf("NOT SNAKE "); break; default: printf("EXCEPTION ERROR! \n"); } printf(":: %s \n", str); } void parse_snakes(char *snake){ int state = START; int flag = 1; int body_count = 0; char str[MAX_LEN]; strncpy(str, snake, MAX_LEN); while(flag){ print_state(state); switch (state){ case START: if(*snake == '>') state = MOUTH; else state = ERROR; break; case MOUTH: if(*snake == '\'') state = EYE_A; else if(*snake == '^') state = EYE_B; else state = ERROR; break; case EYE_A: if(*snake == '='){ body_count++; state = BODY_A_1; } else state = ERROR; break; case BODY_A_1: if(*snake == '=') body_count++; else if(*snake == '#') state = CENTER; else state = ERROR; break; case CENTER: if(*snake == '='){ body_count--; state = BODY_A_2; } else state = ERROR; break; case BODY_A_2: if(*snake == '~') state = TAIL_A; else if(*snake == '=') body_count--; break; case TAIL_A: if(*snake == '\0' && body_count == 0) state = SNAKE_A; else state = ERROR; break; case EYE_B: if(*snake == 'Q'){ if(*(++snake) == '=') state = BODY_B; break; } state = ERROR; break; case BODY_B: if(*snake == 'Q'){ if(*(++snake) == '=') ; } else if(*snake == '~') state = TAIL_B; else state = ERROR; break; case TAIL_B: if(*snake == '~') state = SNAKE_B; else state = ERROR; break; case SNAKE_A: print_result(str, state); flag = 0; break; case SNAKE_B: print_result(str, state); flag = 0; break; case ERROR: print_result(str, state); flag = 0; break; default: printf("EXCEPTION ERROR. \n"); flag = 0; break; } if(*snake != '\0') snake++; } }
snakes.h
#include<stdio.h> #include<string.h> #include<stdlib.h> #define START 0 #define MOUTH 1 #define EYE_A 2 #define BODY_A_1 3 #define CENTER 4 #define BODY_A_2 5 #define TAIL_A 6 #define EYE_B 7 #define BODY_B 8 #define TAIL_B 9 #define SNAKE_A 10 #define SNAKE_B 11 #define ERROR 12 void print_state(int state){ printf("state:: "); switch(state){ case START: puts("START"); break; case MOUTH: puts("MOUTH"); break; case EYE_A: puts("EYE_A"); break; case BODY_A_1: puts("BODY_A_1"); break; case CENTER: puts("CENTER"); break; case BODY_A_2: puts("BODY_A_2"); break; case TAIL_A: puts("TAIL_A"); break; case EYE_B: puts("EYE_B"); break; case BODY_B: puts("BODY_B"); break; case TAIL_B: puts("TAIL_B"); break; case SNAKE_A: puts("SNAKE_A"); break; case SNAKE_B: puts("SNAKE_B"); break; case ERROR: puts("ERROR"); break; default: exit(EXIT_FAILURE); }
ほんまにこれでいいのかわからん.
ちゃんとパーサとか書いてみたい.