| 1 | %{
|
|---|
| 2 | #include <stdio.h>
|
|---|
| 3 | #include <stdlib.h>
|
|---|
| 4 | #include <string.h>
|
|---|
| 5 |
|
|---|
| 6 | #define TRUE 1
|
|---|
| 7 | #define FALSE 0
|
|---|
| 8 |
|
|---|
| 9 | char arg = 'a';
|
|---|
| 10 | char procname[256] = {0};
|
|---|
| 11 | char defprocname[256] = {0};
|
|---|
| 12 | char tempname[256];
|
|---|
| 13 | char returntype[256] = {0};
|
|---|
| 14 | char typename[256] = {0};
|
|---|
| 15 | char callconv[256] = {0};
|
|---|
| 16 | int i;
|
|---|
| 17 | int firstarg = TRUE;
|
|---|
| 18 | int fStartProc = FALSE;
|
|---|
| 19 | int fVoidReturn = FALSE;
|
|---|
| 20 | int nrargs = 0;
|
|---|
| 21 | FILE *file = NULL;
|
|---|
| 22 | %}
|
|---|
| 23 |
|
|---|
| 24 | %token NAME
|
|---|
| 25 | %token ENDOFPROC
|
|---|
| 26 | %token BRACKETOPEN
|
|---|
| 27 | %token BRACKETCLOSE
|
|---|
| 28 | %token COMMA
|
|---|
| 29 | %token POINTER
|
|---|
| 30 | %token PPOINTER
|
|---|
| 31 | %token CONST
|
|---|
| 32 | %token VOID
|
|---|
| 33 | %token BEGINPROC
|
|---|
| 34 | %token ENDPROC
|
|---|
| 35 | %token STAT_IFDEF
|
|---|
| 36 | %token STAT_IFNDEF
|
|---|
| 37 | %token STAT_ENDIF
|
|---|
| 38 | %token STAT_INCLUDE
|
|---|
| 39 | %token STAT_DEFINE
|
|---|
| 40 | %token STAT_UNDEF
|
|---|
| 41 | %token STAT_INLINE
|
|---|
| 42 | %token STRUCT
|
|---|
| 43 | %%
|
|---|
| 44 |
|
|---|
| 45 | lines : line
|
|---|
| 46 | | lines line
|
|---|
| 47 | ;
|
|---|
| 48 |
|
|---|
| 49 | line : IFDEFSTATEMENT
|
|---|
| 50 | | ENDIFSTATEMENT
|
|---|
| 51 | | INCLUDESTATEMENT
|
|---|
| 52 | | DEFINESTATEMENT
|
|---|
| 53 | | PROCEDUREDEF
|
|---|
| 54 | ;
|
|---|
| 55 |
|
|---|
| 56 | //PROCEDUREDEF : RET PROCNAME BRACKETOPEN ARGUMENTS BRACKETCLOSE ENDOFPROC
|
|---|
| 57 | PROCEDUREDEF : RET CALLCONV PROCNAME BRACKETOPEN ARGUMENTS BRACKETCLOSE ENDOFPROC
|
|---|
| 58 | {
|
|---|
| 59 | fprintf(file, " push fs\n");
|
|---|
| 60 | fprintf(file, " mov eax, 0150bh\n");
|
|---|
| 61 | fprintf(file, " mov fs, eax\n");
|
|---|
| 62 |
|
|---|
| 63 | for(i=0;i<nrargs;i++) {
|
|---|
| 64 | fprintf(file, " push dword ptr [esp+%d]\n", 8+(nrargs-i-1)*4 + i*4);
|
|---|
| 65 | }
|
|---|
| 66 | fprintf(file, " call %s\n", &defprocname[1]);
|
|---|
| 67 | if(nrargs) {
|
|---|
| 68 | fprintf(file, " add esp, %d\n", nrargs*4);
|
|---|
| 69 | }
|
|---|
| 70 | fprintf(file, " pop fs\n");
|
|---|
| 71 | fprintf(file, " ret\n");
|
|---|
| 72 | fprintf(file, "%s ENDP\n", defprocname);
|
|---|
| 73 |
|
|---|
| 74 | fprintf(file, "\nCODE32 ENDS\n\n");
|
|---|
| 75 | fprintf(file, " END\n");
|
|---|
| 76 | fclose(file);
|
|---|
| 77 | }
|
|---|
| 78 | ;
|
|---|
| 79 |
|
|---|
| 80 |
|
|---|
| 81 | RET : NAME
|
|---|
| 82 | {
|
|---|
| 83 | strcpy(typename, (char *)$1);
|
|---|
| 84 | strupr(typename);
|
|---|
| 85 | // printf("inline %s %s ", $1, callconv);
|
|---|
| 86 | // printf("inline %s ", $1);
|
|---|
| 87 | if(strcmp(typename, "VOID") != 0) {
|
|---|
| 88 | fVoidReturn = FALSE;
|
|---|
| 89 | }
|
|---|
| 90 | else fVoidReturn = TRUE;
|
|---|
| 91 | }
|
|---|
| 92 | | NAME POINTER
|
|---|
| 93 | {
|
|---|
| 94 | strcpy(typename, (char *)$1);
|
|---|
| 95 | strupr(typename);
|
|---|
| 96 | strcat(typename, " *");
|
|---|
| 97 | // printf("inline %s %s *", $1, callconv);
|
|---|
| 98 | // printf("inline %s *", $1);
|
|---|
| 99 | if(strcmp(typename, "VOID") != 0) {
|
|---|
| 100 | fVoidReturn = FALSE;
|
|---|
| 101 | }
|
|---|
| 102 | else fVoidReturn = TRUE;
|
|---|
| 103 | }
|
|---|
| 104 | ;
|
|---|
| 105 | CALLCONV : NAME
|
|---|
| 106 | {
|
|---|
| 107 | strcpy(callconv, (char *)$1);
|
|---|
| 108 | }
|
|---|
| 109 | ;
|
|---|
| 110 |
|
|---|
| 111 | PROCNAME : NAME
|
|---|
| 112 | {
|
|---|
| 113 | strcpy(procname, (char *)$1);
|
|---|
| 114 | strcat(procname, ".asm");
|
|---|
| 115 | file = fopen(procname, "wb+");
|
|---|
| 116 |
|
|---|
| 117 | strcpy(procname, (char *)$1);
|
|---|
| 118 | strcpy(defprocname, procname);
|
|---|
| 119 |
|
|---|
| 120 | fprintf(file, " .386p\n");
|
|---|
| 121 | fprintf(file, "CODE32 SEGMENT DWORD PUBLIC USE32 'CODE'\n");
|
|---|
| 122 | fprintf(file, "\n EXTRN %s:PROC\n", &defprocname[1]);
|
|---|
| 123 | fprintf(file, " PUBLIC %s\n", $1);
|
|---|
| 124 | fprintf(file, "%s PROC NEAR\n", $1);
|
|---|
| 125 |
|
|---|
| 126 | nrargs = 0;
|
|---|
| 127 |
|
|---|
| 128 | if(!strncmp(procname, "Mou", 3))
|
|---|
| 129 | {
|
|---|
| 130 | strupr(defprocname);
|
|---|
| 131 | sprintf(tempname, "MOU16%s", &defprocname[3]);
|
|---|
| 132 | strcpy(defprocname, tempname);
|
|---|
| 133 | }
|
|---|
| 134 | else
|
|---|
| 135 | if(!strncmp(procname, "Kdb", 3))
|
|---|
| 136 | {
|
|---|
| 137 | strupr(defprocname);
|
|---|
| 138 | sprintf(tempname, "KDB16%s", &defprocname[3]);
|
|---|
| 139 | strcpy(defprocname, tempname);
|
|---|
| 140 | }
|
|---|
| 141 | else
|
|---|
| 142 | if(!strncmp(procname, "Vio", 3))
|
|---|
| 143 | {
|
|---|
| 144 | strupr(defprocname);
|
|---|
| 145 | sprintf(tempname, "VIO16%s", &defprocname[3]);
|
|---|
| 146 | strcpy(defprocname, tempname);
|
|---|
| 147 | }
|
|---|
| 148 | $$ = $1;
|
|---|
| 149 | }
|
|---|
| 150 | ;
|
|---|
| 151 | ARGUMENTS : ARGUMENTS COMMA ARGUMENT
|
|---|
| 152 | | ARGUMENT
|
|---|
| 153 | | /* nothing */
|
|---|
| 154 | ;
|
|---|
| 155 |
|
|---|
| 156 | ARGUMENT : TYPE NAME
|
|---|
| 157 | | TYPE
|
|---|
| 158 | ;
|
|---|
| 159 |
|
|---|
| 160 | TYPE : CONST NAME PPOINTER
|
|---|
| 161 | {
|
|---|
| 162 | nrargs++;
|
|---|
| 163 | }
|
|---|
| 164 | | CONST STRUCT NAME POINTER
|
|---|
| 165 | {
|
|---|
| 166 | nrargs++;
|
|---|
| 167 | }
|
|---|
| 168 | | CONST NAME POINTER
|
|---|
| 169 | {
|
|---|
| 170 | nrargs++;
|
|---|
| 171 | }
|
|---|
| 172 | | CONST NAME
|
|---|
| 173 | {
|
|---|
| 174 | nrargs++;
|
|---|
| 175 | }
|
|---|
| 176 | | NAME PPOINTER
|
|---|
| 177 | {
|
|---|
| 178 | nrargs++;
|
|---|
| 179 | }
|
|---|
| 180 | | NAME POINTER POINTER
|
|---|
| 181 | {
|
|---|
| 182 | nrargs++;
|
|---|
| 183 | }
|
|---|
| 184 | | STRUCT NAME POINTER
|
|---|
| 185 | {
|
|---|
| 186 | nrargs++;
|
|---|
| 187 | }
|
|---|
| 188 | | NAME POINTER
|
|---|
| 189 | {
|
|---|
| 190 | nrargs++;
|
|---|
| 191 | }
|
|---|
| 192 | | STRUCT NAME
|
|---|
| 193 | {
|
|---|
| 194 | nrargs++;
|
|---|
| 195 | }
|
|---|
| 196 | | NAME
|
|---|
| 197 | {
|
|---|
| 198 | strcpy(typename, (char *)$1);
|
|---|
| 199 | strupr(typename);
|
|---|
| 200 | if(strcmp(typename, "VOID") != 0) {
|
|---|
| 201 | nrargs++;
|
|---|
| 202 | }
|
|---|
| 203 | }
|
|---|
| 204 | ;
|
|---|
| 205 |
|
|---|
| 206 | IFDEFSTATEMENT : STAT_IFDEF NAME
|
|---|
| 207 | {
|
|---|
| 208 | }
|
|---|
| 209 | | STAT_IFNDEF NAME
|
|---|
| 210 | {
|
|---|
| 211 | }
|
|---|
| 212 | ;
|
|---|
| 213 |
|
|---|
| 214 | ENDIFSTATEMENT : STAT_ENDIF
|
|---|
| 215 | {
|
|---|
| 216 | }
|
|---|
| 217 | ;
|
|---|
| 218 |
|
|---|
| 219 | INCLUDESTATEMENT : STAT_INCLUDE NAME
|
|---|
| 220 | {
|
|---|
| 221 | }
|
|---|
| 222 | ;
|
|---|
| 223 |
|
|---|
| 224 | DEFINESTATEMENT : STAT_DEFINE NAME NAME
|
|---|
| 225 | {
|
|---|
| 226 | }
|
|---|
| 227 | ;
|
|---|
| 228 | | STAT_UNDEF NAME
|
|---|
| 229 | {
|
|---|
| 230 | }
|
|---|
| 231 | ;
|
|---|
| 232 |
|
|---|
| 233 | %%
|
|---|
| 234 |
|
|---|
| 235 |
|
|---|
| 236 | main()
|
|---|
| 237 | {
|
|---|
| 238 | yyparse();
|
|---|
| 239 | }
|
|---|
| 240 |
|
|---|
| 241 | yyerror(char *msg)
|
|---|
| 242 | {
|
|---|
| 243 | printf("yyerror: %s (%s)\n", msg, procname);
|
|---|
| 244 | exit(1);
|
|---|
| 245 | }
|
|---|
| 246 |
|
|---|