Rev 7564 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7564 | Rev 7565 | ||
---|---|---|---|
1 | /* |
1 | /* |
2 | * Author Pavel Iakovlev |
2 | * Author Pavel Iakovlev |
3 | */ |
3 | */ |
4 | 4 | ||
5 | #define MEMSIZE 4096*10 |
5 | #define MEMSIZE 4096*10 |
6 | 6 | ||
7 | #include "../lib/io.h" |
7 | #include "../lib/io.h" |
8 | #include "../lib/obj/console.h" |
8 | #include "../lib/obj/console.h" |
9 | #include "../lib/array.h" |
9 | #include "../lib/array.h" |
10 | 10 | ||
11 | byte initConsole = 0; |
11 | byte initConsole = 0; |
12 | Dictionary functions = {0}; |
12 | Dictionary functions = {0}; |
13 | Dictionary variables = {0}; |
13 | Dictionary variables = {0}; |
14 | 14 | ||
15 | #include "stdcall.h" |
15 | #include "stdcall.h" |
16 | 16 | ||
17 | #define bufferSize 10000; |
17 | #define bufferSize 10000; |
18 | #define memoryBrainfuck 30000*4 |
18 | #define memoryBrainfuck 30000*4 |
19 | #define memoryByteBF 1 |
19 | #define memoryByteBF 1 |
20 | #define stackBrainFuck 4*1024 |
20 | #define stackBrainFuck 4*1024 |
21 | 21 | ||
22 | dword buffer = 0; |
22 | dword buffer = 0; |
23 | word bufferSymbol = 0; |
23 | word bufferSymbol = 0; |
24 | dword memory = 0; |
24 | dword memory = 0; |
25 | 25 | ||
26 | dword stack = 0; |
26 | dword stack = 0; |
27 | dword code = 0; |
27 | dword code = 0; |
28 | byte tempBuffer[100] = {0}; |
28 | byte tempBuffer[100] = {0}; |
29 | 29 | ||
30 | void consoleInit() |
30 | void consoleInit() |
31 | { |
31 | { |
32 | IF(!initConsole) |
32 | IF(!initConsole) |
33 | { |
33 | { |
34 | load_dll(libConsole, #con_init, 0); |
34 | load_dll(libConsole, #con_init, 0); |
35 | con_init stdcall (-1, -1, -1, -1, "Lisp interpreter"); |
35 | con_init stdcall (-1, -1, -1, -1, "Lisp interpreter"); |
36 | initConsole = 0xFF; |
36 | initConsole = 0xFF; |
37 | } |
37 | } |
38 | } |
38 | } |
39 | 39 | ||
40 | dword evalLisp() |
40 | dword evalLisp() |
41 | { |
41 | { |
42 | byte s = 0; |
42 | byte s = 0; |
43 | byte args = 0; |
43 | byte args = 0; |
44 | dword pos = 0; |
44 | dword pos = 0; |
45 | dword name = 0; |
45 | dword name = 0; |
46 | dword tmp = 0; |
46 | dword tmp = 0; |
47 | dword dataArgs = 0; |
47 | dword dataArgs = 0; |
48 | dword posArgs = 0; |
48 | dword posArgs = 0; |
49 | dword ret = 0; |
49 | dword ret = 0; |
50 | dword p = 0; |
50 | dword p = 0; |
51 | dataArgs = malloc(16*4); |
51 | dataArgs = malloc(16*4); |
52 | posArgs = dataArgs; |
52 | posArgs = dataArgs; |
53 | name = malloc(100); |
- | |
54 | pos = name; |
53 | |
55 | loop() |
54 | loop() |
56 | { |
55 | { |
57 | s = DSBYTE[code]; |
56 | s = DSBYTE[code]; |
58 | 57 | ||
59 | while(s == ' ') |
58 | while(s == ' ') |
60 | { |
59 | { |
61 | code++; |
60 | code++; |
62 | s = DSBYTE[code]; |
61 | s = DSBYTE[code]; |
63 | } |
62 | } |
- | 63 | if (!s) return 0; |
|
- | 64 | if (s==')') |
|
64 | 65 | { |
|
- | 66 | code++; |
|
- | 67 | args--; |
|
- | 68 | ret = StdCall(args, name, dataArgs); |
|
- | 69 | free(name); |
|
- | 70 | //free(dataArgs); |
|
- | 71 | return ret; |
|
- | 72 | } |
|
65 | if (!s) || (s==')') |
73 | if(s == '(') |
66 | { |
74 | { |
67 | code++; |
75 | code++; |
- | 76 | DSDWORD[posArgs] = evalLisp(); |
|
68 | break; |
77 | args++; |
- | 78 | posArgs += 4; |
|
- | 79 | continue; |
|
69 | } |
80 | } |
70 | - | ||
71 | if (!args) |
81 | else if (!args) |
72 | { |
82 | { |
73 | if (s != ')') // name function |
83 | if (s != ')') // name function |
74 | { |
84 | { |
- | 85 | name = malloc(100); |
|
- | 86 | pos = name; |
|
75 | while (s != ' ') && (s != ')') |
87 | while (s) && (s != ' ') && (s != ')') |
76 | { |
88 | { |
77 | DSBYTE[pos] = s; |
89 | DSBYTE[pos] = s; |
78 | pos++; |
90 | pos++; |
79 | code++; |
91 | code++; |
80 | s = DSBYTE[code]; |
92 | s = DSBYTE[code]; |
81 | } |
93 | } |
- | 94 | DSBYTE[pos] = 0; |
|
- | 95 | args++; |
|
82 | code--; |
96 | continue; |
83 | } |
97 | } |
84 | } |
98 | } |
85 | else |
99 | else |
86 | { |
100 | { |
87 | if(s == '(') |
- | |
88 | { |
- | |
89 | code++; |
- | |
90 | tmp = evalLisp(); |
- | |
91 | } |
- | |
92 | else if (s >= '0') && (s <= '9') |
101 | if (s >= '0') && (s <= '9') |
93 | { |
102 | { |
94 | tmp = 0; |
103 | tmp = 0; |
95 | while (s >= '0') && (s <= '9') |
104 | while (s >= '0') && (s <= '9') |
96 | { |
105 | { |
97 | tmp *= 10; |
106 | tmp *= 10; |
98 | tmp += s-'0'; |
107 | tmp += s-'0'; |
99 | code++; |
108 | code++; |
100 | s = DSBYTE[code]; |
109 | s = DSBYTE[code]; |
101 | } |
110 | } |
- | 111 | args++; |
|
- | 112 | DSDWORD[posArgs] = tmp; |
|
- | 113 | posArgs += 4; |
|
102 | code--; |
114 | continue; |
103 | } |
115 | } |
104 | else if (s == '"') |
116 | else if (s == '"') |
105 | { |
117 | { |
106 | tmp = malloc(100); |
118 | tmp = malloc(100); |
107 | p = tmp; |
119 | p = tmp; |
108 | code++; |
120 | code++; |
109 | s = DSBYTE[code]; |
121 | s = DSBYTE[code]; |
110 | while (s != '"') && (s) |
122 | while (s != '"') && (s) |
111 | { |
123 | { |
112 | DSBYTE[p] = s; |
124 | DSBYTE[p] = s; |
113 | p++; |
125 | p++; |
114 | 126 | ||
115 | code++; |
127 | code++; |
116 | s = DSBYTE[code]; |
128 | s = DSBYTE[code]; |
117 | } |
129 | } |
118 | DSBYTE[p] = 0; |
130 | DSBYTE[p] = 0; |
119 | } |
131 | } |
120 | else if(s >= 'A') && (s <= 'z') |
132 | else if(s >= 'A') && (s <= 'z') |
121 | { |
133 | { |
122 | tmp = malloc(100); |
134 | tmp = malloc(100); |
123 | p = tmp; |
135 | p = tmp; |
124 | while (s >= 'A') && (s <= 'z') |
136 | while (s >= 'A') && (s <= 'z') |
125 | { |
137 | { |
126 | DSBYTE[p] = s; |
138 | DSBYTE[p] = s; |
127 | p++; |
139 | p++; |
128 | 140 | ||
129 | code++; |
141 | code++; |
130 | s = DSBYTE[code]; |
142 | s = DSBYTE[code]; |
131 | } |
143 | } |
132 | DSBYTE[p] = 0; |
144 | DSBYTE[p] = 0; |
- | 145 | args++; |
|
- | 146 | DSDWORD[posArgs] = tmp; |
|
- | 147 | posArgs += 4; |
|
- | 148 | continue; |
|
133 | } |
149 | } |
134 | 150 | ||
135 | DSDWORD[posArgs] = tmp; |
151 | DSDWORD[posArgs] = tmp; |
136 | posArgs += 4; |
152 | posArgs += 4; |
137 | } |
153 | } |
138 | code++; |
154 | code++; |
139 | args++; |
155 | args++; |
140 | } |
156 | } |
141 | args--; |
157 | args--; |
142 | ret = StdCall(args, name, dataArgs); |
158 | ret = StdCall(args, name, dataArgs); |
143 | free(name); |
159 | free(name); |
144 | free(dataArgs); |
160 | //free(dataArgs); |
145 | return ret; |
161 | return ret; |
146 | } |
162 | } |
147 | 163 | ||
148 | void main() |
164 | void main() |
149 | { |
165 | { |
150 | dword brainFuckCode = 0; |
166 | dword brainFuckCode = 0; |
151 | word maxLoop = 1000; |
167 | word maxLoop = 1000; |
152 | dword txt = " (print 1)(print 2)"; |
168 | dword txt = "(print (input \"test:\"))"; |
153 | 169 | ||
154 | buffer = malloc(bufferSize); |
170 | buffer = malloc(bufferSize); |
155 | memory = malloc(memoryBrainfuck); |
171 | memory = malloc(memoryBrainfuck); |
156 | stack = malloc(stackBrainFuck); |
172 | stack = malloc(stackBrainFuck); |
157 | 173 | ||
158 | Init(); |
174 | Init(); |
159 | 175 | ||
160 | IF(DSBYTE[I_Param]) |
176 | IF(DSBYTE[I_Param]) |
161 | { |
177 | { |
162 | IF(io.read(I_Param)) |
178 | IF(io.read(I_Param)) |
163 | { |
179 | { |
164 | code = EAX; |
180 | code = EAX; |
165 | loop() |
181 | loop() |
166 | { |
182 | { |
167 | WHILE(DSBYTE[code] == ' ') code++; |
183 | WHILE(DSBYTE[code] == ' ') code++; |
168 | IF(DSBYTE[code]!='(') BREAK; |
184 | IF(DSBYTE[code]!='(') BREAK; |
169 | ELSE code++; |
185 | ELSE code++; |
170 | evalLisp(); |
186 | evalLisp(); |
171 | code--; |
187 | code--; |
172 | IF(DSBYTE[code]!=')') BREAK; |
188 | IF(DSBYTE[code]!=')') BREAK; |
173 | ELSE code++; |
189 | ELSE code++; |
174 | } |
190 | } |
175 | } |
191 | } |
176 | } |
192 | } |
177 | else |
193 | else |
178 | { |
194 | { |
179 | consoleInit(); |
195 | consoleInit(); |
180 | con_printf stdcall ("Lisp interpreter v1.2"); |
196 | con_printf stdcall ("Lisp interpreter v1.3"); |
181 | while(maxLoop) |
197 | while(maxLoop) |
182 | { |
198 | { |
183 | con_printf stdcall ("\r\n\r\nEnter code: "); |
199 | con_printf stdcall ("\r\n\r\nEnter code: "); |
184 | con_gets stdcall(buffer, bufferSize); |
200 | con_gets stdcall(buffer, bufferSize); |
185 | code = EAX; |
201 | code = EAX; |
186 | //code = txt; |
202 | //code = txt; |
187 | con_printf stdcall ("Output: "); |
203 | con_printf stdcall ("Output: "); |
188 | nextLispLine: |
- | |
189 | while(DSBYTE[code] == ' ') code++; |
- | |
190 | if(DSBYTE[code] == '(') code++; |
- | |
191 | else goto endNext; |
- | |
192 | evalLisp(); |
204 | evalLisp(); |
193 | code--; |
- | |
194 | if(DSBYTE[code]==')') code++; |
- | |
195 | else goto endNext; |
- | |
196 | IF(!DSBYTE[code]) goto endNext; |
- | |
197 | goto nextLispLine; |
- | |
198 | endNext: |
- | |
199 | maxLoop--; |
205 | maxLoop--; |
200 | } |
206 | } |
201 | } |
207 | } |
202 | 208 | ||
203 | IF(initConsole) con_exit stdcall (0); |
209 | IF(initConsole) con_exit stdcall (0); |
204 | ExitProcess(); |
210 | ExitProcess(); |
205 | }=>=>=>=> |
211 | }=>=>=>=> |