Mercurial > hg > Members > nobuyasu > CbC
view automaton/fautomaton1.cbc~ @ 3:4e98faa1d831
add automaton
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 19 Apr 2012 13:41:11 +0900 |
parents | |
children |
line wrap: on
line source
/* * Implementation of the fininte automat by CbC * test program * * Finite automaton M. * M = ({q1,q2},{0,1}, delta, q1, {q2}) * * delta = * |0 1 * ----------- * q1|q1 q2 * q1|q1 q2 */ #include <stdio.h> #include <stdlib.h> // exit() #include <string.h> // strlen() __code q1(char *c, int size, int count); __code q2(char *c, int size, int count); __code print_error() { printf("error\n"); exit(0); } __code no_recognize() { printf("no recognize\n"); } __code recognize() { printf("recognize\n"); } int _isspace(char c) { return c == ' ' || c == '\t'; } char *skipchar(char *c) { while(_isspace(*c)) { c++; } return c; } __code q1(char *c, int size, int count) { // char *ch = skipchar(c); char *ch = c; ch++; count++; switch(*c) { case '0': goto q1(ch, size, count); break; case '1': goto q2(ch, size, count); break; default: if(count >= size) goto no_recognize(); else goto recognize(); } } __code q2(char *c, int size, int count) { // char *ch = skipchar(c); char *ch = c; ch++; count++; switch(*c) { case '0': goto q1(ch, size, count); break; case '1': goto q2(ch, size, count); break; default: if(count >= size) goto recognize(); else goto no_recognize(); } } int main(int argc, char *argv[]) { if(argc == 1 ) goto print_error(); int size = strlen(argv[1]); char *c = argv[1]; goto q1(c, size, 0); return 0; }