%{ open ScTypes module F = Functions let u = UTF8.from_utf8string let extractColumnNameFromNum (fixed, (str, value)) = (fixed, value) %} %token REAL %token NUM %token STR %token LETTERS %token IDENT %token DOLLAR %token DOT %token LPAREN RPAREN %token L_SQ_BRACKET R_SQ_BRACKET %token PLUS %token TIMES %token DIVIDE %token MINUS %token EQ NEQ %token LT LE GT GE %token EOF %token COLON SEMICOLON %token POW %nonassoc EQ NEQ LT LE GT GE %left PLUS MINUS %left TIMES DIVIDE %left POW %start value %% value: | LETTERS COLON EQ expr EOF {$4} expr: | num {Value (Num ( Number, DataType.Num.of_num @@ snd $1 ))} | MINUS expr {Call (F.sub, [$2])} | PLUS expr {Call (F.add, [$2])} | L_SQ_BRACKET ref R_SQ_BRACKET {$2} | LPAREN expr RPAREN {Expression $2} | STR {Value (Str (u $1))} (* Mathematical operators *) | expr MINUS expr {Call (F.sub, [$1; $3])} | expr DIVIDE expr {Call (F.div, [$1; $3])} | expr TIMES expr {Call (F.mul, [$1; $3])} | expr PLUS expr {Call (F.add, [$1; $3])} | expr POW expr {Call (F.pow, [$1; $3])} (* Comparaison *) | expr EQ expr {Call (F.eq, [$1; $3])} | expr NEQ expr {Call (F.neq, [$1; $3])} | expr LT expr {Call (F.lt, [$1; $3])} | expr GT expr {Call (F.gt, [$1; $3])} | expr LE expr {Call (F.le, [$1; $3])} | expr GE expr {Call (F.ge, [$1; $3])} | ident LPAREN separated_list(SEMICOLON, expr) RPAREN { Call (u $1, $3) } ref: | cell {Ref (Cell $1)} | cell COLON cell {Ref (Range ($1, $3))} cell: | DOT fixed(LETTERS) fixed(NUM){Cell.from_string $2 (extractColumnNameFromNum $3)} fixed(X): | DOLLAR X {true, $2} | X {false, $1} num: | REAL {$1} | NUM {$1} ident: | IDENT { $1 } | text+ { String.concat "" $1 } text: | LETTERS { $1 } | NUM { fst $1 }