- 论坛徽章:
- 3
|
本帖最后由 cjaizss 于 2012-11-14 20:42 编辑
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- int *tape;
- int tape_len;
- int tape_pos=0;
- #ifdef START
- #undef START
- #endif
- #ifdef ACCEPT
- #undef ACCEPT
- #endif
- #ifdef REJECT
- #undef REJECT
- #endif
- #ifdef BLANK
- #undef BLANK
- #endif
- #define START 0
- #define ACCEPT 1
- #define REJECT 2
- #define BLANK 0
- int stat = START;
- int max_stat = 3;/*:0:start,1:accept,2:reject,3~max_stat*/
- int max_char = 1;/*0:balnk,1~max_char*/
- typedef struct {
- int stat_now;
- int char_now;
- int stat_next;
- int char_next;
- int dir;/*0:tape_pos--,else:tape_pos++*/
- } rule_t;
- rule_t *rule;
- int rule_len;
- static void init_turing(const char* program)
- {
- FILE* f;
- char s[100];
- char s2[100];
- int rule_alloc_len;
- tape_len = 1024*1024;
- tape = (int*)malloc(sizeof(*tape)*tape_len);
- rule_len = 0;
- rule_alloc_len = 100;
- rule = (rule_t*)malloc(sizeof(rule_t)*rule_alloc_len);
- f = fopen(program,"r");
- while(1) {
- if(fgets(s,sizeof(s),f)==NULL)
- break;
- if(sscanf(s,"%s",s2)!=1)
- continue;
- if(strcmp(s2,"tape_len")==0) {
- sscanf(s,"%s%d",s2,&tape_len);
- tape = (int*)realloc(tape,sizeof(*tape)*tape_len);
- continue;
- }
- if(strcmp(s2,"max_stat")==0) {
- sscanf(s,"%s%d",s2,&max_stat);
- assert(max_stat>REJECT);
- continue;
- }
- if(strcmp(s2,"max_char")==0) {
- sscanf(s,"%s%d",s2,&max_char);
- assert(max_char>BLANK);
- continue;
- }
- if(sscanf(s,"%d%d%d%d%d",
- &rule[rule_len].stat_now,
- &rule[rule_len].char_now,
- &rule[rule_len].stat_next,
- &rule[rule_len].char_next,
- &rule[rule_len].dir) == 5) {
- if(max_char < rule[rule_len].char_now)
- max_char = rule[rule_len].char_now;
- if(max_char < rule[rule_len].char_next)
- max_char = rule[rule_len].char_next;
- if(max_stat < rule[rule_len].stat_now)
- max_stat = rule[rule_len].stat_now;
- if(max_stat < rule[rule_len].stat_next)
- max_stat = rule[rule_len].stat_next;
- rule_len++;
- if(rule_len >= rule_alloc_len) {
- rule_alloc_len += 100;
- rule = (rule_t*)realloc(rule,sizeof(rule_t)*rule_alloc_len);
- }
- }
- }
- rule = (rule_t*)realloc(rule,sizeof(rule_t)*rule_len);
- fclose(f);
- }
- static void init_tape(void)
- {
- int i;
- int x;
- memset(tape,0,sizeof(int)*tape_len);
- i=0;
- while(1) {
- if(scanf("%d",&x)!=1)
- break;
- if(x<0||x>max_char)
- fprintf(stderr,"%s:%d:input error",__FILE__,__LINE__);
- else
- tape[i++]=x;
- }
- }
- static int work_turing(void)
- {
- int i;
- init_tape();
- while(1) {
- for(i=0;i<rule_len;i++)
- if((rule[i].stat_now == stat)
- && (rule[i].char_now == tape[tape_pos]))
- break;
- if(i>=rule_len) {
- fprintf(stderr,"%s:%d:ERROR RULES:stat=%d,char=%d\n",__FILE__,__LINE__,stat,tape[tape_pos]);
- exit(1);
- }
- stat = rule[i].stat_next;
- tape[tape_pos] = rule[i].char_next;
- if(rule[i].dir)
- tape_pos++;
- else
- tape_pos--;
- if(stat <= REJECT)
- break;
- }
- return stat;
- }
- void write_result(const char* filename)
- {
- FILE *f;
- int i,j;
- for(i=tape_len-1;i>=0;i--)
- if(tape[i] != BLANK)
- break;
- for(j=0;j<=i;j++)
- printf("tape[%d]\t%d\n",j,tape[j]);
- if(filename == NULL)
- return;
- f = fopen(filename,"wb");
- fwrite(tape,sizeof(int),i+1,f);
- fclose(f);
- }
- int main(int argc,char**argv)
- {
- int ret;
- init_turing(argv[1]);
- ret = work_turing();
- switch(ret) {
- case ACCEPT:
- printf("RESULT:ACCEPT!\n");
- break;
- case REJECT:
- printf("RESULT:REJECT!\n");
- break;
- default:
- printf("%s:%d:ret=%d\n",__FILE__,__LINE__,ret);
- break;
- }
- if(argc == 3)
- write_result(argv[2]);
- else
- write_result(NULL);
- return 0;
- }
复制代码 |
|