source: trunk/tools/cvtasm/cvt.y@ 10367

Last change on this file since 10367 was 10219, checked in by sandervl, 22 years ago

Header parser and assembly wrapper generator

File size: 4.8 KB
Line 
1%{
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#define TRUE 1
7#define FALSE 0
8
9char arg = 'a';
10char procname[256] = {0};
11char defprocname[256] = {0};
12char tempname[256];
13char returntype[256] = {0};
14char typename[256] = {0};
15char callconv[256] = {0};
16int i;
17int firstarg = TRUE;
18int fStartProc = FALSE;
19int fVoidReturn = FALSE;
20int nrargs = 0;
21FILE *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
45lines : line
46 | lines line
47 ;
48
49line : IFDEFSTATEMENT
50 | ENDIFSTATEMENT
51 | INCLUDESTATEMENT
52 | DEFINESTATEMENT
53 | PROCEDUREDEF
54 ;
55
56//PROCEDUREDEF : RET PROCNAME BRACKETOPEN ARGUMENTS BRACKETCLOSE ENDOFPROC
57PROCEDUREDEF : 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
81RET : 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 ;
105CALLCONV : NAME
106 {
107 strcpy(callconv, (char *)$1);
108 }
109 ;
110
111PROCNAME : 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 ;
151ARGUMENTS : ARGUMENTS COMMA ARGUMENT
152 | ARGUMENT
153 | /* nothing */
154 ;
155
156ARGUMENT : TYPE NAME
157 | TYPE
158 ;
159
160TYPE : 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
206IFDEFSTATEMENT : STAT_IFDEF NAME
207 {
208 }
209 | STAT_IFNDEF NAME
210 {
211 }
212 ;
213
214ENDIFSTATEMENT : STAT_ENDIF
215 {
216 }
217 ;
218
219INCLUDESTATEMENT : STAT_INCLUDE NAME
220 {
221 }
222 ;
223
224DEFINESTATEMENT : STAT_DEFINE NAME NAME
225 {
226 }
227 ;
228 | STAT_UNDEF NAME
229 {
230 }
231 ;
232
233%%
234
235
236main()
237{
238 yyparse();
239}
240
241yyerror(char *msg)
242{
243 printf("yyerror: %s (%s)\n", msg, procname);
244 exit(1);
245}
246
Note: See TracBrowser for help on using the repository browser.