This commit is contained in:
Radovan Kofira 2021-01-11 12:31:56 +01:00
commit e635ba216c
8 changed files with 303 additions and 33 deletions

0
a3/program.exe Normal file
View File

3
sk4/Makefile Normal file
View File

@ -0,0 +1,3 @@
all: program.c
gcc program.c -o program

15
sk4/Meno.txt Normal file
View 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
View 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

View File

@ -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;
}

Binary file not shown.

View File

@ -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

Binary file not shown.