yashigani?.days

週刊少年ジャンプについてだらだら書きます

いつぞや書いたプログラム

面接官にやたらウケがいいので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);
  
}

ほんまにこれでいいのかわからん.
ちゃんとパーサとか書いてみたい.