1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
%include {
#include <math.h>
#include <cassert>
#include <iostream>
#include "fab/tree/parser_env.hpp"
#pragma clang diagnostic ignored "-Wunused-parameter"
#pragma clang diagnostic ignored "-Wunused-variable"
extern "C"
{
Node* get_cached_node(NodeCache* const cache, Node* const n);
}
#define CACHED(n) get_cached_node(environment->cache, n)
// #define CACHED(n) n
}
%name v2Parse
%extra_argument {Env* environment}
%stack_size 4096
%token_type {const char*}
%token_prefix TOKEN_
%type v1_expr {Node* }
%type v1_assignment_expr {Node* }
%type expr {Node* }
%type assignment_expr {Node* }
%left PLUS MINUS.
%left MUL DIV.
%right DOUBLESTAR.
%right UMINUS.
%syntax_error
{
environment->valid = false;
}
program ::= v1_expr(E). { environment->head = E; }
v1_assignment_expr(E) ::= v1_expr(O). { E = O; }
v1_assignment_expr(E) ::= V1SKIP. { E = NULL; }
v1_assignment_exprs ::= v1_assignment_expr(I) v1_assignment_expr(J) v1_assignment_expr(K).
{
environment->nodestack->push(environment->Xnode);
environment->nodestack->push(environment->Ynode);
environment->nodestack->push(environment->Znode);
environment->tempX = I ? CACHED(I) : environment->Xnode;
environment->tempY = J ? CACHED(J) : environment->Ynode;
environment->tempZ = K ? CACHED(K) : environment->Znode;
environment->Xnode = environment->tempX;
environment->Ynode = environment->tempY;
environment->Znode = environment->tempZ;
}
v1_expr(E) ::= V1MAP v1_assignment_exprs v1_expr(O).
{
E = O;
environment->Znode = environment->nodestack->top();
environment->nodestack->pop();
environment->Ynode = environment->nodestack->top();
environment->nodestack->pop();
environment->Xnode = environment->nodestack->top();
environment->nodestack->pop();
}
v1_expr(E) ::= V1PLUS v1_expr(L) v1_expr(R). { E = CACHED(add_n(L, R)); }
v1_expr(E) ::= V1MINUS v1_expr(L) v1_expr(R). { E = CACHED(sub_n(L, R)); }
v1_expr(E) ::= V1MUL v1_expr(L) v1_expr(R). { E = CACHED(mul_n(L, R)); }
v1_expr(E) ::= V1DIV v1_expr(L) v1_expr(R). { E = CACHED(div_n(L, R)); }
v1_expr(E) ::= V1MIN v1_expr(L) v1_expr(R). { E = CACHED(min_n(L, R)); }
v1_expr(E) ::= V1MAX v1_expr(L) v1_expr(R). { E = CACHED(max_n(L, R)); }
v1_expr(E) ::= V1POW v1_expr(L) v1_expr(R). { E = CACHED(pow_n(L, R)); }
v1_expr(E) ::= V1SIN v1_expr(O). { E = CACHED(sin_n(O)); }
v1_expr(E) ::= V1COS v1_expr(O). { E = CACHED(cos_n(O)); }
v1_expr(E) ::= V1TAN v1_expr(O). { E = CACHED(tan_n(O)); }
v1_expr(E) ::= V1ASIN v1_expr(O). { E = CACHED(asin_n(O)); }
v1_expr(E) ::= V1ACOS v1_expr(O). { E = CACHED(acos_n(O)); }
v1_expr(E) ::= V1ATAN v1_expr(O). { E = CACHED(atan_n(O)); }
v1_expr(E) ::= V1ABS v1_expr(O). { E = CACHED(abs_n(O)); }
v1_expr(E) ::= V1SQUARE v1_expr(O). { E = CACHED(square_n(O)); }
v1_expr(E) ::= V1SQRT v1_expr(O). { E = CACHED(sqrt_n(O)); }
v1_expr(E) ::= V1NEG v1_expr(O). { E = CACHED(neg_n(O)); }
v1_expr(E) ::= V1EXP v1_expr(O). { E = CACHED(exp_n(O)); }
v1_expr(E) ::= CONSTANT V1MINUS V1FLOAT(F). { E = CACHED(constant_n(-atof(F))); }
v1_expr(E) ::= CONSTANT V1FLOAT(F). { E = CACHED(constant_n(atof(F))); }
v1_expr(E) ::= V1X. { E = CACHED(environment->Xnode); }
v1_expr(E) ::= V1Y. { E = CACHED(environment->Ynode); }
v1_expr(E) ::= V1Z. { E = CACHED(environment->Znode); }
v1_expr(E) ::= EQUAL expr(V) SEMICOLON. { E = V; }
expr(E) ::= LBRACKET v1_expr(V) RBRACKET. { E = V; }
expr(E) ::= LPAREN expr(O) RPAREN. { E = O; }
expr(E) ::= FLOAT(F). { E = CACHED(constant_n(atof(F))); }
expr(E) ::= X. { E = CACHED(environment->Xnode); }
expr(E) ::= Y. { E = CACHED(environment->Ynode); }
expr(E) ::= Z. { E = CACHED(environment->Znode); }
expr(E) ::= expr(L) PLUS expr(R). { E = CACHED(add_n(L, R)); }
expr(E) ::= expr(L) MINUS expr(R). { E = CACHED(sub_n(L, R)); }
expr(E) ::= expr(L) MUL expr(R). { E = CACHED(mul_n(L, R)); }
expr(E) ::= expr(L) DIV expr(R). { E = CACHED(div_n(L, R)); }
expr(E) ::= expr(L) DOUBLESTAR expr(R). { E = CACHED(pow_n(L, R)); }
expr(E) ::= MIN LPAREN expr(L) COMMA expr(R) RPAREN. { E = CACHED(min_n(L, R)); }
expr(E) ::= MAX LPAREN expr(L) COMMA expr(R) RPAREN. { E = CACHED(max_n(L, R)); }
expr(E) ::= POW LPAREN expr(L) COMMA expr(R) RPAREN. { E = CACHED(pow_n(L, R)); }
expr(E) ::= ATAN2 LPAREN expr(A) COMMA expr(B) RPAREN. { E = CACHED(atan2_n(A, B)); }
expr(E) ::= SIN LPAREN expr(O) RPAREN. { E = CACHED(sin_n(O)); }
expr(E) ::= COS LPAREN expr(O) RPAREN. { E = CACHED(cos_n(O)); }
expr(E) ::= TAN LPAREN expr(O) RPAREN. { E = CACHED(tan_n(O)); }
expr(E) ::= ASIN LPAREN expr(O) RPAREN. { E = CACHED(asin_n(O)); }
expr(E) ::= ACOS LPAREN expr(O) RPAREN. { E = CACHED(acos_n(O)); }
expr(E) ::= ATAN LPAREN expr(O) RPAREN. { E = CACHED(atan_n(O)); }
expr(E) ::= ABS LPAREN expr(O) RPAREN. { E = CACHED(abs_n(O)); }
expr(E) ::= SQRT LPAREN expr(O) RPAREN. { E = CACHED(sqrt_n(O)); }
expr(E) ::= MINUS expr(O). [UMINUS] { E = CACHED(neg_n(O)); }
expr(E) ::= EXP LPAREN expr(O) RPAREN. { E = CACHED(exp_n(O)); }
expr(E) ::= MAP assignment_exprs LBRACE expr(O) RBRACE.
{
E = O;
environment->Znode = environment->nodestack->top();
environment->nodestack->pop();
environment->Ynode = environment->nodestack->top();
environment->nodestack->pop();
environment->Xnode = environment->nodestack->top();
environment->nodestack->pop();
}
assignment_expr(E) ::= expr(O). { E = O; }
assignment_expr(E) ::= SKIP. { E = NULL; }
assignment_exprs ::= LPAREN assignment_expr(I) COMMA assignment_expr(J) COMMA assignment_expr(K) RPAREN.
{
environment->nodestack->push(environment->Xnode);
environment->nodestack->push(environment->Ynode);
environment->nodestack->push(environment->Znode);
environment->tempX = I ? CACHED(I) : environment->Xnode;
environment->tempY = J ? CACHED(J) : environment->Ynode;
environment->tempZ = K ? CACHED(K) : environment->Znode;
environment->Xnode = environment->tempX;
environment->Ynode = environment->tempY;
environment->Znode = environment->tempZ;
}
|