github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/demos/expr/README (about) 1 Copyright 2001, 2004 Free Software Foundation, Inc. 2 3 This file is part of the GNU MP Library. 4 5 The GNU MP Library is free software; you can redistribute it and/or modify 6 it under the terms of either: 7 8 * the GNU Lesser General Public License as published by the Free 9 Software Foundation; either version 3 of the License, or (at your 10 option) any later version. 11 12 or 13 14 * the GNU General Public License as published by the Free Software 15 Foundation; either version 2 of the License, or (at your option) any 16 later version. 17 18 or both in parallel, as here. 19 20 The GNU MP Library is distributed in the hope that it will be useful, but 21 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 22 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23 for more details. 24 25 You should have received copies of the GNU General Public License and the 26 GNU Lesser General Public License along with the GNU MP Library. If not, 27 see https://www.gnu.org/licenses/. 28 29 30 31 32 33 34 GMP EXPRESSION EVALUATION 35 ------------------------- 36 37 38 39 THIS CODE IS PRELIMINARY AND MAY BE SUBJECT TO INCOMPATIBLE CHANGES IN 40 FUTURE VERSIONS OF GMP. 41 42 43 44 The files in this directory implement a simple scheme of string based 45 expression parsing and evaluation, supporting mpz, mpq and mpf. 46 47 This will be slower than direct GMP library calls, but may be convenient in 48 various circumstances, such as while prototyping, or for letting a user 49 enter values in symbolic form. "2**5723-7" for example is a lot easier to 50 enter or maintain than the equivalent written out in decimal. 51 52 53 54 BUILDING 55 56 Nothing in this directory is a normal part of libgmp, and nothing is built 57 or installed, but various Makefile rules are available to compile 58 everything. 59 60 All the functions are available through a little library (there's no shared 61 library since upward binary compatibility is not guaranteed). 62 63 make libexpr.a 64 65 In a program, prototypes are available using 66 67 #include "expr.h" 68 69 run-expr.c is a sample program doing evaluations from the command line. 70 71 make run-expr 72 ./run-expr '1+2*3' 73 74 t-expr.c is self-test program, it prints nothing if successful. 75 76 make t-expr 77 ./t-expr 78 79 The expr*.c sources don't depend on gmp-impl.h and can be compiled with just 80 a standard installed GMP. This isn't true of t-expr though, since it uses 81 some of the internal tests/libtests.la. 82 83 84 85 SIMPLE USAGE 86 87 int mpz_expr (mpz_t res, int base, const char *e, ...); 88 int mpq_expr (mpq_t res, int base, const char *e, ...); 89 int mpf_expr (mpf_t res, int base, const char *e, ...); 90 91 These functions evaluate simple arithmetic expressions. For example, 92 93 mpz_expr (result, 0, "123+456", NULL); 94 95 Numbers are parsed by mpz_expr and mpq_expr the same as mpz_set_str with the 96 given base. mpf_expr follows mpf_set_str, but supporting an "0x" prefix for 97 hex when base==0. 98 99 mpz_expr (result, 0, "0xAAAA * 0x5555", NULL); 100 101 White space, as indicated by <ctype.h> isspace(), is ignored except for the 102 purpose of separating tokens. 103 104 Variables can be included in expressions by putting them in the stdarg list 105 after the string. "a", "b", "c" etc in the expression string designate 106 those values. For example, 107 108 mpq_t foo, bar; 109 ... 110 mpq_expr (q, 10, "2/3 + 1/a + b/2", foo, bar, NULL); 111 112 Here "a" will be the value from foo and "b" from bar. Up to 26 variables 113 can be included this way. The NULL must be present to indicate the end of 114 the list. 115 116 Variables can also be written "$a", "$b" etc. This is necessary when using 117 bases greater than 10 since plain "a", "b" etc will otherwise be interpreted 118 as numbers. For example, 119 120 mpf_t quux; 121 mpf_expr (f, 16, "F00F@-6 * $a", quux, NULL); 122 123 All the standard C operators are available, with the usual precedences, plus 124 "**" for exponentiation at the highest precedence (and right associative). 125 126 Operators Precedence 127 ** 220 128 ~ ! - (unary) 210 129 * / % 200 130 + - 190 131 << >> 180 132 <= < >= > 170 133 == != 160 134 & 150 135 ^ 140 136 | 130 137 && 120 138 || 110 139 ? : 100/101 140 141 Currently only mpz_expr has the bitwise ~ % & ^ and | operators. The 142 precedence numbers are of interest in the advanced usage described below. 143 144 Various functions are available too. For example, 145 146 mpz_expr (res, 10, "gcd(123,456,789) * abs(a)", var, NULL); 147 148 The following is the full set of functions, 149 150 mpz_expr 151 abs bin clrbit cmp cmpabs congruent_p divisible_p even_p fib fac 152 gcd hamdist invert jacobi kronecker lcm lucnum max min nextprime 153 odd_p perfect_power_p perfect_square_p popcount powm 154 probab_prime_p root scan0 scan1 setbit sgn sqrt 155 156 mpq_expr 157 abs, cmp, den, max, min, num, sgn 158 159 mpf_expr 160 abs, ceil, cmp, eq, floor, integer_p, max, min, reldiff, sgn, 161 sqrt, trunc 162 163 All these are the same as the GMP library functions, except that min and max 164 don't exist in the library. Note also that min, max, gcd and lcm take any 165 number of arguments, not just two. 166 167 mpf_expr does all calculations to the precision of the destination variable. 168 169 170 Expression parsing can succeed or fail. The return value indicates this, 171 and will be one of the following 172 173 MPEXPR_RESULT_OK 174 MPEXPR_RESULT_BAD_VARIABLE 175 MPEXPR_RESULT_BAD_TABLE 176 MPEXPR_RESULT_PARSE_ERROR 177 MPEXPR_RESULT_NOT_UI 178 179 BAD_VARIABLE is when a variable is referenced that hasn't been provided. 180 For example if "c" is used when only two parameters have been passed. 181 BAD_TABLE is applicable to the advanced usage described below. 182 183 PARSE_ERROR is a general syntax error, returned for any mal-formed input 184 string. 185 186 NOT_UI is returned when an attempt is made to use an operand that's bigger 187 than an "unsigned long" with a function that's restricted to that range. 188 For example "fib" is mpz_fib_ui and only accepts an "unsigned long". 189 190 191 192 193 ADVANCED USAGE 194 195 int mpz_expr_a (const struct mpexpr_operator_t *table, 196 mpz_ptr res, int base, const char *e, size_t elen, 197 mpz_srcptr var[26]) 198 int mpq_expr_a (const struct mpexpr_operator_t *table, 199 mpq_ptr res, int base, const char *e, size_t elen, 200 mpq_srcptr var[26]) 201 int mpf_expr_a (const struct mpexpr_operator_t *table, 202 mpf_ptr res, int base, unsigned long prec, 203 const char *e, size_t elen, 204 mpf_srcptr var[26]) 205 206 These functions are an advanced interface to expression parsing. 207 208 The string is taken as pointer and length. This makes it possible to parse 209 an expression in the middle of somewhere without copying and null 210 terminating it. 211 212 Variables are an array of 26 pointers to the appropriate operands, or NULL 213 for variables that are not available. Any combination of variables can be 214 given, for example just "x" and "y" (var[23] and var[24]) could be set. 215 216 Operators and functions are specified with a table. This makes it possible 217 to provide additional operators or functions, or to completely change the 218 syntax. The standard tables used by the simple functions above are 219 available as 220 221 const struct mpexpr_operator_t * const mpz_expr_standard_table; 222 const struct mpexpr_operator_t * const mpq_expr_standard_table; 223 const struct mpexpr_operator_t * const mpf_expr_standard_table; 224 225 struct mpexpr_operator_t is the following 226 227 struct mpexpr_operator_t { 228 const char *name; 229 mpexpr_fun_t fun; 230 int type; 231 int precedence; 232 }; 233 234 typedef void (*mpexpr_fun_t) (void); 235 236 As an example, the standard mpz_expr table entry for multiplication is as 237 follows. See the source code for the full set of standard entries. 238 239 { "*", (mpexpr_fun_t) mpz_mul, MPEXPR_TYPE_BINARY, 200 }, 240 241 "name" is the string to parse, "fun" is the function to call for it, "type" 242 indicates what parameters the function takes (among other things), and 243 "precedence" sets its operator precedence. 244 245 A NULL for "name" indicates the end of the table, so for example an mpf 246 table with nothing but addition could be 247 248 struct mpexpr_operator_t table[] = { 249 { "+", (mpexpr_fun_t) mpf_add, MPEXPR_TYPE_BINARY, 190 }, 250 { NULL } 251 }; 252 253 A special type MPEXPR_TYPE_NEW_TABLE makes it possible to chain from one 254 table to another. For example the following would add a "mod" operator to 255 the standard mpz table, 256 257 struct mpexpr_operator_t table[] = { 258 { "mod", (mpexpr_fun_t) mpz_fdiv_r, MPEXPR_TYPE_BINARY, 125 }, 259 { (const char *) mpz_expr_standard_table, NULL, MPEXPR_TYPE_NEW_TABLE } 260 }; 261 262 Notice the low precedence on "mod", so that for instance "45+26 mod 7" 263 parses as "(45+26)mod7". 264 265 266 Functions are designated by a precedence of 0. They always occur as 267 "foo(expr)" and so have no need for a precedence level. mpq_abs in the 268 standard mpq table is 269 270 { "abs", (mpexpr_fun_t) mpq_abs, MPEXPR_TYPE_UNARY }, 271 272 Functions expecting no arguments as in "foo()" can be given with 273 MPEXPR_TYPE_0ARY, or actual constants to be parsed as just "foo" are 274 MPEXPR_TYPE_CONSTANT. For example if a "void mpf_const_pi(mpf_t f)" 275 function existed (which it doesn't) it could be, 276 277 { "pi", (mpexpr_fun_t) mpf_const_pi, MPEXPR_TYPE_CONSTANT }, 278 279 280 Parsing of operator names is done by seeking the table entry with the 281 longest matching name. So for instance operators "<" and "<=" exist, and 282 when presented with "x <= y" the parser matches "<=" because it's longer. 283 284 Parsing of function names, on the other hand, is done by requiring a whole 285 alphanumeric word to match. For example presented with "fib2zz(5)" the 286 parser will attempt to find a function called "fib2zz". A function "fib" 287 wouldn't be used because it doesn't match the whole word. 288 289 The flag MPEXPR_TYPE_WHOLEWORD can be ORed into an operator type to override 290 the default parsing style. Similarly MPEXPR_TYPE_OPERATOR into a function. 291 292 293 Binary operators are left associative by default, meaning they're evaluated 294 from left to right, so for example "1+2+3" is treated as "(1+2)+3". 295 MPEXPR_TYPE_RIGHTASSOC can be ORed into the operator type to work from right 296 to left as in "1+(2+3)". This is generally what's wanted for 297 exponentiation, and for example the standard mpz table has 298 299 { "**", (mpexpr_fun_t) mpz_pow_ui, 300 MPEXPR_TYPE_BINARY_UI | MPEXPR_TYPE_RIGHTASSOC, 220 } 301 302 Unary operators are postfix by default. For example a factorial to be used 303 as "123!" might be 304 305 { "!", (mpexpr_fun_t) mpz_fac_ui, MPEXPR_TYPE_UNARY_UI, 215 } 306 307 MPEXPR_TYPE_PREFIX can be ORed into the type to get a prefix operator. For 308 instance negation (unary minus) in the standard mpf table is 309 310 { "-", (mpexpr_fun_t) mpf_neg, 311 MPEXPR_TYPE_UNARY | MPEXPR_TYPE_PREFIX, 210 }, 312 313 314 The same operator can exist as a prefix unary and a binary, or as a prefix 315 and postfix unary, simply by putting two entries in the table. While 316 parsing the context determines which style is sought. But note that the 317 same operator can't be both a postfix unary and a binary, since the parser 318 doesn't try to look ahead to decide which ought to be used. 319 320 When there's two entries for an operator, both prefix or both postfix (or 321 binary), then the first in the table will be used. This makes it possible 322 to override an entry in a standard table, for example to change the function 323 it calls, or perhaps its precedence level. The following would change mpz 324 division from tdiv to cdiv, 325 326 struct mpexpr_operator_t table[] = { 327 { "/", (mpexpr_fun_t) mpz_cdiv_q, MPEXPR_TYPE_BINARY, 200 }, 328 { "%", (mpexpr_fun_t) mpz_cdiv_r, MPEXPR_TYPE_BINARY, 200 }, 329 { (char *) mpz_expr_standard_table, NULL, MPEXPR_TYPE_NEW_TABLE } 330 }; 331 332 333 The type field indicates what parameters the given function expects. The 334 following styles of functions are supported. mpz_t is shown, but of course 335 this is mpq_t for mpq_expr_a, mpf_t for mpf_expr_a, etc. 336 337 MPEXPR_TYPE_CONSTANT void func (mpz_t result); 338 339 MPEXPR_TYPE_0ARY void func (mpz_t result); 340 MPEXPR_TYPE_I_0ARY int func (void); 341 342 MPEXPR_TYPE_UNARY void func (mpz_t result, mpz_t op); 343 MPEXPR_TYPE_UNARY_UI void func (mpz_t result, unsigned long op); 344 MPEXPR_TYPE_I_UNARY int func (mpz_t op); 345 MPEXPR_TYPE_I_UNARY_UI int func (unsigned long op); 346 347 MPEXPR_TYPE_BINARY void func (mpz_t result, mpz_t op1, mpz_t op2); 348 MPEXPR_TYPE_BINARY_UI void func (mpz_t result, 349 mpz_t op1, unsigned long op2); 350 MPEXPR_TYPE_I_BINARY int func (mpz_t op1, mpz_t op2); 351 MPEXPR_TYPE_I_BINARY_UI int func (mpz_t op1, unsigned long op2); 352 353 MPEXPR_TYPE_TERNARY void func (mpz_t result, 354 mpz_t op1, mpz_t op2, mpz_t op3); 355 MPEXPR_TYPE_TERNARY_UI void func (mpz_t result, mpz_t op1, mpz_t op2, 356 unsigned long op3); 357 MPEXPR_TYPE_I_TERNARY int func (mpz_t op1, mpz_t op2, mpz_t op3); 358 MPEXPR_TYPE_I_TERNARY_UI int func (mpz_t op1, mpz_t op2, 359 unsigned long op3); 360 361 Notice the pattern of "UI" for the last parameter as an unsigned long, or 362 "I" for the result as an "int" return value. 363 364 It's important that the declared type for an operator or function matches 365 the function pointer given. Any mismatch will have unpredictable results. 366 367 For binary functions, a further type attribute is MPEXPR_TYPE_PAIRWISE which 368 indicates that any number of arguments should be accepted, and evaluated by 369 applying the given binary function to them pairwise. This is used by gcd, 370 lcm, min and max. For example the standard mpz gcd is 371 372 { "gcd", (mpexpr_fun_t) mpz_gcd, 373 MPEXPR_TYPE_BINARY | MPEXPR_TYPE_PAIRWISE }, 374 375 Some special types exist for comparison operators (or functions). 376 MPEXPR_TYPE_CMP_LT through MPEXPR_TYPE_CMP_GE expect an MPEXPR_TYPE_I_BINARY 377 function, returning positive, negative or zero like mpz_cmp and similar. 378 For example the standard mpf "!=" operator is 379 380 { "!=", (mpexpr_fun_t) mpf_cmp, MPEXPR_TYPE_CMP_NE, 160 }, 381 382 But there's no obligation to use these types, for instance the standard mpq 383 table just uses a plain MPEXPR_TYPE_I_BINARY and mpq_equal for "==". 384 385 Further special types MPEXPR_TYPE_MIN and MPEXPR_TYPE_MAX exist to implement 386 the min and max functions, and they take a function like mpf_cmp similarly. 387 The standard mpf max function is 388 389 { "max", (mpexpr_fun_t) mpf_cmp, 390 MPEXPR_TYPE_MAX | MPEXPR_TYPE_PAIRWISE }, 391 392 These can be used as operators too, for instance the following would be the 393 >? operator which is a feature of GNU C++, 394 395 { ">?", (mpexpr_fun_t) mpf_cmp, MPEXPR_TYPE_MAX, 175 }, 396 397 Other special types are used to define "(" ")" parentheses, "," function 398 argument separator, "!" through "||" logical booleans, ternary "?" ":", and 399 the "$" which introduces variables. See the sources for how they should be 400 used. 401 402 403 User definable operator tables will have various uses. For example, 404 405 - a subset of the C operators, to be rid of infrequently used things 406 - a more mathematical syntax like "." for multiply, "^" for powering, 407 and "!" for factorial 408 - a boolean evaluator with "^" for AND, "v" for OR 409 - variables introduced with "%" instead of "$" 410 - brackets as "[" and "]" instead of "(" and ")" 411 412 The only fixed parts of the parsing are the treatment of numbers, whitespace 413 and the two styles of operator/function name recognition. 414 415 As a final example, the following would be a complete mpz table implementing 416 some operators with a more mathematical syntax. Notice there's no need to 417 preserve the standard precedence values, anything can be used so long as 418 they're in the desired relation to each other. There's also no need to have 419 entries in precedence order, but it's convenient to do so to show what comes 420 where. 421 422 static const struct mpexpr_operator_t table[] = { 423 { "^", (mpexpr_fun_t) mpz_pow_ui, 424 MPEXPR_TYPE_BINARY_UI | MPEXPR_TYPE_RIGHTASSOC, 9 }, 425 426 { "!", (mpexpr_fun_t) mpz_fac_ui, MPEXPR_TYPE_UNARY_UI, 8 }, 427 { "-", (mpexpr_fun_t) mpz_neg, 428 MPEXPR_TYPE_UNARY | MPEXPR_TYPE_PREFIX, 7 }, 429 430 { "*", (mpexpr_fun_t) mpz_mul, MPEXPR_TYPE_BINARY, 6 }, 431 { "/", (mpexpr_fun_t) mpz_fdiv_q, MPEXPR_TYPE_BINARY, 6 }, 432 433 { "+", (mpexpr_fun_t) mpz_add, MPEXPR_TYPE_BINARY, 5 }, 434 { "-", (mpexpr_fun_t) mpz_sub, MPEXPR_TYPE_BINARY, 5 }, 435 436 { "mod", (mpexpr_fun_t) mpz_mod, MPEXPR_TYPE_BINARY, 6 }, 437 438 { ")", NULL, MPEXPR_TYPE_CLOSEPAREN, 4 }, 439 { "(", NULL, MPEXPR_TYPE_OPENPAREN, 3 }, 440 { ",", NULL, MPEXPR_TYPE_ARGSEP, 2 }, 441 442 { "$", NULL, MPEXPR_TYPE_VARIABLE, 1 }, 443 { NULL } 444 }; 445 446 447 448 449 INTERNALS 450 451 Operator precedence is implemented using a control and data stack, there's 452 no C recursion. When an expression like 1+2*3 is read the "+" is held on 453 the control stack and 1 on the data stack until "*" has been parsed and 454 applied to 2 and 3. This happens any time a higher precedence operator 455 follows a lower one, or when a right-associative operator like "**" is 456 repeated. 457 458 Parentheses are handled by making "(" a special prefix unary with a low 459 precedence so a whole following expression is read. The special operator 460 ")" knows to discard the pending "(". Function arguments are handled 461 similarly, with the function pretending to be a low precedence prefix unary 462 operator, and with "," allowed within functions. The same special ")" 463 operator recognises a pending function and will invoke it appropriately. 464 465 The ternary "? :" operator is also handled using precedences. ":" is one 466 level higher than "?", so when a valid a?b:c is parsed the ":" finds a "?" 467 on the control stack. It's a parse error for ":" to find anything else. 468 469 470 471 FUTURE 472 473 The ternary "?:" operator evaluates the "false" side of its pair, which is 474 wasteful, though it ought to be harmless. It'd be better if it could 475 evaluate only the "true" side. Similarly for the logical booleans "&&" and 476 "||" if they know their result already. 477 478 Functions like MPEXPR_TYPE_BINARY could return a status indicating operand 479 out of range or whatever, to get an error back through mpz_expr etc. That 480 would want to be just an option, since plain mpz_add etc have no such 481 return. 482 483 Could have assignments like "a = b*c" modifying the input variables. 484 Assignment could be an operator attribute, making it expect an lvalue. 485 There would want to be a standard table without assignments available 486 though, so user input could be safely parsed. 487 488 The closing parenthesis table entry could specify the type of open paren it 489 expects, so that "(" and ")" could match and "[" and "]" match but not a 490 mixture of the two. Currently "[" and "]" can be added, but there's no 491 error on writing a mixed expression like "2*(3+4]". Maybe also there could 492 be a way to say that functions can only be written with one or the other 493 style of parens. 494 495 496 497 ---------------- 498 Local variables: 499 mode: text 500 fill-column: 76 501 End: