#include #define MAX_OPER 8 #define MAX_STACK 30 char expr[200]; /* Výraz */ typedef struct { /* Definice operátoru */ char Name; char CompPr,StackPr; } TOperand; typedef struct { /* Zásobník operátorů */ char Num,Pr; } T1Stack; TOperand DefOp[MAX_OPER] = { { 0, 0, 0}, /* Konec řetězce */ {'(', 5, 1}, {')', 2, 2}, {'*', 4, 4}, {'/', 4, 4}, {'%', 4, 4}, {'+', 3, 3}, {'-', 3, 3} }; char *PgmOp[8] = { /* Základní operace */ /* Vše se kopíruje na výstup, jen proměnné `|xyz|' se nahradí patričnými čísly proměnných, a `|#|' adresou skoku před program. \global\cmtindent=0.8\hsize*/ "", /* 0 */ "jeq 0,0,#\n", /* Konec */ "clr z\njeq z,x,3\ninc z\njeq x,x,-2\n", /* $\leftarrow$ */ "clr z\nclr 27\njeq 27,x,8\ninc 27\nclr 28\njeq 28,y,4\n" "inc 28\ninc z\njeq z,z,-3\njeq z,z,-7\n", /* |*| */ "clr z\njeq z,y,#\nclr 27\nclr 28\njeq 28,y,5\njeq 27,x,6\ninc 27\n" "inc 28\njeq z,z,-4\ninc z\njeq z,z,-7\n", /* |/| */ "clr 27\njeq y,27,#\nclr z\njeq z,y,-1\njeq 27,x,4\ninc 27\ninc z\n" "jeq z,z,-4\n", /* |%| */ "clr z\njeq z,x,3\ninc z\njeq x,x,-2\n" /* |+| */ "clr 27\njeq 27,y,4\ninc 27\ninc z\njeq x,x,-3\n", "clr z\njeq z,x,3\ninc z\njeq x,x,-2\n" /* |-| \global\cmtindent=0.4\hsize */ "clr 27\njeq 27,y,4\ninc 27\ndec z\njeq x,x,-3\n" }; T1Stack Oper[MAX_STACK]; int Var[MAX_STACK]; int OperCnt,VarCnt; /* Proměnné: 0=výsledek, 1--26=vstupy, 27--28=pomocné, 29--\dots=mezivýsledky */ int lex(int *idx, int *what) { /* Typ symbolu, index do řetězce, číslo symbolu */ char a; for(;;) { a=expr[(*idx)++]; /* Načti další znak */ if (a>='a' && a<='z') { /* Operand */ (*what)=a-'a'+1; return 1; } else { int i; for(i=0;i0 && DefOp[what].CompPr<=Oper[OperCnt-1].Pr) { output(Var[VarCnt-2],Var[VarCnt-1], free,Oper[OperCnt-1].Num,&instr); Var[--VarCnt-1]=free++; OperCnt--; } /* Vyhodnoť vyšší priority */ if (what==2) /* Odstranit `|(|' */ OperCnt--; else if (what) { /* Na zásobník kromě EOLN */ Oper[OperCnt].Num=what; Oper[OperCnt++].Pr=DefOp[what].StackPr; } } } while (type || what); /* Konec na konec řetězce */ output(Var[0],0,0,2, &instr); /* Přiraď zásobník do 0 */ output(0,0,0,1, &instr); /* Skoč před program */ } int main(void) { printf("Enter an expression: "); gets(expr); compile(); return 0; }