Hotove
This commit is contained in:
commit
e635ba216c
0
a3/program.exe
Normal file
0
a3/program.exe
Normal file
3
sk4/Makefile
Normal file
3
sk4/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
all: program.c
|
||||
gcc program.c -o program
|
||||
|
15
sk4/Meno.txt
Normal file
15
sk4/Meno.txt
Normal file
@ -0,0 +1,15 @@
|
||||
TUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
INK INK INK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
BREK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
GLEK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK 102
|
||||
INK INK INK PUK 105
|
||||
INK INK INK INK INK INK INK INK INK PUK 114
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK 97
|
||||
FUK
|
18
sk4/kod.txt
Normal file
18
sk4/kod.txt
Normal file
@ -0,0 +1,18 @@
|
||||
TUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
INK INK INK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK PUK 111
|
||||
INK INK INK INK INK INK INK PUK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK PUK 110
|
||||
BREK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
GLEK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK
|
||||
INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK INK PUK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK
|
||||
INK INK INK PUK
|
||||
INK INK INK INK INK INK INK INK INK PUK
|
||||
DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK DEK PUK
|
||||
FUK
|
256
sk4/program.c
256
sk4/program.c
@ -1,47 +1,239 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
unsigned char tape[30000] = {0};
|
||||
unsigned char* ptr = tape;
|
||||
typedef enum {
|
||||
INK, DEK,//Enum je pouzity ,
|
||||
BREK, GLEK,//polia 2 rozmerne atd
|
||||
PUK, KUK,
|
||||
LP, RP,
|
||||
TUK, FUK
|
||||
}inst;
|
||||
|
||||
void interpret(char* input) {
|
||||
char dtape[30000] = {0};//hlava dh
|
||||
inst ptape[30000] = {0};//hlava ph
|
||||
size_t validRP[15000]={0};
|
||||
|
||||
inst* loops[2][15000] = {{0},{0}};//adresy zatvoriek
|
||||
size_t loopscount=0;//v globalnych premennych su ulozene udaje z pasky
|
||||
char* dhead = dtape;//smerniky
|
||||
inst* phead = ptape;
|
||||
|
||||
|
||||
void run_tukafuk(const char* code) {
|
||||
char current_char;
|
||||
bool running = false;
|
||||
size_t i;
|
||||
size_t loop;
|
||||
|
||||
for (i = 0; input[i] != 0; i++) {
|
||||
current_char = input[i];
|
||||
if (current_char == 'TUK') {//
|
||||
++ptr;
|
||||
} else if (current_char == 'FUK') {//
|
||||
--ptr;
|
||||
} else if (current_char == 'INK') {//+
|
||||
++*ptr;
|
||||
} else if (current_char == 'DEK') {//-
|
||||
--*ptr;
|
||||
} else if (current_char == 'PUK' ) {//.
|
||||
putchar(*ptr);
|
||||
} else if (current_char == 'KUK') {//,
|
||||
*ptr = getchar();
|
||||
} else if (current_char == '[') {//
|
||||
continue;
|
||||
} else if (current_char == ']' && *ptr) {//
|
||||
loop = 1;
|
||||
while (loop > 0) {
|
||||
current_char = input[--i];
|
||||
if (current_char == '[') {
|
||||
loop--;
|
||||
} else if (current_char == ']') {
|
||||
loop++;
|
||||
for (i = 0; code[i] != 0; i++){
|
||||
current_char = code[i];
|
||||
size_t j;
|
||||
size_t loop;
|
||||
switch(current_char){
|
||||
case 'T':
|
||||
if(code[i+1]=='U')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = TUK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case 'I':
|
||||
if(code[i+1]=='N')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = INK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case 'D':
|
||||
if(code[i+1]=='E')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = DEK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case 'B':
|
||||
if(code[i+1]=='R')
|
||||
if(code[i+2]=='E')
|
||||
if(code[i+3] =='K'){
|
||||
*phead = BREK;
|
||||
phead++;
|
||||
i+=3;
|
||||
}
|
||||
break;
|
||||
case 'G':
|
||||
if(code[i+1]=='L')
|
||||
if(code[i+2]=='E')
|
||||
if(code[i+3] =='K'){
|
||||
*phead = GLEK;
|
||||
phead++;
|
||||
i+=3;
|
||||
}
|
||||
break;
|
||||
case 'P':
|
||||
if(code[i+1]=='U')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = PUK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case 'K':
|
||||
if(code[i+1]=='U')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = KUK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case 'F':
|
||||
if(code[i+1]=='U')
|
||||
if(code[i+2]=='K'){
|
||||
*phead = FUK;
|
||||
phead++;
|
||||
i+=2;
|
||||
}
|
||||
break;
|
||||
case ']':
|
||||
for(size_t k=0;k<loopscount;k++){
|
||||
if(validRP[k]==i){
|
||||
*phead = RP;
|
||||
loops[1][k]=phead;
|
||||
phead++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case '[':
|
||||
j = i;
|
||||
loop = 1;
|
||||
while (loop > 0){//aby J nepreslo von.
|
||||
current_char = code[++j];//
|
||||
if (current_char==0){
|
||||
break;
|
||||
}
|
||||
if (current_char == ']'){
|
||||
loop--;
|
||||
} else if (current_char == '['){
|
||||
loop++;
|
||||
}
|
||||
}
|
||||
if(loop==0){
|
||||
*phead = LP;
|
||||
loops[0][loopscount] = phead;
|
||||
validRP[loopscount++] = j;
|
||||
phead++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
phead = ptape;
|
||||
for (i = 0; i<30000; i++){
|
||||
if(running){
|
||||
switch(*phead){
|
||||
case INK:
|
||||
//printf("Ink..%c",*dhead);
|
||||
(*dhead)++;
|
||||
//printf("->%c\n",*dhead);
|
||||
break;
|
||||
case DEK:
|
||||
//printf("Dek..%c",*dhead);
|
||||
(*dhead)--;
|
||||
//printf("->%c\n",*dhead);
|
||||
break;
|
||||
case BREK:
|
||||
dhead++;
|
||||
break;
|
||||
case GLEK:
|
||||
dhead--;
|
||||
break;
|
||||
case PUK:
|
||||
//printf("Puk\n");
|
||||
putchar(*dhead);
|
||||
//printf("\nPukEnd\n");
|
||||
break;
|
||||
case KUK:
|
||||
printf("Zadaj vstup:\n");
|
||||
*dhead=getchar();
|
||||
while(getchar()!='\n'){}
|
||||
//printf("Kukol %c\n",*dhead);
|
||||
break;
|
||||
case FUK:
|
||||
running=false;
|
||||
break;
|
||||
case LP:
|
||||
if(*dhead==0){
|
||||
for(int j=0;j<loopscount;j++){
|
||||
if(loops[0][j]==phead){
|
||||
phead=loops[1][j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RP:
|
||||
if(*dhead!=0){
|
||||
for(int j=0;j<loopscount;j++){
|
||||
if(loops[1][j]==phead){
|
||||
phead=loops[0][j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!running)
|
||||
break;
|
||||
}
|
||||
else{
|
||||
if(*phead==TUK)
|
||||
running=true;
|
||||
}
|
||||
phead++;
|
||||
}
|
||||
printf(" \n");
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
interpret(",[.[-],]"); // outputs input
|
||||
char buff[30000];
|
||||
FILE *fp;
|
||||
|
||||
fp = fopen("kod.txt","r");
|
||||
//memset(buff,0,sizeof(buff));
|
||||
size_t fr = fread(buff,1,30000,fp);
|
||||
buff[fr]=0;
|
||||
|
||||
//printf("buffer:\n %s\n",buff);
|
||||
run_tukafuk(buff);
|
||||
fclose(fp);
|
||||
/*printf("Programova Paska: \n");
|
||||
|
||||
for(inst *ptr=ptape;ptr<=phead;ptr++){
|
||||
switch (*ptr){
|
||||
case TUK:printf("TUK ");
|
||||
break;
|
||||
case INK:printf("INK ");
|
||||
break;
|
||||
case DEK:printf("DEK ");
|
||||
break;
|
||||
case BREK:printf("BREK ");
|
||||
break;
|
||||
case GLEK:printf("GLEK ");
|
||||
break;
|
||||
case PUK:printf("PUK ");
|
||||
break;
|
||||
case KUK:printf("KUK ");
|
||||
break;
|
||||
case FUK:printf("FUK ");
|
||||
break;
|
||||
case LP:printf("LP ");
|
||||
break;
|
||||
case RP:printf("RP ");
|
||||
break;
|
||||
default:printf("NULL ");
|
||||
break;
|
||||
}
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
BIN
sk4/program.exe
BIN
sk4/program.exe
Binary file not shown.
@ -1,2 +1,44 @@
|
||||
Riesenie inspirovane https://gist.github.com/maxcountryman/1699708
|
||||
álny stroj programovacieho jazyka TUKAFUK sa skladá z dvoch pások. Na jednej páske je napísaný program. Po programovej páske beží programová hlava PH a číta inštrukcie zľava doprava. Stroj má k dispozícii aj dátovú pásku s osobitnou hlavou DH.
|
||||
|
||||
Príklad počiatočného stavu virtuálneho stroja TUKAFUK:
|
||||
|
||||
PH
|
||||
|
|
||||
v
|
||||
+-----+-----+-----+-----+
|
||||
Program | TUK | INK | DEK | FUK |
|
||||
+-----+-----+-----+-----+
|
||||
|
||||
DH
|
||||
|
|
||||
v
|
||||
+---+---+---+---+
|
||||
Data | 0 | 0 | 0 | 0 |
|
||||
+---+---+---+---+
|
||||
Skladá sa z nasledujúcich symbolov:
|
||||
|
||||
TUK začiatok programu
|
||||
INK inkrementuj údaj na mieste kde ukazuje DH
|
||||
DEK dekrementuj údaj na mieste kde ukazuje DH
|
||||
BREK posuň hlavu DH do prava o jedno miesto
|
||||
GLEK posuň hlavu DH do ľava o jedno miesto
|
||||
PUK vypíš 1 byte z miesta kde ukazuje hlava DH
|
||||
KUK načítaj 1 byte na miesto je ukazuje hlava DH
|
||||
[ ak je hlava DH nula, posuň PH na zodpovedajúcu značku ]. Inak pokračj ďalej.
|
||||
] ak hlava nie je nula, pokračuj s PH na zodpovedajúvej značke [. Inak pokračuj ďalej.
|
||||
FUK koniec programu
|
||||
iný znak: odeľuje príkazy alebo slúži ako komentár.
|
||||
Vytvorte interpret jazyka TUKAFUK. Program by mal implementovať funkciu:
|
||||
|
||||
void run_tukafuk(const char* code);
|
||||
Funkcia preloží vstupný program (zistí adresy skokov) a spustí ho. Preklad programu znamená identifikáciu inštrukcií a zistenie adries pre skok programovej hlavy PH. Pri implementácii zistenia adries PH v programe pre inštrukcie [ a ]. Funkcie getchar() a putchar() použite pre implementáciu inštrukcií PUK a KUK . Pre implementáciu dátovej pásky použite pole znakov, pre implementáciu programovej pásky použite pole spracovaných inštrukcií.
|
||||
|
||||
Vytvorte program v jazyku TUKAFUK na výpis celého Vášho mena.
|
||||
|
||||
Opis Funkčnosti :
|
||||
Program načíta textový súbor do ktorého budú vložené jednotlivé inštrukcie začínajúci inštrukciou TUK a končiaci inštrukciou FUK. Teda program číta údaje z pásky ktoré sa ukladajú do globálnych premenných pričom tiež kontroluje, či je inštrukcia správne napísaná (namiesto INK INC, atd)a taktiež sa hneď posúva hlava, ktorá teda ide čítať ďalšiu inštrukciu
|
||||
Po načítani nasleduje samotný preklad ktorý je vykonávaný za pomoci smerníkov a ascii tabuľky
|
||||
Program bude fungovať ak :
|
||||
1.Budú inštrukcie zadané do textového súboru kod.txt
|
||||
2.Inštrukcie budú zapísané práve tak, že prvá inštrukcia bude TUK a posledná FUK
|
||||
3.A po určitom počte ink/dek inśtrukcií bude následovať výpis za pomoci funkcie PUK
|
||||
|
BIN
sk4/sk4.zip
Normal file
BIN
sk4/sk4.zip
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user