Warning, /maui/brun/src/mathengine/parser.yy is written in an unsupported language. File is not indexed.

0001 /*
0002  * This file is part of Kalk
0003  *
0004  * Copyright (C) 2020 Han Young <hanyoung@protonmail.com>
0005  *
0006  * $BEGIN_LICENSE:GPL3+$
0007  *
0008  * This program is free software: you can redistribute it and/or modify
0009  * it under the terms of the GNU General Public License as published by
0010  * the Free Software Foundation, either version 3 of the License, or
0011  * (at your option) any later version.
0012  *
0013  * This program is distributed in the hope that it will be useful,
0014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0016  * GNU General Public License for more details.
0017  *
0018  * You should have received a copy of the GNU General Public License
0019  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0020  *
0021  * $END_LICENSE$
0022  */
0023 %skeleton "lalr1.cc" // -*- C++ -*-
0024 %require "3.0"
0025 %defines
0026 
0027 %define api.token.raw
0028 
0029 %define api.token.constructor
0030 %define api.value.type variant
0031 %define parse.assert
0032 
0033 %code requires {
0034   # include <string>
0035   # include <knumber.h>
0036   class driver;
0037 }
0038 
0039 // The parsing context.
0040 %param { driver& drv }
0041 
0042 %locations
0043 
0044 %define parse.trace
0045 %define parse.error verbose
0046 %define parse.lac full
0047 
0048 %code {
0049 # include "driver.hh"
0050 }
0051 
0052 %define api.token.prefix {TOK_}
0053 %token
0054   MINUS   "-"
0055   PLUS    "+"
0056   STAR    "*"
0057   SLASH   "/"
0058   LPAREN  "("
0059   RPAREN  ")"
0060   POWER   "^"
0061   SIN     "SIN"
0062   COS     "COS"
0063   TAN     "TAN"
0064   LOG     "LOG"
0065   LOG10   "LOG10"
0066   LOG2    "LOG2"
0067   SQUAREROOT    "SQUAREROOT"
0068   PERCENTAGE    "%"
0069   ASIN     "ASIN"
0070   ACOS     "ACOS"
0071   ATAN     "ATAN"
0072   ABS       "ABS"
0073 ;
0074 
0075 %token <KNumber> NUMBER "number"
0076 %nterm <KNumber> exp
0077 %nterm <KNumber> factor
0078 
0079 %printer { yyo << $$.toQString().toStdString(); } <*>;
0080 
0081 %%
0082 %start unit;
0083 unit: exp  { drv.result = $1; };
0084 
0085 %left "+" "-";
0086 %left "*" "/";
0087 exp:
0088   factor
0089 | exp "+" exp   { $$ = $1 + $3; }
0090 | exp "-" exp   { $$ = $1 - $3; }
0091 | exp exp       { $$ = $1 * $2; }
0092 | exp "*" exp   { $$ = $1 * $3; }
0093 | exp "/" exp   { $$ = $1 / $3; }
0094 | exp "^" factor   { $$ = pow($1, $3); }
0095 | exp "^"   { $$ = $1; }
0096 | "SIN" "(" exp     { $$ = sin($3); }
0097 | "SIN" "(" exp ")" { $$ = sin($3); }
0098 | "COS" "(" exp     { $$ = cos($3); }
0099 | "COS" "(" exp ")" { $$ = cos($3); }
0100 | "TAN" "(" exp     { $$ = tan($3); }
0101 | "TAN" "(" exp ")" { $$ = tan($3); }
0102 | "LOG" "(" exp     { $$ = ln($3); }
0103 | "LOG" "(" exp ")" { $$ = ln($3); }
0104 | "LOG10" "(" exp   { $$ = log10($3); }
0105 | "LOG10" "(" exp ")" { $$ = log10($3); }
0106 | "LOG2" "(" exp    { $$ = log2($3); }
0107 | "LOG2" "(" exp ")" { $$ = log2($3); }
0108 | "SQUAREROOT" "(" exp   { $$ = sqrt($3); }
0109 | "SQUAREROOT" "(" exp ")"  { $$ = sqrt($3); }
0110 | "ASIN" "(" exp     { $$ = asin($3); }
0111 | "ASIN" "(" exp ")" { $$ = asin($3); }
0112 | "ACOS" "(" exp     { $$ = acos($3); }
0113 | "ACOS" "(" exp ")" { $$ = acos($3); }
0114 | "ATAN" "(" exp     { $$ = atan($3); }
0115 | "ATAN" "(" exp ")" { $$ = atan($3); }
0116 | "ABS" "(" exp { $$ = abs($3); }
0117 | "ABS" "(" exp ")" { $$ = abs($3);}
0118 ;
0119 
0120 factor: "(" exp ")" { $$ = $2; }
0121 | "(" exp      { $$ = $2; }
0122 | "number"
0123 | "-" "number" { $$ = -$2; }
0124 | "+" "number" { $$ = $2; }
0125 | factor "%" { $$ = $1 / KNumber(100); }
0126 ;
0127     
0128 %%
0129 
0130 void
0131 yy::parser::error (const location_type& l, const std::string& m)
0132 {
0133   std::cerr << l << ": " << m << '\n';
0134   if(m != "syntax error, unexpected end of file")
0135     drv.syntaxError = true;
0136 }