Commit 4c0a28303489bb3cdca1de782a46c264cf56a511

Authored by Alain Prouté
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 + }.
... ...