Rev 7563 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7563 | Rev 7564 | ||
---|---|---|---|
Line 45... | Line 45... | ||
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 | dataArgs = malloc(16*4); |
51 | dataArgs = malloc(16*4); |
51 | posArgs = dataArgs; |
52 | posArgs = dataArgs; |
52 | name = malloc(100); |
53 | name = malloc(100); |
53 | pos = name; |
54 | pos = name; |
54 | loop() |
55 | loop() |
55 | { |
56 | { |
56 | s = DSBYTE[code]; |
57 | s = DSBYTE[code]; |
- | 58 | ||
57 | while(s == ' ') |
59 | while(s == ' ') |
58 | { |
60 | { |
59 | code++; |
61 | code++; |
60 | s = DSBYTE[code]; |
62 | s = DSBYTE[code]; |
61 | } |
63 | } |
- | 64 | ||
62 | if (!s) || (s==')') |
65 | if (!s) || (s==')') |
63 | { |
66 | { |
64 | code++; |
67 | code++; |
65 | break; |
68 | break; |
66 | } |
69 | } |
- | 70 | ||
67 | if (!args) |
71 | if (!args) |
68 | { |
72 | { |
69 | if(s!=' ') && (s!=')') // name function |
73 | if (s != ')') // name function |
70 | { |
74 | { |
71 | while (s!=' ') && (s!=')') |
75 | while (s != ' ') && (s != ')') |
72 | { |
76 | { |
73 | DSBYTE[pos] = s; |
77 | DSBYTE[pos] = s; |
- | 78 | pos++; |
|
74 | code++; |
79 | code++; |
75 | s = DSBYTE[code]; |
80 | s = DSBYTE[code]; |
76 | pos++; |
- | |
77 | } |
81 | } |
78 | code--; |
82 | code--; |
79 | } |
83 | } |
80 | } |
84 | } |
81 | else |
85 | else |
82 | { |
86 | { |
83 | if(s == '(') |
87 | if(s == '(') |
84 | { |
88 | { |
85 | code++; |
89 | code++; |
86 | DSDWORD[posArgs] = evalLisp(); |
90 | tmp = evalLisp(); |
87 | posArgs += 4; |
- | |
88 | } |
91 | } |
89 | else if (s >= '0') && (s <= '9') |
92 | else if (s >= '0') && (s <= '9') |
90 | { |
93 | { |
91 | tmp = 0; |
94 | tmp = 0; |
92 | while (s >= '0') && (s <= '9') |
95 | while (s >= '0') && (s <= '9') |
Line 95... | Line 98... | ||
95 | tmp += s-'0'; |
98 | tmp += s-'0'; |
96 | code++; |
99 | code++; |
97 | s = DSBYTE[code]; |
100 | s = DSBYTE[code]; |
98 | } |
101 | } |
99 | code--; |
102 | code--; |
- | 103 | } |
|
- | 104 | else if (s == '"') |
|
- | 105 | { |
|
- | 106 | tmp = malloc(100); |
|
- | 107 | p = tmp; |
|
- | 108 | code++; |
|
- | 109 | s = DSBYTE[code]; |
|
- | 110 | while (s != '"') && (s) |
|
- | 111 | { |
|
- | 112 | DSBYTE[p] = s; |
|
- | 113 | p++; |
|
- | 114 | ||
- | 115 | code++; |
|
- | 116 | s = DSBYTE[code]; |
|
- | 117 | } |
|
- | 118 | DSBYTE[p] = 0; |
|
- | 119 | } |
|
- | 120 | else if(s >= 'A') && (s <= 'z') |
|
- | 121 | { |
|
- | 122 | tmp = malloc(100); |
|
- | 123 | p = tmp; |
|
- | 124 | while (s >= 'A') && (s <= 'z') |
|
- | 125 | { |
|
- | 126 | DSBYTE[p] = s; |
|
- | 127 | p++; |
|
- | 128 | ||
- | 129 | code++; |
|
- | 130 | s = DSBYTE[code]; |
|
- | 131 | } |
|
- | 132 | DSBYTE[p] = 0; |
|
- | 133 | } |
|
- | 134 | ||
100 | DSDWORD[posArgs] = tmp; |
135 | DSDWORD[posArgs] = tmp; |
101 | posArgs += 4; |
136 | posArgs += 4; |
102 | } |
137 | } |
103 | } |
- | |
104 | code++; |
138 | code++; |
105 | args++; |
139 | args++; |
106 | } |
140 | } |
107 | args--; |
141 | args--; |
108 | ret = StdCall(args, name, dataArgs); |
142 | ret = StdCall(args, name, dataArgs); |
Line 113... | Line 147... | ||
113 | 147 | ||
114 | void main() |
148 | void main() |
115 | { |
149 | { |
116 | dword brainFuckCode = 0; |
150 | dword brainFuckCode = 0; |
117 | word maxLoop = 1000; |
151 | word maxLoop = 1000; |
Line 118... | Line 152... | ||
118 | dword txt = "(print (str 1) (str 2))"; |
152 | dword txt = " (print 1)(print 2)"; |
119 | 153 | ||
120 | buffer = malloc(bufferSize); |
154 | buffer = malloc(bufferSize); |
Line 128... | Line 162... | ||
128 | IF(io.read(I_Param)) |
162 | IF(io.read(I_Param)) |
129 | { |
163 | { |
130 | code = EAX; |
164 | code = EAX; |
131 | loop() |
165 | loop() |
132 | { |
166 | { |
133 | while(DSBYTE[code] == ' ') code++; |
167 | WHILE(DSBYTE[code] == ' ') code++; |
134 | if(DSBYTE[code]!='(') break; |
168 | IF(DSBYTE[code]!='(') BREAK; |
135 | else code++; |
169 | ELSE code++; |
136 | evalLisp(); |
170 | evalLisp(); |
- | 171 | code--; |
|
137 | if(DSBYTE[code]!=')') break; |
172 | IF(DSBYTE[code]!=')') BREAK; |
138 | code++; |
173 | ELSE code++; |
139 | } |
174 | } |
140 | } |
175 | } |
141 | } |
176 | } |
142 | else |
177 | else |
143 | { |
178 | { |
144 | consoleInit(); |
179 | consoleInit(); |
145 | con_printf stdcall ("Lisp interpreter v1.2"); |
180 | con_printf stdcall ("Lisp interpreter v1.2"); |
146 | WHILE(maxLoop) |
181 | while(maxLoop) |
147 | { |
182 | { |
148 | con_printf stdcall ("\r\n\r\nEnter code: "); |
183 | con_printf stdcall ("\r\n\r\nEnter code: "); |
149 | con_gets stdcall(buffer, bufferSize); |
184 | con_gets stdcall(buffer, bufferSize); |
150 | code = EAX; |
185 | code = EAX; |
151 | code = txt; |
186 | //code = txt; |
152 | con_printf stdcall ("Output: "); |
187 | con_printf stdcall ("Output: "); |
153 | nextLispLine: |
188 | nextLispLine: |
154 | while(DSBYTE[code] == ' ') code++; |
189 | while(DSBYTE[code] == ' ') code++; |
155 | if(DSBYTE[code]!='(') continue; |
190 | if(DSBYTE[code] == '(') code++; |
156 | else code++; |
191 | else goto endNext; |
157 | evalLisp(); |
192 | evalLisp(); |
- | 193 | code--; |
|
158 | if(DSBYTE[code]!=')') continue; |
194 | if(DSBYTE[code]==')') code++; |
159 | code++; |
195 | else goto endNext; |
- | 196 | IF(!DSBYTE[code]) goto endNext; |
|
160 | goto nextLispLine; |
197 | goto nextLispLine; |
- | 198 | endNext: |
|
161 | maxLoop--; |
199 | maxLoop--; |
162 | } |
200 | } |
163 | } |
201 | } |
Line 164... | Line 202... | ||
164 | 202 |