Commit 4c0a28303489bb3cdca1de782a46c264cf56a511
1 parent
613c96d2
add runge_kutta.apg, fast lexer 3 / apg example
Showing
1 changed file
with
136 additions
and
0 deletions
Show diff stats
anubis_dev/library/examples/mathematics/runge_kutta.apg
0 → 100644
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | +#APG | |
| 5 | + | |
| 6 | + Préambule | |
| 7 | + | |
| 8 | +type Expr: | |
| 9 | + x, | |
| 10 | + y, | |
| 11 | + number(Float), | |
| 12 | + plus(Expr, Expr), | |
| 13 | + minus(Expr, Expr), | |
| 14 | + times(Expr, Expr), | |
| 15 | + power(Expr, Expr), | |
| 16 | + sin(Expr), | |
| 17 | + cos(Expr). | |
| 18 | + | |
| 19 | + asin(Expr), | |
| 20 | + acos(Expr), | |
| 21 | + tan(Expr), | |
| 22 | + atan(Expr), | |
| 23 | + sqrt(Expr), | |
| 24 | + log(Expr). | |
| 25 | + | |
| 26 | +#rk4_parser | |
| 27 | + | |
| 28 | + Déclarations de précédences et mode d'associations | |
| 29 | + | |
| 30 | +left minus. | |
| 31 | +right plus. | |
| 32 | +right times. | |
| 33 | +left power. | |
| 34 | +left unaryminus. | |
| 35 | + | |
| 36 | + Declaration de types | |
| 37 | + | |
| 38 | +type(Float) number. | |
| 39 | +type(Expr) EXPR. | |
| 40 | + | |
| 41 | +# | |
| 42 | + | |
| 43 | + Règles de grammaire: | |
| 44 | + | |
| 45 | +EXPR(a): lpar EXPR(a) rpar. | |
| 46 | +EXPR(x): x. | |
| 47 | +EXPR(y): y. | |
| 48 | +EXPR(number(v)): number(v). | |
| 49 | +EXPR(minus(number((Float)0), a)): minus EXPR(a) [unaryminus]. | |
| 50 | +EXPR(plus(a,b)): EXPR(a) plus EXPR(b). | |
| 51 | +EXPR(minus(a,b)): EXPR(a) minus EXPR(b). | |
| 52 | +EXPR(times(a,b)): EXPR(a) times EXPR(b). | |
| 53 | +EXPR(power(a,b)): EXPR(a) power EXPR(b). | |
| 54 | +EXPR(cos(a)): cos lpar EXPR(a) rpar. | |
| 55 | +EXPR(sin(a)): sin lpar EXPR(a) rpar. | |
| 56 | + | |
| 57 | +# | |
| 58 | + Postambule | |
| 59 | + | |
| 60 | +read tools/basis.anubis | |
| 61 | + | |
| 62 | +read lexical_analysis/fast_lexer_3.anubis | |
| 63 | + | |
| 64 | +define List(LexerItem(Token_Value_rk4_parser, One)) | |
| 65 | + rk4_lexer_description = | |
| 66 | + [ | |
| 67 | + lexer_item("x", return((ByteArray b, LexingTools t, One u) |-> token(_x(u)))), | |
| 68 | + lexer_item("y", return((ByteArray b, LexingTools t, One u) |-> token(_y(u)))), | |
| 69 | + lexer_item("#(", return((ByteArray b, LexingTools t, One u) |-> token(_lpar(u)))), | |
| 70 | + lexer_item("#)", return((ByteArray b, LexingTools t, One u) |-> token(_rpar(u)))), | |
| 71 | + lexer_item("sin", return((ByteArray b, LexingTools t, One u) |-> token(_sin(u)))), | |
| 72 | + lexer_item("cos", return((ByteArray b, LexingTools t, One u) |-> token(_cos(u)))), | |
| 73 | + lexer_item("#+", return((ByteArray b, LexingTools t, One u) |-> token(_plus(u)))), | |
| 74 | + lexer_item("#-", return((ByteArray b, LexingTools t, One u) |-> token(_minus(u)))), | |
| 75 | + lexer_item("#^", return((ByteArray b, LexingTools t, One u) |-> token(_power(u)))), | |
| 76 | + lexer_item("#*", return((ByteArray b, LexingTools t, One u) |-> token(_times(u)))), | |
| 77 | + lexer_item("[0-9]*#.[0-9]*", return((ByteArray b, LexingTools t, One u) |-> | |
| 78 | + if string_to_float(to_string(b)) is | |
| 79 | + { | |
| 80 | + failure then should_not_happen(error(b, 0, 0)), | |
| 81 | + success(n) then token(_number(n)) | |
| 82 | + })), | |
| 83 | + lexer_item("[0-9]+", return((ByteArray b, LexingTools t, One u) |-> | |
| 84 | + if string_to_float(to_string(b) + ".0") is | |
| 85 | + { | |
| 86 | + failure then should_not_happen(error(b, 0, 0)), | |
| 87 | + success(n) then token(_number(n)) | |
| 88 | + })), | |
| 89 | + lexer_item("[# #t#n#r]", ignore) | |
| 90 | + ]. | |
| 91 | + | |
| 92 | +define String | |
| 93 | + format | |
| 94 | + ( | |
| 95 | + Expr e | |
| 96 | + ) = | |
| 97 | + if e is | |
| 98 | + { | |
| 99 | + x then "x", | |
| 100 | + y then "y", | |
| 101 | + number(n) then float_to_string(n, 3), | |
| 102 | + plus(a,b) then "(" + format(a) + " + " + format(b) + ")", | |
| 103 | + minus(a,b) then "(" + format(a) + " - " + format(b) + ")", | |
| 104 | + times(a,b) then "(" + format(a) + " * " + format(b) + ")", | |
| 105 | + power(a,b) then "(" + format(a) + "^" + format(b) + ")", | |
| 106 | + sin(a) then "sin(" + format(a) + ")", | |
| 107 | + cos(a) then "cos(" + format(a) + ")" | |
| 108 | + }. | |
| 109 | + | |
| 110 | +global define One | |
| 111 | + rk4_parse | |
| 112 | + ( | |
| 113 | + List(String) args | |
| 114 | + ) = | |
| 115 | + if make_lexer(rk4_lexer_description, '#') is | |
| 116 | + { | |
| 117 | + error(e) then print(to_English(e) + "\n"), | |
| 118 | + ok(l) then | |
| 119 | + with text = concat(args, ""), | |
| 120 | + ls = make_lexing_stream("", text, unique), | |
| 121 | + | |
| 122 | + cb1 = l(ls), | |
| 123 | + cb2 = (One u) |-> | |
| 124 | + if cb1(u) is | |
| 125 | + { | |
| 126 | + end_of_input then ok(eof(unique)), | |
| 127 | + error(_0,line,col) then error("lexical error"), | |
| 128 | + token(t) then ok(t) | |
| 129 | + }, | |
| 130 | + | |
| 131 | + if rk4_parser(cb2) is | |
| 132 | + { | |
| 133 | + error(_0) then print("syntax error\n"), | |
| 134 | + ok(e) then print(format(e) + "\n") | |
| 135 | + } | |
| 136 | + }. | ... | ... |