Skip to content

Commit 0b6cbb8

Browse files
Improve documentation
1 parent 3809d30 commit 0b6cbb8

File tree

5 files changed

+119
-124
lines changed

5 files changed

+119
-124
lines changed

core/Runtime.c

Lines changed: 89 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
21
#include <stdio.h>
32
#include <stdlib.h>
3+
#include <stdint.h>
44
#include <string.h>
55

66
/**
@@ -112,6 +112,7 @@ char *RunFunction(AST tree)
112112
if (soare_fn.name)
113113
return soare_fn.exec(tree->child);
114114

115+
// Function is not defined
115116
return LeaveException(UndefinedReference, tree->value, tree->file);
116117
}
117118

@@ -166,10 +167,10 @@ char *RunFunction(AST tree)
166167
return NULL;
167168
}
168169

169-
static char broken = 0;
170+
static uint8_t broken = 0;
170171

171172
/**
172-
* @brief Executes code from a tree
173+
* @brief Interprets an AST node tree
173174
*
174175
* @param tree
175176
* @return char*
@@ -179,158 +180,155 @@ static char *Runtime(AST tree)
179180
if (!tree)
180181
return NULL;
181182

182-
AST root = tree;
183-
AST tmp = NULL;
184-
MEM get = NULL;
185-
186-
char *returned = NULL;
187-
unsigned char error = 0;
188-
189-
broken = 0;
190-
191183
MEM statement = MemLast(MEMORY);
184+
192185
MemJoin(statement, FUNCTION);
193186
FUNCTION = NULL;
194187

195-
for (AST curr = root->child; curr && !ErrorLevel(); curr = curr->sibling)
188+
broken = 0;
189+
190+
for (AST curr = tree->child; curr && !ErrorLevel(); curr = curr->sibling)
196191
{
197192
switch (curr->type)
198193
{
199-
// Store function into MEMORY
200194
case NODE_FUNCTION:
201-
195+
// Store function definition in current scope
202196
MemPushf(statement, curr->value, curr);
203197
break;
204198

205-
// Import SOARE code from an other file
206-
case NODE_IMPORT:
207-
208-
if ((tmp = loadimport(curr->value)))
209-
BranchJuxtapose(curr, tmp->child);
210-
break;
211-
212-
// Call a function
213199
case NODE_CALL:
214-
200+
// Execute function call and free result
215201
free(RunFunction(curr));
216202
break;
217203

218-
// Push a new variable into MEMORY
219-
case NODE_MEMNEW:
204+
case NODE_BREAK:
205+
// Break out of loop
206+
broken = 1;
207+
return ExitStatement(statement, NULL);
220208

209+
case NODE_RETURN:
210+
// Return from function
211+
return ExitStatement(statement, Eval(curr->child));
212+
213+
case NODE_RAISE:
214+
// Raise an exception
215+
return ExitStatementError(statement, RaiseException, curr->value, curr->file);
216+
217+
case NODE_IMPORT:
218+
{
219+
// Import external file and merge its AST
220+
AST tmp = loadimport(curr->value);
221+
if (tmp)
222+
BranchJuxtapose(curr, tmp->child);
223+
}
224+
break;
225+
226+
case NODE_MEMNEW:
227+
// Create new variable in current scope
221228
MemPush(statement, curr->value, Eval(curr->child));
222229
break;
223230

224-
// Set a value to a variable
225231
case NODE_MEMSET:
232+
{
233+
// Set variable value in current scope
234+
MEM get = MemGet(MEMORY, curr->value);
226235

227-
if (!(get = MemGet(MEMORY, curr->value)))
236+
if (!get)
228237
return ExitStatementError(statement, UndefinedReference, curr->value, curr->file);
229238

230239
if (get->body)
231240
return ExitStatementError(statement, VariableDefinedAsFunction, curr->value, curr->file);
232241

233242
MemSet(get, Eval(curr->child));
234-
break;
243+
}
244+
break;
235245

236-
// Condition statement (if)
237-
case NODE_CONDITION:
246+
case NODE_CUSTOM_KEYWORD:
247+
{
248+
// Execute custom keyword handler
249+
soare_keyword keyword = soare_getkeyword(curr->value);
250+
if (keyword.name)
251+
keyword.exec();
252+
}
253+
break;
238254

239-
returned = Eval(curr->child);
240-
tmp = curr->child;
255+
case NODE_CONDITION:
256+
{
257+
// Evaluate condition chain (if/or/else)
258+
AST tmp = curr->child;
259+
char *condition = Eval(tmp);
241260

242-
while (returned)
261+
while (condition)
243262
{
244-
if (strcmp(returned, "0"))
263+
if (strcmp(condition, "0"))
245264
{
246-
free(returned);
265+
free(condition);
247266

248-
if ((returned = Runtime(tmp->sibling)) || broken)
249-
return ExitStatement(statement, returned);
267+
char *value = Runtime(tmp->sibling);
250268

269+
if (value || broken)
270+
return ExitStatement(statement, value);
251271
break;
252272
}
253273

254-
free(returned);
274+
free(condition);
255275

256-
if (!(tmp = tmp->sibling->sibling))
276+
if (!tmp->sibling)
257277
break;
258278

259-
returned = Eval(tmp);
279+
tmp = tmp->sibling->sibling;
280+
condition = Eval(tmp);
260281
}
261-
break;
282+
}
283+
break;
262284

263-
// Repetition statement (while)
264285
case NODE_REPETITION:
286+
{
287+
// Loop while condition is true (!= "0")
288+
char *condition = Eval(curr->child);
265289

266-
while ((returned = Eval(curr->child)))
290+
while (condition && strcmp(condition, "0") && !ErrorLevel() && !broken)
267291
{
268-
if (!strcmp(returned, "0") || ErrorLevel() || broken)
269-
break;
292+
free(condition);
293+
294+
char *value = Runtime(curr->child->sibling);
270295

271-
free(returned);
296+
if (value)
297+
return ExitStatement(statement, value);
272298

273-
if ((returned = Runtime(curr->child->sibling)))
274-
return ExitStatement(statement, returned);
299+
condition = Eval(curr->child);
275300
}
276301

277-
free(returned);
278-
break;
302+
free(condition);
303+
}
304+
break;
279305

280-
// try/iferror statement
281306
case NODE_TRY:
282-
283-
error = AsIgnoredException();
307+
{
308+
// try/iferror block
309+
unsigned char previous = AsIgnoredException();
284310
IgnoreException(1);
285-
returned = Runtime(curr->child);
286-
IgnoreException(error);
311+
char *value = Runtime(curr->child);
312+
IgnoreException(previous);
287313

288314
if (ErrorLevel() && !broken)
289315
{
290-
free(returned);
316+
free(value);
291317
ClearException();
292-
returned = Runtime(curr->child->sibling);
318+
value = Runtime(curr->child->sibling);
293319
}
294320

295-
if (!returned && !broken)
296-
break;
297-
298-
return ExitStatement(statement, returned);
299-
300-
// Break loop
301-
case NODE_BREAK:
302-
303-
broken = 1;
304-
return ExitStatement(statement, NULL);
305-
306-
// Return
307-
case NODE_RETURN:
308-
309-
return ExitStatement(statement, Eval(curr->child));
310-
311-
// Leave new exception
312-
case NODE_RAISE:
313-
314-
return ExitStatementError(statement, RaiseException, curr->value, curr->file);
315-
316-
// Custom keyword
317-
case NODE_CUSTOM_KEYWORD:
318-
319-
printf("d");
320-
soare_keyword keyword = soare_getkeyword(curr->value);
321-
322-
if (keyword.name)
323-
keyword.exec();
324-
325-
break;
321+
if (value || broken)
322+
return ExitStatement(statement, value);
323+
}
324+
break;
326325

327326
default:
328-
329327
break;
330328
}
331329
}
332330

333-
// Quit
331+
// Free scope and return
334332
return ExitStatement(statement, NULL);
335333
}
336334

doc/documentation.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
- [Loops and conditional structures](#loops-and-conditional-structures)
2323
- [Arrays](#arrays)
2424
- [User inputs](#user-inputs)
25-
- [Shell](#shell)
2625
- [Escape Sequence](#escape-sequence)
2726

2827
---
@@ -486,14 +485,6 @@ let usr = input("Enter your name: ");
486485
write("Hello "; usr; "!");
487486
```
488487

489-
### Shell
490-
491-
- `system()` **Run shell command:**
492-
493-
```soare
494-
system("echo hello");
495-
```
496-
497488
### Escape Sequence
498489

499490
| Escape Sequence | Name | Description |
@@ -514,7 +505,7 @@ system("echo hello");
514505

515506
### Predefined Functions
516507

517-
| name | function |
508+
| Function | Description |
518509
|-----------------------|---------------------------------|
519510
| soareinfo() | Show SOARE info |
520511
| time() | Show current timestamp |

script/math.min.soare

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
let pi=3.14159265;let deg=180/pi;let rad=pi/180;fn M(f)return f;end;fn Math(f)return f*1;end;fn NaN(x)try x=x*1;iferror return 1;end;return 0;end;fn abs
2-
(x)if x<0 do return x*M(0-1);end;return Math(x);end;fn not(x)return x==0;end;fn floor(float)return float^0;end;fn integer_division(x;y)let res=0;while
3-
x>=y do x=x-y;res=res+1;end;return res;end;fn round(x)let sign=x<0;let y=abs(x);let t=floor(y);if sign do sign=0-1;else sign=1;end;if y-t>=0.5 do
4-
return sign*M(t+1);end;return sign*t;end;fn integer_sqrt(x)x=round(x);if x==0 do return 0;or x<0 do raise "Non-Real Number";end;let n=x;let a=0;while
5-
1 do a=integer_division(n+integer_division(x;n);2)if a==n do return n;end;n=a;end;end;fn pow(x;y)let res=1;let neg=y<0;y=floor(abs(y))while y do res
6-
=res*x;y=y-1;end;if neg do res=1/res;end;return res;end;fn factorial(x)let res=1;let n=1;x=floor(x);if x<0 do raise "Undefined";end;while n<x+1 do res
7-
=res*n;n=n+1;end;return res;end;fn radians(x)return x*rad;end;fn degrees(x)return x*deg;end;fn sin(x)let sine=0;let n=0;x=radians(x%180)while n<10
8-
do sine=sine+pow(0-1;n)*pow(x;2*n+1)/factorial(2*n+1);n=n+1;end;return sine;end;fn cos(x)let cosine=0;let n=0;x=radians(x%180)while n<10 do cosine=cosine
9-
+pow(0-1;n)*pow(x;2*n)/factorial(2*n);n=n+1;end;return cosine;end;fn tan(x)return sin(x)/cos(x);end;
1+
let pi=3.14159265;let deg=180/pi;let rad=pi/180;fn M(f)return f;end;fn Math(f)return f*1;end;fn NaN(x)let i=0;while 1 do try let num=ord(x[i]);if num>
2+
=48&&num<=57 do i=i+1;else return 1;end;iferror break;end;end;return 0;end;fn abs(x)if x<0 do return x*M(0-1);end;return Math(x);end;fn not(x)return
3+
x==0;end;fn floor(float)return float^0;end;fn integer_division(x;y)let res=0;while x>=y do x=x-y;res=res+1;end;return res;end;fn round(x)let sign=x<0
4+
;let y=abs(x);let t=floor(y);if sign do sign=0-1;else sign=1;end;if y-t>=0.5 do return sign*M(t+1);end;return sign*t;end;fn integer_sqrt(x)x=round(x)
5+
;if x==0 do return 0;or x<0 do raise "Non-Real Number";end;let n=x;let a=0;while 1 do a=integer_division(n+integer_division(x;n);2)if a==n do return
6+
n;end;n=a;end;end;fn pow(x;y)let res=1;let neg=y<0;y=floor(abs(y));while y do res=res*x;y=y-1;end;if neg do res=1/res;end;return res;end;fn factorial
7+
(x)let res=1;let n=1;x=floor(x);if x<0 do raise "Undefined";end;while n<x+1 do res=res*n;n=n+1;end;return res;end;fn radians(x)return x*rad;end;fn degrees
8+
(x)return x*deg;end;fn sin(x)let sine=0;let n=0;x=radians(x%180)while n<10 do sine=sine+pow(0-1;n)*pow(x;2*n+1)/factorial(2*n+1);n=n+1;end;return
9+
sine;end;fn cos(x)let cosine=0;let n=0;x=radians(x%180);while n<10 do cosine=cosine+pow(0-1;n)*pow(x;2*n)/factorial(2*n);n=n+1;end;return cosine;end
10+
;fn tan(x)return sin(x)/cos(x);end;

script/math.soare

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,30 @@ let pi = 3.14159265;
3434
let deg = 180 / pi;
3535
let rad = pi / 180;
3636

37-
? Useful for math, ex: 5*M(1+2)
37+
? Useful for priority, ex: 5*M(1+2)
3838
fn M(f)
3939
return f;
4040
end;
4141

42-
? Useful for math, ex: 5*M(1+2)
42+
? Useful for math, ex: 5*Math(1+2)
4343
fn Math(f)
44-
return f*1;
44+
return f * 1;
4545
end;
4646

4747
? Returns true if a value is Not-a-Number
4848
fn NaN(x)
49-
try
50-
x = x * 1;
51-
iferror
52-
return 1;
49+
let i = 0;
50+
while 1 do
51+
try
52+
let num = ord(x[i]);
53+
if num >= 48 && num <= 57 do
54+
i = i + 1;
55+
else
56+
return 1;
57+
end;
58+
iferror
59+
break;
60+
end;
5361
end;
5462
return 0;
5563
end;
@@ -127,7 +135,7 @@ fn pow(x; y)
127135
let res = 1;
128136
let neg = y < 0;
129137

130-
y = floor(abs(y))
138+
y = floor(abs(y));
131139

132140
while y do
133141
res = res * x;
@@ -189,7 +197,7 @@ fn cos(x)
189197
let cosine = 0;
190198
let n = 0;
191199

192-
x = radians(x % 180)
200+
x = radians(x % 180);
193201

194202
while n < 10 do
195203
cosine = cosine + pow(0-1; n) * pow(x; 2 * n) / factorial(2 * n);

0 commit comments

Comments
 (0)