├── .gitignore ├── LICENSE ├── Lazarus ├── ConsoleCalc.exe ├── ConsoleCalc.lpi └── ConsoleCalc.lpr ├── Main.dfm ├── Main.pas ├── MathParser.pas ├── MathParserProj.dpr ├── MathParserProj.dproj ├── MathParserProj.exe ├── MathParserProj.res ├── ProjectGroup.groupproj ├── README.md ├── Tests ├── MathParserTest.pas ├── Tests.dpr ├── Tests.dproj └── Tests.res └── scr.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ 70 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Lazarus/ConsoleCalc.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/turborium/SimpleMathParser/fad92031d6cf1b17df11461f626ddf1db220b776/Lazarus/ConsoleCalc.exe -------------------------------------------------------------------------------- /Lazarus/ConsoleCalc.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | <UseAppBundle Value="False"/> 16 | <ResourceType Value="res"/> 17 | </General> 18 | <BuildModes Count="1"> 19 | <Item1 Name="Default" Default="True"/> 20 | </BuildModes> 21 | <PublishOptions> 22 | <Version Value="2"/> 23 | <UseFileFilters Value="True"/> 24 | </PublishOptions> 25 | <RunParams> 26 | <FormatVersion Value="2"/> 27 | <Modes Count="0"/> 28 | </RunParams> 29 | <Units Count="2"> 30 | <Unit0> 31 | <Filename Value="ConsoleCalc.lpr"/> 32 | <IsPartOfProject Value="True"/> 33 | </Unit0> 34 | <Unit1> 35 | <Filename Value="..\MathParser.pas"/> 36 | <IsPartOfProject Value="True"/> 37 | </Unit1> 38 | </Units> 39 | </ProjectOptions> 40 | <CompilerOptions> 41 | <Version Value="11"/> 42 | <PathDelim Value="\"/> 43 | <Target> 44 | <Filename Value="ConsoleCalc"/> 45 | </Target> 46 | <SearchPaths> 47 | <IncludeFiles Value="$(ProjOutDir)"/> 48 | <OtherUnitFiles Value=".."/> 49 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 50 | </SearchPaths> 51 | </CompilerOptions> 52 | <Debugging> 53 | <Exceptions Count="3"> 54 | <Item1> 55 | <Name Value="EAbort"/> 56 | </Item1> 57 | <Item2> 58 | <Name Value="ECodetoolError"/> 59 | </Item2> 60 | <Item3> 61 | <Name Value="EFOpenError"/> 62 | </Item3> 63 | </Exceptions> 64 | </Debugging> 65 | </CONFIG> 66 | -------------------------------------------------------------------------------- /Lazarus/ConsoleCalc.lpr: -------------------------------------------------------------------------------- 1 | program ConsoleCalc; 2 | 3 | {$MODE DELPHIUNICODE} 4 | 5 | uses 6 | MathParser, SysUtils; 7 | 8 | var 9 | parser: TMathParser; 10 | s: string; 11 | ans: Double; 12 | begin 13 | parser := TMathParser.Create; 14 | try 15 | WriteLn('Enter expression:'); 16 | ReadLn(s); 17 | parser.Expression := s; 18 | try 19 | ans := parser.Calculate; 20 | WriteLn('Ans = ', FloatToStr(ans, DefaultFormatSettings)); 21 | except 22 | on E: EParserError do 23 | WriteLn(E.Message); 24 | end; 25 | finally 26 | parser.Free; 27 | end; 28 | WriteLn('Press Enter key...'); 29 | ReadLn; 30 | end. 31 | -------------------------------------------------------------------------------- /Main.dfm: -------------------------------------------------------------------------------- 1 | object FormMain: TFormMain 2 | Left = 0 3 | Top = 0 4 | BorderWidth = 8 5 | Caption = 'FormMain' 6 | ClientHeight = 336 7 | ClientWidth = 535 8 | Color = clBtnFace 9 | Constraints.MinHeight = 200 10 | Constraints.MinWidth = 300 11 | Font.Charset = DEFAULT_CHARSET 12 | Font.Color = clWindowText 13 | Font.Height = -14 14 | Font.Name = 'Segoe UI' 15 | Font.Style = [] 16 | OnCreate = FormCreate 17 | OnDestroy = FormDestroy 18 | PixelsPerInch = 96 19 | TextHeight = 19 20 | object EditExpression: TEdit 21 | Left = 0 22 | Top = 0 23 | Width = 535 24 | Height = 26 25 | Align = alTop 26 | Font.Charset = DEFAULT_CHARSET 27 | Font.Color = clWindowText 28 | Font.Height = -16 29 | Font.Name = 'Courier New' 30 | Font.Style = [] 31 | ParentFont = False 32 | TabOrder = 0 33 | Text = '(6-1.5*2)*3/2 + -20' 34 | end 35 | object ButtonExecute: TButton 36 | AlignWithMargins = True 37 | Left = 0 38 | Top = 29 39 | Width = 535 40 | Height = 25 41 | Margins.Left = 0 42 | Margins.Right = 0 43 | Align = alTop 44 | Caption = 'Execute' 45 | TabOrder = 1 46 | OnClick = ButtonExecuteClick 47 | ExplicitLeft = -16 48 | ExplicitTop = 26 49 | end 50 | object MemoLog: TMemo 51 | Left = 0 52 | Top = 57 53 | Width = 535 54 | Height = 279 55 | Align = alClient 56 | Font.Charset = DEFAULT_CHARSET 57 | Font.Color = clWindowText 58 | Font.Height = -16 59 | Font.Name = 'Courier New' 60 | Font.Style = [] 61 | ParentFont = False 62 | ScrollBars = ssBoth 63 | TabOrder = 2 64 | end 65 | end 66 | -------------------------------------------------------------------------------- /Main.pas: -------------------------------------------------------------------------------- 1 | unit Main; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MathParser; 8 | 9 | type 10 | TFormMain = class(TForm) 11 | EditExpression: TEdit; 12 | ButtonExecute: TButton; 13 | MemoLog: TMemo; 14 | procedure FormCreate(Sender: TObject); 15 | procedure FormDestroy(Sender: TObject); 16 | procedure ButtonExecuteClick(Sender: TObject); 17 | private 18 | Parser: TMathParser; 19 | procedure ParserLog(sender: TObject; str: string); 20 | public 21 | end; 22 | 23 | var 24 | FormMain: TFormMain; 25 | 26 | implementation 27 | 28 | uses 29 | StrUtils, Math; 30 | 31 | {$R *.dfm} 32 | 33 | procedure TFormMain.ButtonExecuteClick(Sender: TObject); 34 | var 35 | Ans: Double; 36 | begin 37 | Parser.Constants['x'] := 2; 38 | Parser.Constants['y'] := 10; 39 | Parser.Expression := EditExpression.Text; 40 | MemoLog.Clear; 41 | try 42 | Ans := Parser.Calculate; 43 | ParserLog(self, 'Ans: ' + FloatToStr(Ans, TFormatSettings.Invariant)); 44 | except 45 | on E: EParserError do 46 | begin 47 | ParserLog(Self, ' 0123456789012345678901234567890123456789'); 48 | ParserLog(Self, '"' + Parser.Expression + '_"'); 49 | ParserLog(Self, ' ' + DupeString(' ', E.Position) + '^'); 50 | ParserLog(Self, E.Message); 51 | end; 52 | end; 53 | end; 54 | 55 | procedure TFormMain.FormCreate(Sender: TObject); 56 | begin 57 | Parser := TMathParser.Create; 58 | Parser.OnLog := ParserLog; 59 | end; 60 | 61 | procedure TFormMain.FormDestroy(Sender: TObject); 62 | begin 63 | Parser.Free; 64 | 65 | end; 66 | 67 | procedure TFormMain.ParserLog(sender: TObject; str: string); 68 | begin 69 | MemoLog.Lines.Add(str); 70 | end; 71 | 72 | end. 73 | -------------------------------------------------------------------------------- /MathParser.pas: -------------------------------------------------------------------------------- 1 | // copyright 2021-2021 crazzzypeter 2 | // license GNU 3.0 3 | 4 | unit MathParser; 5 | 6 | {$IFDEF FPC}{$MODE DELPHIUNICODE}{$ENDIF} 7 | 8 | {$SCOPEDENUMS ON} 9 | 10 | interface 11 | 12 | uses 13 | Classes, SysUtils, Generics.Collections; 14 | 15 | type 16 | EParserError = class(Exception) 17 | private 18 | FPosition: Integer; 19 | public 20 | constructor Create(const Position: Integer; const Message: string); 21 | property Position: Integer read FPosition; 22 | end; 23 | 24 | // Plus := '+' 25 | // Minus := '-' 26 | // Multiply := '*' 27 | // Divide := '/' 28 | 29 | // <Number> := <'0'..'9'>[.]<'0'..'9'>[e<['0'..'9']>] ... 30 | // <Primitive> := <'('><AddAndSub><')'> | <Number> 31 | // <MulAndDiv> := <Primitive> [<Multiply> | <Divide>] <Primitive> ... 32 | // <AddAndSub> := <MulAndDiv> [<Plus> | <Minus>] <MulAndDiv> ... 33 | 34 | TLogEvent = procedure (sender: TObject; str: string) of object; 35 | 36 | TTokenType = (Number, Plus, Minus, Multiply, Divide, Power, LeftBracket, RightBracket, &Function, Variable, 37 | Terminal); 38 | 39 | TMathCall = function(): Double of object; 40 | 41 | TMathParser = class sealed 42 | private 43 | FExpression: string; 44 | FOnLog: TLogEvent; 45 | procedure SetExpression(const Value: string); 46 | private 47 | FContants: TDictionary<string, Double>; 48 | Data: PChar; 49 | Position: Integer; 50 | PrevPosition: Integer; 51 | Token: TTokenType; 52 | Value: Double; 53 | Identifier: string; 54 | StackLevel: Integer; 55 | procedure NextToken; 56 | procedure SkipSpaces; 57 | function Primitive: Double; 58 | function AddAndSub: Double; 59 | function MulAndDiv: Double; 60 | function ExecuteFunction(const X: Double; FunctionName: string; const FunctionPosition: Integer): Double; 61 | procedure Log(str: string); 62 | function Pow: Double; 63 | function RecursiveCall(const Func: TMathCall): Double; 64 | function GetConstant(const Name: string): Double; 65 | procedure SetConstant(const Name: string; const Value: Double); 66 | public 67 | constructor Create; 68 | destructor Destroy; override; 69 | function Calculate: Double; 70 | property Expression: string read FExpression write SetExpression; 71 | property OnLog: TLogEvent read FOnLog write FOnLog; 72 | property Constants[const Name: string]: Double read GetConstant write SetConstant; 73 | end; 74 | 75 | implementation 76 | 77 | uses 78 | Math; 79 | 80 | const 81 | MaxStackLevel = 32; 82 | 83 | sClosingParenthesisExpected = 'Closing parenthesis expected'; 84 | sPrimitiveExpected = 'Primitive expected'; 85 | sMissingOperator = 'Missing operator'; 86 | sUnmatchedRightParenthesis = 'Unmatched right parenthesis'; 87 | sUnexpectedSymbol = 'Unexpected symbol'; 88 | sBadNumber = 'Bad number'; 89 | sDivisionByZero = 'Division by zero'; 90 | sBadFunctionArgument = 'Bad function argument'; 91 | sBadFunction = 'Bad function'; 92 | sOverflow = 'Overflow'; 93 | sInternalError = 'Internal error!'; 94 | sStackOverflow = 'Stack overflow'; 95 | sContantNotFound = 'Constant not found'; 96 | 97 | { TMathParser } 98 | 99 | procedure TMathParser.NextToken; 100 | var 101 | TokenString: string; 102 | begin 103 | SkipSpaces; 104 | 105 | PrevPosition := Position; 106 | 107 | case Data[Position] of 108 | '0'..'9': 109 | begin 110 | // for ex: 12.34e+56 111 | // 12 112 | Token := TTokenType.Number; 113 | while CharInSet(Data[Position], ['0'..'9']) do 114 | begin 115 | TokenString := TokenString + Data[Position]; 116 | Position := Position + 1; 117 | end; 118 | // . 119 | if Data[Position] = '.' then 120 | begin 121 | TokenString := TokenString + Data[Position]; 122 | Position := Position + 1; 123 | end; 124 | // 34 125 | while CharInSet(Data[Position], ['0'..'9']) do 126 | begin 127 | TokenString := TokenString + Data[Position]; 128 | Position := Position + 1; 129 | end; 130 | // e 131 | if CharInSet(Data[Position], ['e', 'E']) then 132 | begin 133 | TokenString := TokenString + Data[Position]; 134 | Position := Position + 1; 135 | // +/- 136 | if CharInSet(Data[Position], ['-', '+']) then 137 | begin 138 | TokenString := TokenString + Data[Position]; 139 | Position := Position + 1; 140 | end; 141 | // 56 142 | if not CharInSet(Data[Position], ['0'..'9']) then 143 | raise Exception.Create(sBadNumber);// error 144 | while CharInSet(Data[Position], ['0'..'9']) do 145 | begin 146 | TokenString := TokenString + Data[Position]; 147 | Position := Position + 1; 148 | end; 149 | end; 150 | 151 | if not TryStrToFloat(TokenString, Value, 152 | {$IFNDEF FPC}TFormatSettings.Invariant{$ELSE}DefaultFormatSettings{$ENDIF}) then 153 | raise EParserError.Create(PrevPosition, sBadNumber);// error 154 | 155 | Log('NextToken: TokenType = Number, Value = ' + 156 | FloatToStr(Value, {$IFNDEF FPC}TFormatSettings.Invariant{$ELSE}DefaultFormatSettings{$ENDIF})); 157 | end; 158 | '+': 159 | begin 160 | Log('NextToken: TokenType = Plus'); 161 | Token := TTokenType.Plus; 162 | Position := Position + 1; 163 | end; 164 | '-': 165 | begin 166 | Log('NextToken: TokenType = Minus'); 167 | Token := TTokenType.Minus; 168 | Position := Position + 1; 169 | end; 170 | '*': 171 | begin 172 | Log('NextToken: TokenType = Multiply'); 173 | Token := TTokenType.Multiply; 174 | Position := Position + 1; 175 | end; 176 | '/': 177 | begin 178 | Log('NextToken: TokenType = Divide'); 179 | Token := TTokenType.Divide; 180 | Position := Position + 1; 181 | end; 182 | '^': 183 | begin 184 | Log('NextToken: TokenType = Power'); 185 | Token := TTokenType.Power; 186 | Position := Position + 1; 187 | end; 188 | '(': 189 | begin 190 | Log('NextToken: TokenType = LeftBracket'); 191 | Token := TTokenType.LeftBracket; 192 | Position := Position + 1; 193 | end; 194 | ')': 195 | begin 196 | Log('NextToken: TokenType = RightBracket'); 197 | Token := TTokenType.RightBracket; 198 | Position := Position + 1; 199 | end; 200 | 'a'..'z', 'A'..'Z': 201 | begin 202 | Identifier := ''; 203 | // abc 204 | while CharInSet(Data[Position], ['a'..'z', 'A'..'Z', '0'..'9']) do 205 | begin 206 | Identifier := Identifier + Data[Position]; 207 | Position := Position + 1; 208 | end; 209 | // SkipSpaces; 210 | // ( 211 | if Data[Position] = '(' then 212 | begin 213 | Token := TTokenType.&Function; 214 | Position := Position + 1; 215 | end else 216 | Token := TTokenType.Variable; 217 | 218 | //raise EParserError.Create(PrevPosition, sBadFunction);// error 219 | 220 | Log('NextToken: TokenType = Function, Value = ' + Identifier); 221 | end; 222 | #0: 223 | begin 224 | Log('NextToken: TokenType = Terminal'); 225 | Token := TTokenType.Terminal; 226 | end; 227 | else 228 | raise EParserError.Create(Position, sUnexpectedSymbol);// error 229 | end; 230 | end; 231 | 232 | function TMathParser.Primitive: Double; 233 | var 234 | FunctionName: string; 235 | FunctionPos: Integer; 236 | begin 237 | //NextToken; 238 | case Token of 239 | // unary operators +/- 240 | TTokenType.Plus: 241 | begin 242 | NextToken; 243 | Result := RecursiveCall(Primitive); 244 | end; 245 | TTokenType.Minus: 246 | begin 247 | NextToken; 248 | Result := -RecursiveCall(Primitive); 249 | end; 250 | // primitives 251 | TTokenType.Number: 252 | begin 253 | NextToken; 254 | Result := Value; 255 | end; 256 | TTokenType.LeftBracket: 257 | begin 258 | NextToken; 259 | Result := RecursiveCall(AddAndSub); 260 | if Token <> TTokenType.RightBracket then 261 | raise EParserError.Create(PrevPosition, sClosingParenthesisExpected);// error 262 | NextToken; 263 | end; 264 | TTokenType.&Function: 265 | begin 266 | FunctionName := UpperCase(Identifier);// hmmm... 267 | FunctionPos := PrevPosition; 268 | NextToken; 269 | Result := RecursiveCall(AddAndSub); 270 | if Token <> TTokenType.RightBracket then 271 | raise EParserError.Create(Position, sClosingParenthesisExpected);// error 272 | Result := ExecuteFunction(Result, FunctionName, FunctionPos); 273 | NextToken; 274 | end; 275 | TTokenType.Variable: 276 | begin 277 | if FContants.ContainsKey(UpperCase(Identifier)) then 278 | Result := FContants[UpperCase(Identifier)] 279 | else 280 | raise EParserError.Create(PrevPosition, sContantNotFound);// error 281 | NextToken; 282 | end 283 | else 284 | raise EParserError.Create(PrevPosition, sPrimitiveExpected);// error 285 | end; 286 | 287 | //if Token in [TTokenType.Number, TTokenType.LeftBracket, TTokenType.&Function] then 288 | // raise EParserError.Create(PrevPosition, sMissingOperator);// error 289 | end; 290 | 291 | function TMathParser.Pow: Double; 292 | begin 293 | Result := Primitive; 294 | 295 | while True do 296 | begin 297 | case Token of 298 | // ^ 299 | TTokenType.Power: 300 | begin 301 | NextToken; 302 | Result := Power(Result, RecursiveCall(Pow)); 303 | end; 304 | else 305 | break; 306 | end; 307 | end; 308 | end; 309 | 310 | function TMathParser.MulAndDiv: Double; 311 | var 312 | RightValue: Double; 313 | DividerPos: Integer; 314 | begin 315 | Result := Pow; 316 | 317 | while True do 318 | begin 319 | case Token of 320 | // * 321 | TTokenType.Multiply: 322 | begin 323 | NextToken; 324 | Result := Result * Pow; 325 | end; 326 | // / 327 | TTokenType.Divide: 328 | begin 329 | NextToken; 330 | DividerPos := PrevPosition; 331 | RightValue := Pow; 332 | if RightValue = 0.0 then 333 | raise EParserError.Create(DividerPos, sDivisionByZero); 334 | Result := Result / RightValue; 335 | end; 336 | else 337 | break; 338 | end; 339 | end; 340 | end; 341 | 342 | function TMathParser.AddAndSub: Double; 343 | begin 344 | Result := MulAndDiv; 345 | 346 | while True do 347 | begin 348 | case Token of 349 | // + 350 | TTokenType.Plus: 351 | begin 352 | NextToken; 353 | Result := Result + MulAndDiv; 354 | end; 355 | // - 356 | TTokenType.Minus: 357 | begin 358 | NextToken; 359 | Result := Result - MulAndDiv; 360 | end; 361 | else 362 | break; 363 | end; 364 | end; 365 | end; 366 | 367 | function TMathParser.Calculate: Double; 368 | var 369 | Mask: {$IFNDEF FPC}TArithmeticExceptionMask{$ELSE}TFPUExceptionMask{$ENDIF}; 370 | begin 371 | Position := 0; 372 | StackLevel := 0; 373 | 374 | Mask := SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]); 375 | try 376 | NextToken; 377 | Result := AddAndSub; 378 | 379 | if Token = TTokenType.RightBracket then 380 | raise EParserError.Create(PrevPosition, sUnmatchedRightParenthesis);// error 381 | 382 | if Token <> TTokenType.Terminal then 383 | raise EParserError.Create(PrevPosition, sMissingOperator);// error 384 | 385 | if IsInfinite(Result) then 386 | raise EParserError.Create(0, sOverflow);// error 387 | finally 388 | SetExceptionMask(Mask); 389 | end; 390 | end; 391 | 392 | function TMathParser.RecursiveCall(const Func: TMathCall): Double; 393 | begin 394 | StackLevel := StackLevel + 1; 395 | if StackLevel > MaxStackLevel then 396 | raise EParserError.Create(PrevPosition, sStackOverflow); 397 | Result := Func(); 398 | StackLevel := StackLevel - 1; 399 | end; 400 | 401 | constructor TMathParser.Create; 402 | begin 403 | FContants := TDictionary<string, Double>.Create; 404 | FContants.Add('PI', System.Pi); 405 | Data := PChar(FExpression); 406 | end; 407 | 408 | destructor TMathParser.Destroy; 409 | begin 410 | FContants.Free; 411 | inherited; 412 | end; 413 | 414 | function TMathParser.ExecuteFunction(const X: Double; FunctionName: string; const FunctionPosition: Integer): Double; 415 | begin 416 | if IsNan(X) then 417 | Exit(NaN); 418 | 419 | if FunctionName = 'SQRT' then 420 | begin 421 | if X < 0 then 422 | raise EParserError.Create(FunctionPosition, sBadFunctionArgument); 423 | Result := Sqrt(X); 424 | end 425 | else if FunctionName = 'SIN' then 426 | Result := Sin(X) 427 | else if FunctionName = 'COS' then 428 | Result := Cos(X) 429 | else if FunctionName = 'TAN' then 430 | Result := Tan(X) 431 | else if FunctionName = 'ARCSIN' then 432 | begin 433 | if (X < -1) or (X > 1) then 434 | raise EParserError.Create(FunctionPosition, sBadFunctionArgument); 435 | Result := ArcSin(X); 436 | end 437 | else if FunctionName = 'ARCCOS' then 438 | begin 439 | if (X < -1) or (X > 1) then 440 | raise EParserError.Create(FunctionPosition, sBadFunctionArgument); 441 | Result := ArcCos(X); 442 | end 443 | else if FunctionName = 'ARCTAN' then 444 | begin 445 | Result := ArcTan(X); 446 | end 447 | else if FunctionName = 'LOG' then 448 | begin 449 | if (X <= 0) then 450 | raise EParserError.Create(FunctionPosition, sBadFunctionArgument); 451 | Result := Log10(X); 452 | end 453 | else if FunctionName = 'EXP' then 454 | begin 455 | Result := Exp(X); 456 | end else 457 | raise EParserError.Create(FunctionPosition, sBadFunction); 458 | end; 459 | 460 | function TMathParser.GetConstant(const Name: string): Double; 461 | begin 462 | Result := FContants[UpperCase(Name)]; 463 | end; 464 | 465 | procedure TMathParser.Log(str: string); 466 | begin 467 | if Assigned(FOnLog) then 468 | FOnLog(self, str); 469 | end; 470 | 471 | procedure TMathParser.SetConstant(const Name: string; const Value: Double); 472 | begin 473 | FContants.AddOrSetValue(UpperCase(Name), Value); 474 | end; 475 | 476 | procedure TMathParser.SetExpression(const Value: string); 477 | begin 478 | FExpression := Value; 479 | Data := PChar(FExpression); 480 | end; 481 | 482 | procedure TMathParser.SkipSpaces; 483 | begin 484 | while CharInSet(Data[Position], [#9, ' ']) do 485 | begin 486 | Position := Position + 1; 487 | end; 488 | end; 489 | 490 | { EPerserError } 491 | 492 | constructor EParserError.Create(const Position: Integer; const Message: string); 493 | begin 494 | inherited Create('Error: ' + Message + ' at ' + IntToStr(Position)); 495 | FPosition := Position; 496 | end; 497 | 498 | end. 499 | -------------------------------------------------------------------------------- /MathParserProj.dpr: -------------------------------------------------------------------------------- 1 | program MathParserProj; 2 | 3 | uses 4 | Vcl.Forms, 5 | Main in 'Main.pas' {FormMain}, 6 | MathParser in 'MathParser.pas', 7 | Vcl.Themes, 8 | Vcl.Styles; 9 | 10 | {$R *.res} 11 | 12 | begin 13 | Application.Initialize; 14 | Application.MainFormOnTaskbar := True; 15 | Application.CreateForm(TFormMain, FormMain); 16 | Application.Run; 17 | end. 18 | -------------------------------------------------------------------------------- /MathParserProj.dproj: -------------------------------------------------------------------------------- 1 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 | <PropertyGroup> 3 | <ProjectGuid>{EF6C6F42-4305-4695-8172-AB43B329CAE5}</ProjectGuid> 4 | <ProjectVersion>19.3</ProjectVersion> 5 | <FrameworkType>VCL</FrameworkType> 6 | <Base>True</Base> 7 | <Config Condition="'$(Config)'==''">Debug</Config> 8 | <Platform Condition="'$(Platform)'==''">Win32</Platform> 9 | <TargetedPlatforms>1</TargetedPlatforms> 10 | <AppType>Application</AppType> 11 | <MainSource>MathParserProj.dpr</MainSource> 12 | </PropertyGroup> 13 | <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> 14 | <Base>true</Base> 15 | </PropertyGroup> 16 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> 17 | <Base_Win32>true</Base_Win32> 18 | <CfgParent>Base</CfgParent> 19 | <Base>true</Base> 20 | </PropertyGroup> 21 | <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> 22 | <Base_Win64>true</Base_Win64> 23 | <CfgParent>Base</CfgParent> 24 | <Base>true</Base> 25 | </PropertyGroup> 26 | <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> 27 | <Cfg_1>true</Cfg_1> 28 | <CfgParent>Base</CfgParent> 29 | <Base>true</Base> 30 | </PropertyGroup> 31 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> 32 | <Cfg_1_Win32>true</Cfg_1_Win32> 33 | <CfgParent>Cfg_1</CfgParent> 34 | <Cfg_1>true</Cfg_1> 35 | <Base>true</Base> 36 | </PropertyGroup> 37 | <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> 38 | <Cfg_2>true</Cfg_2> 39 | <CfgParent>Base</CfgParent> 40 | <Base>true</Base> 41 | </PropertyGroup> 42 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> 43 | <Cfg_2_Win32>true</Cfg_2_Win32> 44 | <CfgParent>Cfg_2</CfgParent> 45 | <Cfg_2>true</Cfg_2> 46 | <Base>true</Base> 47 | </PropertyGroup> 48 | <PropertyGroup Condition="'$(Base)'!=''"> 49 | <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> 50 | <DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput> 51 | <DCC_E>false</DCC_E> 52 | <DCC_N>false</DCC_N> 53 | <DCC_S>false</DCC_S> 54 | <DCC_F>false</DCC_F> 55 | <DCC_K>false</DCC_K> 56 | <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace> 57 | <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> 58 | <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> 59 | <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> 60 | <SanitizedProjectName>MathParserProj</SanitizedProjectName> 61 | </PropertyGroup> 62 | <PropertyGroup Condition="'$(Base_Win32)'!=''"> 63 | <DCC_UsePackage>vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;EsVclComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 64 | <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> 65 | <BT_BuildType>Debug</BT_BuildType> 66 | <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> 67 | <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> 68 | <VerInfo_Locale>1033</VerInfo_Locale> 69 | <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File> 70 | </PropertyGroup> 71 | <PropertyGroup Condition="'$(Base_Win64)'!=''"> 72 | <DCC_UsePackage>vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;EsVclComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 73 | </PropertyGroup> 74 | <PropertyGroup Condition="'$(Cfg_1)'!=''"> 75 | <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> 76 | <DCC_DebugDCUs>true</DCC_DebugDCUs> 77 | <DCC_Optimize>false</DCC_Optimize> 78 | <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> 79 | <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> 80 | <DCC_RemoteDebug>true</DCC_RemoteDebug> 81 | <DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck> 82 | <DCC_RangeChecking>true</DCC_RangeChecking> 83 | </PropertyGroup> 84 | <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> 85 | <DCC_RemoteDebug>false</DCC_RemoteDebug> 86 | <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes> 87 | <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> 88 | <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> 89 | <VerInfo_Locale>1033</VerInfo_Locale> 90 | </PropertyGroup> 91 | <PropertyGroup Condition="'$(Cfg_2)'!=''"> 92 | <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> 93 | <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> 94 | <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> 95 | <DCC_DebugInformation>0</DCC_DebugInformation> 96 | </PropertyGroup> 97 | <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> 98 | <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes> 99 | <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> 100 | </PropertyGroup> 101 | <ItemGroup> 102 | <DelphiCompile Include="$(MainSource)"> 103 | <MainSource>MainSource</MainSource> 104 | </DelphiCompile> 105 | <DCCReference Include="Main.pas"> 106 | <Form>FormMain</Form> 107 | <FormType>dfm</FormType> 108 | </DCCReference> 109 | <DCCReference Include="MathParser.pas"/> 110 | <BuildConfiguration Include="Base"> 111 | <Key>Base</Key> 112 | </BuildConfiguration> 113 | <BuildConfiguration Include="Debug"> 114 | <Key>Cfg_1</Key> 115 | <CfgParent>Base</CfgParent> 116 | </BuildConfiguration> 117 | <BuildConfiguration Include="Release"> 118 | <Key>Cfg_2</Key> 119 | <CfgParent>Base</CfgParent> 120 | </BuildConfiguration> 121 | </ItemGroup> 122 | <ProjectExtensions> 123 | <Borland.Personality>Delphi.Personality.12</Borland.Personality> 124 | <Borland.ProjectType>Application</Borland.ProjectType> 125 | <BorlandProject> 126 | <Delphi.Personality> 127 | <Source> 128 | <Source Name="MainSource">MathParserProj.dpr</Source> 129 | </Source> 130 | <Excluded_Packages> 131 | <Excluded_Packages Name="$(BDSBIN)\bcboffice2k280.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages> 132 | <Excluded_Packages Name="$(BDSBIN)\bcbofficexp280.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages> 133 | <Excluded_Packages Name="$(BDSBIN)\dcloffice2k280.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages> 134 | <Excluded_Packages Name="$(BDSBIN)\dclofficexp280.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages> 135 | </Excluded_Packages> 136 | </Delphi.Personality> 137 | <Deployment Version="3"> 138 | <DeployFile LocalName="Win32\Debug\MathParserProj.exe" Configuration="Debug" Class="ProjectOutput"> 139 | <Platform Name="Win32"> 140 | <RemoteName>MathParserProj.exe</RemoteName> 141 | <Overwrite>true</Overwrite> 142 | </Platform> 143 | </DeployFile> 144 | <DeployClass Name="AdditionalDebugSymbols"> 145 | <Platform Name="iOSSimulator"> 146 | <Operation>1</Operation> 147 | </Platform> 148 | <Platform Name="OSX32"> 149 | <RemoteDir>Contents\MacOS</RemoteDir> 150 | <Operation>1</Operation> 151 | </Platform> 152 | <Platform Name="Win32"> 153 | <Operation>0</Operation> 154 | </Platform> 155 | </DeployClass> 156 | <DeployClass Name="AndroidClasses"> 157 | <Platform Name="Android"> 158 | <RemoteDir>classes</RemoteDir> 159 | <Operation>64</Operation> 160 | </Platform> 161 | <Platform Name="Android64"> 162 | <RemoteDir>classes</RemoteDir> 163 | <Operation>64</Operation> 164 | </Platform> 165 | </DeployClass> 166 | <DeployClass Name="AndroidFileProvider"> 167 | <Platform Name="Android"> 168 | <RemoteDir>res\xml</RemoteDir> 169 | <Operation>1</Operation> 170 | </Platform> 171 | <Platform Name="Android64"> 172 | <RemoteDir>res\xml</RemoteDir> 173 | <Operation>1</Operation> 174 | </Platform> 175 | </DeployClass> 176 | <DeployClass Name="AndroidGDBServer"> 177 | <Platform Name="Android"> 178 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 179 | <Operation>1</Operation> 180 | </Platform> 181 | </DeployClass> 182 | <DeployClass Name="AndroidLibnativeArmeabiFile"> 183 | <Platform Name="Android"> 184 | <RemoteDir>library\lib\armeabi</RemoteDir> 185 | <Operation>1</Operation> 186 | </Platform> 187 | <Platform Name="Android64"> 188 | <RemoteDir>library\lib\armeabi</RemoteDir> 189 | <Operation>1</Operation> 190 | </Platform> 191 | </DeployClass> 192 | <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> 193 | <Platform Name="Android64"> 194 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 195 | <Operation>1</Operation> 196 | </Platform> 197 | </DeployClass> 198 | <DeployClass Name="AndroidLibnativeMipsFile"> 199 | <Platform Name="Android"> 200 | <RemoteDir>library\lib\mips</RemoteDir> 201 | <Operation>1</Operation> 202 | </Platform> 203 | <Platform Name="Android64"> 204 | <RemoteDir>library\lib\mips</RemoteDir> 205 | <Operation>1</Operation> 206 | </Platform> 207 | </DeployClass> 208 | <DeployClass Name="AndroidServiceOutput"> 209 | <Platform Name="Android"> 210 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 211 | <Operation>1</Operation> 212 | </Platform> 213 | <Platform Name="Android64"> 214 | <RemoteDir>library\lib\arm64-v8a</RemoteDir> 215 | <Operation>1</Operation> 216 | </Platform> 217 | </DeployClass> 218 | <DeployClass Name="AndroidServiceOutput_Android32"> 219 | <Platform Name="Android64"> 220 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 221 | <Operation>1</Operation> 222 | </Platform> 223 | </DeployClass> 224 | <DeployClass Name="AndroidSplashImageDef"> 225 | <Platform Name="Android"> 226 | <RemoteDir>res\drawable</RemoteDir> 227 | <Operation>1</Operation> 228 | </Platform> 229 | <Platform Name="Android64"> 230 | <RemoteDir>res\drawable</RemoteDir> 231 | <Operation>1</Operation> 232 | </Platform> 233 | </DeployClass> 234 | <DeployClass Name="AndroidSplashStyles"> 235 | <Platform Name="Android"> 236 | <RemoteDir>res\values</RemoteDir> 237 | <Operation>1</Operation> 238 | </Platform> 239 | <Platform Name="Android64"> 240 | <RemoteDir>res\values</RemoteDir> 241 | <Operation>1</Operation> 242 | </Platform> 243 | </DeployClass> 244 | <DeployClass Name="AndroidSplashStylesV21"> 245 | <Platform Name="Android"> 246 | <RemoteDir>res\values-v21</RemoteDir> 247 | <Operation>1</Operation> 248 | </Platform> 249 | <Platform Name="Android64"> 250 | <RemoteDir>res\values-v21</RemoteDir> 251 | <Operation>1</Operation> 252 | </Platform> 253 | </DeployClass> 254 | <DeployClass Name="Android_Colors"> 255 | <Platform Name="Android"> 256 | <RemoteDir>res\values</RemoteDir> 257 | <Operation>1</Operation> 258 | </Platform> 259 | <Platform Name="Android64"> 260 | <RemoteDir>res\values</RemoteDir> 261 | <Operation>1</Operation> 262 | </Platform> 263 | </DeployClass> 264 | <DeployClass Name="Android_DefaultAppIcon"> 265 | <Platform Name="Android"> 266 | <RemoteDir>res\drawable</RemoteDir> 267 | <Operation>1</Operation> 268 | </Platform> 269 | <Platform Name="Android64"> 270 | <RemoteDir>res\drawable</RemoteDir> 271 | <Operation>1</Operation> 272 | </Platform> 273 | </DeployClass> 274 | <DeployClass Name="Android_LauncherIcon144"> 275 | <Platform Name="Android"> 276 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 277 | <Operation>1</Operation> 278 | </Platform> 279 | <Platform Name="Android64"> 280 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 281 | <Operation>1</Operation> 282 | </Platform> 283 | </DeployClass> 284 | <DeployClass Name="Android_LauncherIcon192"> 285 | <Platform Name="Android"> 286 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 287 | <Operation>1</Operation> 288 | </Platform> 289 | <Platform Name="Android64"> 290 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 291 | <Operation>1</Operation> 292 | </Platform> 293 | </DeployClass> 294 | <DeployClass Name="Android_LauncherIcon36"> 295 | <Platform Name="Android"> 296 | <RemoteDir>res\drawable-ldpi</RemoteDir> 297 | <Operation>1</Operation> 298 | </Platform> 299 | <Platform Name="Android64"> 300 | <RemoteDir>res\drawable-ldpi</RemoteDir> 301 | <Operation>1</Operation> 302 | </Platform> 303 | </DeployClass> 304 | <DeployClass Name="Android_LauncherIcon48"> 305 | <Platform Name="Android"> 306 | <RemoteDir>res\drawable-mdpi</RemoteDir> 307 | <Operation>1</Operation> 308 | </Platform> 309 | <Platform Name="Android64"> 310 | <RemoteDir>res\drawable-mdpi</RemoteDir> 311 | <Operation>1</Operation> 312 | </Platform> 313 | </DeployClass> 314 | <DeployClass Name="Android_LauncherIcon72"> 315 | <Platform Name="Android"> 316 | <RemoteDir>res\drawable-hdpi</RemoteDir> 317 | <Operation>1</Operation> 318 | </Platform> 319 | <Platform Name="Android64"> 320 | <RemoteDir>res\drawable-hdpi</RemoteDir> 321 | <Operation>1</Operation> 322 | </Platform> 323 | </DeployClass> 324 | <DeployClass Name="Android_LauncherIcon96"> 325 | <Platform Name="Android"> 326 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 327 | <Operation>1</Operation> 328 | </Platform> 329 | <Platform Name="Android64"> 330 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 331 | <Operation>1</Operation> 332 | </Platform> 333 | </DeployClass> 334 | <DeployClass Name="Android_NotificationIcon24"> 335 | <Platform Name="Android"> 336 | <RemoteDir>res\drawable-mdpi</RemoteDir> 337 | <Operation>1</Operation> 338 | </Platform> 339 | <Platform Name="Android64"> 340 | <RemoteDir>res\drawable-mdpi</RemoteDir> 341 | <Operation>1</Operation> 342 | </Platform> 343 | </DeployClass> 344 | <DeployClass Name="Android_NotificationIcon36"> 345 | <Platform Name="Android"> 346 | <RemoteDir>res\drawable-hdpi</RemoteDir> 347 | <Operation>1</Operation> 348 | </Platform> 349 | <Platform Name="Android64"> 350 | <RemoteDir>res\drawable-hdpi</RemoteDir> 351 | <Operation>1</Operation> 352 | </Platform> 353 | </DeployClass> 354 | <DeployClass Name="Android_NotificationIcon48"> 355 | <Platform Name="Android"> 356 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 357 | <Operation>1</Operation> 358 | </Platform> 359 | <Platform Name="Android64"> 360 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 361 | <Operation>1</Operation> 362 | </Platform> 363 | </DeployClass> 364 | <DeployClass Name="Android_NotificationIcon72"> 365 | <Platform Name="Android"> 366 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 367 | <Operation>1</Operation> 368 | </Platform> 369 | <Platform Name="Android64"> 370 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 371 | <Operation>1</Operation> 372 | </Platform> 373 | </DeployClass> 374 | <DeployClass Name="Android_NotificationIcon96"> 375 | <Platform Name="Android"> 376 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 377 | <Operation>1</Operation> 378 | </Platform> 379 | <Platform Name="Android64"> 380 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 381 | <Operation>1</Operation> 382 | </Platform> 383 | </DeployClass> 384 | <DeployClass Name="Android_SplashImage426"> 385 | <Platform Name="Android"> 386 | <RemoteDir>res\drawable-small</RemoteDir> 387 | <Operation>1</Operation> 388 | </Platform> 389 | <Platform Name="Android64"> 390 | <RemoteDir>res\drawable-small</RemoteDir> 391 | <Operation>1</Operation> 392 | </Platform> 393 | </DeployClass> 394 | <DeployClass Name="Android_SplashImage470"> 395 | <Platform Name="Android"> 396 | <RemoteDir>res\drawable-normal</RemoteDir> 397 | <Operation>1</Operation> 398 | </Platform> 399 | <Platform Name="Android64"> 400 | <RemoteDir>res\drawable-normal</RemoteDir> 401 | <Operation>1</Operation> 402 | </Platform> 403 | </DeployClass> 404 | <DeployClass Name="Android_SplashImage640"> 405 | <Platform Name="Android"> 406 | <RemoteDir>res\drawable-large</RemoteDir> 407 | <Operation>1</Operation> 408 | </Platform> 409 | <Platform Name="Android64"> 410 | <RemoteDir>res\drawable-large</RemoteDir> 411 | <Operation>1</Operation> 412 | </Platform> 413 | </DeployClass> 414 | <DeployClass Name="Android_SplashImage960"> 415 | <Platform Name="Android"> 416 | <RemoteDir>res\drawable-xlarge</RemoteDir> 417 | <Operation>1</Operation> 418 | </Platform> 419 | <Platform Name="Android64"> 420 | <RemoteDir>res\drawable-xlarge</RemoteDir> 421 | <Operation>1</Operation> 422 | </Platform> 423 | </DeployClass> 424 | <DeployClass Name="Android_Strings"> 425 | <Platform Name="Android"> 426 | <RemoteDir>res\values</RemoteDir> 427 | <Operation>1</Operation> 428 | </Platform> 429 | <Platform Name="Android64"> 430 | <RemoteDir>res\values</RemoteDir> 431 | <Operation>1</Operation> 432 | </Platform> 433 | </DeployClass> 434 | <DeployClass Name="DebugSymbols"> 435 | <Platform Name="iOSSimulator"> 436 | <Operation>1</Operation> 437 | </Platform> 438 | <Platform Name="OSX32"> 439 | <RemoteDir>Contents\MacOS</RemoteDir> 440 | <Operation>1</Operation> 441 | </Platform> 442 | <Platform Name="Win32"> 443 | <Operation>0</Operation> 444 | </Platform> 445 | </DeployClass> 446 | <DeployClass Name="DependencyFramework"> 447 | <Platform Name="OSX32"> 448 | <RemoteDir>Contents\MacOS</RemoteDir> 449 | <Operation>1</Operation> 450 | <Extensions>.framework</Extensions> 451 | </Platform> 452 | <Platform Name="OSX64"> 453 | <RemoteDir>Contents\MacOS</RemoteDir> 454 | <Operation>1</Operation> 455 | <Extensions>.framework</Extensions> 456 | </Platform> 457 | <Platform Name="OSXARM64"> 458 | <RemoteDir>Contents\MacOS</RemoteDir> 459 | <Operation>1</Operation> 460 | <Extensions>.framework</Extensions> 461 | </Platform> 462 | <Platform Name="Win32"> 463 | <Operation>0</Operation> 464 | </Platform> 465 | </DeployClass> 466 | <DeployClass Name="DependencyModule"> 467 | <Platform Name="iOSDevice32"> 468 | <Operation>1</Operation> 469 | <Extensions>.dylib</Extensions> 470 | </Platform> 471 | <Platform Name="iOSDevice64"> 472 | <Operation>1</Operation> 473 | <Extensions>.dylib</Extensions> 474 | </Platform> 475 | <Platform Name="iOSSimulator"> 476 | <Operation>1</Operation> 477 | <Extensions>.dylib</Extensions> 478 | </Platform> 479 | <Platform Name="OSX32"> 480 | <RemoteDir>Contents\MacOS</RemoteDir> 481 | <Operation>1</Operation> 482 | <Extensions>.dylib</Extensions> 483 | </Platform> 484 | <Platform Name="OSX64"> 485 | <RemoteDir>Contents\MacOS</RemoteDir> 486 | <Operation>1</Operation> 487 | <Extensions>.dylib</Extensions> 488 | </Platform> 489 | <Platform Name="OSXARM64"> 490 | <RemoteDir>Contents\MacOS</RemoteDir> 491 | <Operation>1</Operation> 492 | <Extensions>.dylib</Extensions> 493 | </Platform> 494 | <Platform Name="Win32"> 495 | <Operation>0</Operation> 496 | <Extensions>.dll;.bpl</Extensions> 497 | </Platform> 498 | </DeployClass> 499 | <DeployClass Required="true" Name="DependencyPackage"> 500 | <Platform Name="iOSDevice32"> 501 | <Operation>1</Operation> 502 | <Extensions>.dylib</Extensions> 503 | </Platform> 504 | <Platform Name="iOSDevice64"> 505 | <Operation>1</Operation> 506 | <Extensions>.dylib</Extensions> 507 | </Platform> 508 | <Platform Name="iOSSimulator"> 509 | <Operation>1</Operation> 510 | <Extensions>.dylib</Extensions> 511 | </Platform> 512 | <Platform Name="OSX32"> 513 | <RemoteDir>Contents\MacOS</RemoteDir> 514 | <Operation>1</Operation> 515 | <Extensions>.dylib</Extensions> 516 | </Platform> 517 | <Platform Name="OSX64"> 518 | <RemoteDir>Contents\MacOS</RemoteDir> 519 | <Operation>1</Operation> 520 | <Extensions>.dylib</Extensions> 521 | </Platform> 522 | <Platform Name="OSXARM64"> 523 | <RemoteDir>Contents\MacOS</RemoteDir> 524 | <Operation>1</Operation> 525 | <Extensions>.dylib</Extensions> 526 | </Platform> 527 | <Platform Name="Win32"> 528 | <Operation>0</Operation> 529 | <Extensions>.bpl</Extensions> 530 | </Platform> 531 | </DeployClass> 532 | <DeployClass Name="File"> 533 | <Platform Name="Android"> 534 | <Operation>0</Operation> 535 | </Platform> 536 | <Platform Name="Android64"> 537 | <Operation>0</Operation> 538 | </Platform> 539 | <Platform Name="iOSDevice32"> 540 | <Operation>0</Operation> 541 | </Platform> 542 | <Platform Name="iOSDevice64"> 543 | <Operation>0</Operation> 544 | </Platform> 545 | <Platform Name="iOSSimulator"> 546 | <Operation>0</Operation> 547 | </Platform> 548 | <Platform Name="OSX32"> 549 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 550 | <Operation>0</Operation> 551 | </Platform> 552 | <Platform Name="OSX64"> 553 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 554 | <Operation>0</Operation> 555 | </Platform> 556 | <Platform Name="OSXARM64"> 557 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 558 | <Operation>0</Operation> 559 | </Platform> 560 | <Platform Name="Win32"> 561 | <Operation>0</Operation> 562 | </Platform> 563 | </DeployClass> 564 | <DeployClass Name="iOS_AppStore1024"> 565 | <Platform Name="iOSDevice64"> 566 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 567 | <Operation>1</Operation> 568 | </Platform> 569 | </DeployClass> 570 | <DeployClass Name="iPad_AppIcon152"> 571 | <Platform Name="iOSDevice64"> 572 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 573 | <Operation>1</Operation> 574 | </Platform> 575 | <Platform Name="iOSSimulator"> 576 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 577 | <Operation>1</Operation> 578 | </Platform> 579 | </DeployClass> 580 | <DeployClass Name="iPad_AppIcon167"> 581 | <Platform Name="iOSDevice64"> 582 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 583 | <Operation>1</Operation> 584 | </Platform> 585 | <Platform Name="iOSSimulator"> 586 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 587 | <Operation>1</Operation> 588 | </Platform> 589 | </DeployClass> 590 | <DeployClass Name="iPad_Launch2x"> 591 | <Platform Name="iOSDevice64"> 592 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 593 | <Operation>1</Operation> 594 | </Platform> 595 | <Platform Name="iOSSimulator"> 596 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 597 | <Operation>1</Operation> 598 | </Platform> 599 | </DeployClass> 600 | <DeployClass Name="iPad_LaunchDark2x"> 601 | <Platform Name="iOSDevice64"> 602 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 603 | <Operation>1</Operation> 604 | </Platform> 605 | <Platform Name="iOSSimulator"> 606 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 607 | <Operation>1</Operation> 608 | </Platform> 609 | </DeployClass> 610 | <DeployClass Name="iPad_Notification40"> 611 | <Platform Name="iOSDevice64"> 612 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 613 | <Operation>1</Operation> 614 | </Platform> 615 | <Platform Name="iOSSimulator"> 616 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 617 | <Operation>1</Operation> 618 | </Platform> 619 | </DeployClass> 620 | <DeployClass Name="iPad_Setting58"> 621 | <Platform Name="iOSDevice64"> 622 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 623 | <Operation>1</Operation> 624 | </Platform> 625 | <Platform Name="iOSSimulator"> 626 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 627 | <Operation>1</Operation> 628 | </Platform> 629 | </DeployClass> 630 | <DeployClass Name="iPad_SpotLight80"> 631 | <Platform Name="iOSDevice64"> 632 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 633 | <Operation>1</Operation> 634 | </Platform> 635 | <Platform Name="iOSSimulator"> 636 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 637 | <Operation>1</Operation> 638 | </Platform> 639 | </DeployClass> 640 | <DeployClass Name="iPhone_AppIcon120"> 641 | <Platform Name="iOSDevice64"> 642 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 643 | <Operation>1</Operation> 644 | </Platform> 645 | <Platform Name="iOSSimulator"> 646 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 647 | <Operation>1</Operation> 648 | </Platform> 649 | </DeployClass> 650 | <DeployClass Name="iPhone_AppIcon180"> 651 | <Platform Name="iOSDevice64"> 652 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 653 | <Operation>1</Operation> 654 | </Platform> 655 | <Platform Name="iOSSimulator"> 656 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 657 | <Operation>1</Operation> 658 | </Platform> 659 | </DeployClass> 660 | <DeployClass Name="iPhone_Launch2x"> 661 | <Platform Name="iOSDevice64"> 662 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 663 | <Operation>1</Operation> 664 | </Platform> 665 | <Platform Name="iOSSimulator"> 666 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 667 | <Operation>1</Operation> 668 | </Platform> 669 | </DeployClass> 670 | <DeployClass Name="iPhone_Launch3x"> 671 | <Platform Name="iOSDevice64"> 672 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 673 | <Operation>1</Operation> 674 | </Platform> 675 | <Platform Name="iOSSimulator"> 676 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 677 | <Operation>1</Operation> 678 | </Platform> 679 | </DeployClass> 680 | <DeployClass Name="iPhone_LaunchDark2x"> 681 | <Platform Name="iOSDevice64"> 682 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 683 | <Operation>1</Operation> 684 | </Platform> 685 | <Platform Name="iOSSimulator"> 686 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 687 | <Operation>1</Operation> 688 | </Platform> 689 | </DeployClass> 690 | <DeployClass Name="iPhone_LaunchDark3x"> 691 | <Platform Name="iOSDevice64"> 692 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 693 | <Operation>1</Operation> 694 | </Platform> 695 | <Platform Name="iOSSimulator"> 696 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 697 | <Operation>1</Operation> 698 | </Platform> 699 | </DeployClass> 700 | <DeployClass Name="iPhone_Notification40"> 701 | <Platform Name="iOSDevice64"> 702 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 703 | <Operation>1</Operation> 704 | </Platform> 705 | <Platform Name="iOSSimulator"> 706 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 707 | <Operation>1</Operation> 708 | </Platform> 709 | </DeployClass> 710 | <DeployClass Name="iPhone_Notification60"> 711 | <Platform Name="iOSDevice64"> 712 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 713 | <Operation>1</Operation> 714 | </Platform> 715 | <Platform Name="iOSSimulator"> 716 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 717 | <Operation>1</Operation> 718 | </Platform> 719 | </DeployClass> 720 | <DeployClass Name="iPhone_Setting58"> 721 | <Platform Name="iOSDevice64"> 722 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 723 | <Operation>1</Operation> 724 | </Platform> 725 | <Platform Name="iOSSimulator"> 726 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 727 | <Operation>1</Operation> 728 | </Platform> 729 | </DeployClass> 730 | <DeployClass Name="iPhone_Setting87"> 731 | <Platform Name="iOSDevice64"> 732 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 733 | <Operation>1</Operation> 734 | </Platform> 735 | <Platform Name="iOSSimulator"> 736 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 737 | <Operation>1</Operation> 738 | </Platform> 739 | </DeployClass> 740 | <DeployClass Name="iPhone_Spotlight120"> 741 | <Platform Name="iOSDevice64"> 742 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 743 | <Operation>1</Operation> 744 | </Platform> 745 | <Platform Name="iOSSimulator"> 746 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 747 | <Operation>1</Operation> 748 | </Platform> 749 | </DeployClass> 750 | <DeployClass Name="iPhone_Spotlight80"> 751 | <Platform Name="iOSDevice64"> 752 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 753 | <Operation>1</Operation> 754 | </Platform> 755 | <Platform Name="iOSSimulator"> 756 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 757 | <Operation>1</Operation> 758 | </Platform> 759 | </DeployClass> 760 | <DeployClass Name="ProjectAndroidManifest"> 761 | <Platform Name="Android"> 762 | <Operation>1</Operation> 763 | </Platform> 764 | <Platform Name="Android64"> 765 | <Operation>1</Operation> 766 | </Platform> 767 | </DeployClass> 768 | <DeployClass Name="ProjectiOSDeviceDebug"> 769 | <Platform Name="iOSDevice32"> 770 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 771 | <Operation>1</Operation> 772 | </Platform> 773 | <Platform Name="iOSDevice64"> 774 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 775 | <Operation>1</Operation> 776 | </Platform> 777 | </DeployClass> 778 | <DeployClass Name="ProjectiOSEntitlements"> 779 | <Platform Name="iOSDevice32"> 780 | <RemoteDir>..\</RemoteDir> 781 | <Operation>1</Operation> 782 | </Platform> 783 | <Platform Name="iOSDevice64"> 784 | <RemoteDir>..\</RemoteDir> 785 | <Operation>1</Operation> 786 | </Platform> 787 | </DeployClass> 788 | <DeployClass Name="ProjectiOSInfoPList"> 789 | <Platform Name="iOSDevice32"> 790 | <Operation>1</Operation> 791 | </Platform> 792 | <Platform Name="iOSDevice64"> 793 | <Operation>1</Operation> 794 | </Platform> 795 | <Platform Name="iOSSimulator"> 796 | <Operation>1</Operation> 797 | </Platform> 798 | </DeployClass> 799 | <DeployClass Name="ProjectiOSLaunchScreen"> 800 | <Platform Name="iOSDevice64"> 801 | <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir> 802 | <Operation>64</Operation> 803 | </Platform> 804 | <Platform Name="iOSSimulator"> 805 | <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir> 806 | <Operation>64</Operation> 807 | </Platform> 808 | </DeployClass> 809 | <DeployClass Name="ProjectiOSResource"> 810 | <Platform Name="iOSDevice32"> 811 | <Operation>1</Operation> 812 | </Platform> 813 | <Platform Name="iOSDevice64"> 814 | <Operation>1</Operation> 815 | </Platform> 816 | <Platform Name="iOSSimulator"> 817 | <Operation>1</Operation> 818 | </Platform> 819 | </DeployClass> 820 | <DeployClass Name="ProjectOSXDebug"> 821 | <Platform Name="OSX64"> 822 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 823 | <Operation>1</Operation> 824 | </Platform> 825 | <Platform Name="OSXARM64"> 826 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 827 | <Operation>1</Operation> 828 | </Platform> 829 | </DeployClass> 830 | <DeployClass Name="ProjectOSXEntitlements"> 831 | <Platform Name="OSX32"> 832 | <RemoteDir>..\</RemoteDir> 833 | <Operation>1</Operation> 834 | </Platform> 835 | <Platform Name="OSX64"> 836 | <RemoteDir>..\</RemoteDir> 837 | <Operation>1</Operation> 838 | </Platform> 839 | <Platform Name="OSXARM64"> 840 | <RemoteDir>..\</RemoteDir> 841 | <Operation>1</Operation> 842 | </Platform> 843 | </DeployClass> 844 | <DeployClass Name="ProjectOSXInfoPList"> 845 | <Platform Name="OSX32"> 846 | <RemoteDir>Contents</RemoteDir> 847 | <Operation>1</Operation> 848 | </Platform> 849 | <Platform Name="OSX64"> 850 | <RemoteDir>Contents</RemoteDir> 851 | <Operation>1</Operation> 852 | </Platform> 853 | <Platform Name="OSXARM64"> 854 | <RemoteDir>Contents</RemoteDir> 855 | <Operation>1</Operation> 856 | </Platform> 857 | </DeployClass> 858 | <DeployClass Name="ProjectOSXResource"> 859 | <Platform Name="OSX32"> 860 | <RemoteDir>Contents\Resources</RemoteDir> 861 | <Operation>1</Operation> 862 | </Platform> 863 | <Platform Name="OSX64"> 864 | <RemoteDir>Contents\Resources</RemoteDir> 865 | <Operation>1</Operation> 866 | </Platform> 867 | <Platform Name="OSXARM64"> 868 | <RemoteDir>Contents\Resources</RemoteDir> 869 | <Operation>1</Operation> 870 | </Platform> 871 | </DeployClass> 872 | <DeployClass Required="true" Name="ProjectOutput"> 873 | <Platform Name="Android"> 874 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 875 | <Operation>1</Operation> 876 | </Platform> 877 | <Platform Name="Android64"> 878 | <RemoteDir>library\lib\arm64-v8a</RemoteDir> 879 | <Operation>1</Operation> 880 | </Platform> 881 | <Platform Name="iOSDevice32"> 882 | <Operation>1</Operation> 883 | </Platform> 884 | <Platform Name="iOSDevice64"> 885 | <Operation>1</Operation> 886 | </Platform> 887 | <Platform Name="iOSSimulator"> 888 | <Operation>1</Operation> 889 | </Platform> 890 | <Platform Name="Linux64"> 891 | <Operation>1</Operation> 892 | </Platform> 893 | <Platform Name="OSX32"> 894 | <RemoteDir>Contents\MacOS</RemoteDir> 895 | <Operation>1</Operation> 896 | </Platform> 897 | <Platform Name="OSX64"> 898 | <RemoteDir>Contents\MacOS</RemoteDir> 899 | <Operation>1</Operation> 900 | </Platform> 901 | <Platform Name="OSXARM64"> 902 | <RemoteDir>Contents\MacOS</RemoteDir> 903 | <Operation>1</Operation> 904 | </Platform> 905 | <Platform Name="Win32"> 906 | <Operation>0</Operation> 907 | </Platform> 908 | </DeployClass> 909 | <DeployClass Name="ProjectOutput_Android32"> 910 | <Platform Name="Android64"> 911 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 912 | <Operation>1</Operation> 913 | </Platform> 914 | </DeployClass> 915 | <DeployClass Name="ProjectUWPManifest"> 916 | <Platform Name="Win32"> 917 | <Operation>1</Operation> 918 | </Platform> 919 | <Platform Name="Win64"> 920 | <Operation>1</Operation> 921 | </Platform> 922 | </DeployClass> 923 | <DeployClass Name="UWP_DelphiLogo150"> 924 | <Platform Name="Win32"> 925 | <RemoteDir>Assets</RemoteDir> 926 | <Operation>1</Operation> 927 | </Platform> 928 | <Platform Name="Win64"> 929 | <RemoteDir>Assets</RemoteDir> 930 | <Operation>1</Operation> 931 | </Platform> 932 | </DeployClass> 933 | <DeployClass Name="UWP_DelphiLogo44"> 934 | <Platform Name="Win32"> 935 | <RemoteDir>Assets</RemoteDir> 936 | <Operation>1</Operation> 937 | </Platform> 938 | <Platform Name="Win64"> 939 | <RemoteDir>Assets</RemoteDir> 940 | <Operation>1</Operation> 941 | </Platform> 942 | </DeployClass> 943 | <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/> 944 | <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/> 945 | <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> 946 | <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> 947 | <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/> 948 | <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> 949 | <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> 950 | <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> 951 | <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> 952 | <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> 953 | <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> 954 | </Deployment> 955 | <Platforms> 956 | <Platform value="Win32">True</Platform> 957 | <Platform value="Win64">False</Platform> 958 | </Platforms> 959 | </BorlandProject> 960 | <ProjectFileVersion>12</ProjectFileVersion> 961 | </ProjectExtensions> 962 | <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> 963 | <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> 964 | <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> 965 | </Project> 966 | -------------------------------------------------------------------------------- /MathParserProj.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/turborium/SimpleMathParser/fad92031d6cf1b17df11461f626ddf1db220b776/MathParserProj.exe -------------------------------------------------------------------------------- /MathParserProj.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/turborium/SimpleMathParser/fad92031d6cf1b17df11461f626ddf1db220b776/MathParserProj.res -------------------------------------------------------------------------------- /ProjectGroup.groupproj: -------------------------------------------------------------------------------- 1 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 | <PropertyGroup> 3 | <ProjectGuid>{63D66E36-A567-4E90-9F27-8C102C408F45}</ProjectGuid> 4 | </PropertyGroup> 5 | <ItemGroup> 6 | <Projects Include="MathParserProj.dproj"> 7 | <Dependencies/> 8 | </Projects> 9 | <Projects Include="Tests\Tests.dproj"> 10 | <Dependencies/> 11 | </Projects> 12 | </ItemGroup> 13 | <ProjectExtensions> 14 | <Borland.Personality>Default.Personality.12</Borland.Personality> 15 | <Borland.ProjectType/> 16 | <BorlandProject> 17 | <Default.Personality/> 18 | </BorlandProject> 19 | </ProjectExtensions> 20 | <Target Name="MathParserProj"> 21 | <MSBuild Projects="MathParserProj.dproj"/> 22 | </Target> 23 | <Target Name="MathParserProj:Clean"> 24 | <MSBuild Projects="MathParserProj.dproj" Targets="Clean"/> 25 | </Target> 26 | <Target Name="MathParserProj:Make"> 27 | <MSBuild Projects="MathParserProj.dproj" Targets="Make"/> 28 | </Target> 29 | <Target Name="Tests"> 30 | <MSBuild Projects="Tests\Tests.dproj"/> 31 | </Target> 32 | <Target Name="Tests:Clean"> 33 | <MSBuild Projects="Tests\Tests.dproj" Targets="Clean"/> 34 | </Target> 35 | <Target Name="Tests:Make"> 36 | <MSBuild Projects="Tests\Tests.dproj" Targets="Make"/> 37 | </Target> 38 | <Target Name="Build"> 39 | <CallTarget Targets="MathParserProj;Tests"/> 40 | </Target> 41 | <Target Name="Clean"> 42 | <CallTarget Targets="MathParserProj:Clean;Tests:Clean"/> 43 | </Target> 44 | <Target Name="Make"> 45 | <CallTarget Targets="MathParserProj:Make;Tests:Make"/> 46 | </Target> 47 | <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/> 48 | </Project> 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SimpleMathParser 2 | 3 | ## Максимально простой и понтяный парсер с леворекурсивным спуском 4 | 5 | ![scr](scr.png) 6 | -------------------------------------------------------------------------------- /Tests/MathParserTest.pas: -------------------------------------------------------------------------------- 1 | unit MathParserTest; 2 | 3 | interface 4 | 5 | uses 6 | DUnitX.TestFramework, MathParser, SysUtils, StrUtils; 7 | 8 | type 9 | [TestFixture] 10 | TMathParserTest = class 11 | private 12 | Parser: TMathParser; 13 | public 14 | [Setup] 15 | procedure Setup; 16 | [TearDown] 17 | procedure TearDown; 18 | // Test with TestCase Attribute to supply parameters. 19 | 20 | [Test] 21 | [TestCase('Plus1','1+1;2',';')] 22 | [TestCase('Plus2','1000+0;1000',';')] 23 | [TestCase('Plus3','1+10;11',';')] 24 | [TestCase('Plus4','1+1+1;3',';')] 25 | [TestCase('PlusMinus','10-100+50-40-2;-82',';')] 26 | [TestCase('--','5--10-12;3',';')] 27 | [TestCase('++','5++++2;7',';')] 28 | [TestCase('Mul1','100*10;1000',';')] 29 | [TestCase('Mul2','10-10*10;-90',';')] 30 | [TestCase('Mul3','10*2*3;60',';')] 31 | [TestCase('div1','1000/10;100',';')] 32 | [TestCase('div2','10+100/10;20',';')] 33 | [TestCase('div3','1000/10/2;50',';')] 34 | [TestCase('bracket1','(10-5)*2;10',';')] 35 | [TestCase('bracket2','2*((10-5)*2);20',';')] 36 | [TestCase('bracket3','2*(10-5);10',';')] 37 | [TestCase('bracket4','10-(10+10);-10',';')] 38 | [TestCase('bracket5','(3*-(-((-2))))-(0)--9+++++9;12',';')] 39 | [TestCase('functions1','log(log(8)/log(2))/1/(-(-(log(log(8)/log(2)))));1',';')] 40 | [TestCase('Power','2^3^4;2417851639229258349412352',';')] 41 | procedure TestBase(const Expression: string; const Ans: Double); 42 | 43 | [Test] 44 | [TestCase('empty expression',';0',';')] 45 | [TestCase('unexpected end 1','1 + 1 + ;10',';')] 46 | [TestCase('unexpected end 2','1 + ;6',';')] 47 | [TestCase('unexpected operation',' + ;5',';')] 48 | [TestCase('expected number','3 * * 9;9',';')] 49 | [TestCase('* _',' * 9;3',';')] 50 | [TestCase('no op','543253 345 345 34;7',';')] 51 | [TestCase('no op2','1 -2 -3 4;8',';')] 52 | [TestCase('brackets1','(3(+2));2',';')] 53 | [TestCase('brackets2',')(;0',';')] 54 | [TestCase('brackets3','();1',';')] 55 | [TestCase('brackets4','((23)-(23)3)-(33));10',';')] 56 | [TestCase('brackets5','(3));3',';')] 57 | [TestCase('brackets6','((3);4',';')] 58 | procedure TestExceptions(const Expression: string; const ErrorPosionon: Integer); 59 | end; 60 | 61 | implementation 62 | 63 | procedure TMathParserTest.Setup; 64 | begin 65 | Parser := TMathParser.Create; 66 | end; 67 | 68 | procedure TMathParserTest.TearDown; 69 | begin 70 | Parser.Free; 71 | end; 72 | 73 | procedure TMathParserTest.TestBase(const Expression: string; const Ans: Double); 74 | begin 75 | Parser.Expression := Expression; 76 | Assert.AreEqual(Ans, Parser.Calculate); 77 | end; 78 | 79 | procedure TMathParserTest.TestExceptions(const Expression: string; const ErrorPosionon: Integer); 80 | var 81 | Visualize: string; 82 | begin 83 | Parser.Expression := Expression; 84 | try 85 | Parser.Calculate; 86 | except 87 | on E: EParserError do 88 | begin 89 | Visualize := '"' + Parser.Expression + '_"' + #13; 90 | Visualize := Visualize + ' ' + DupeString(' ', E.Position) + '^'; 91 | 92 | 93 | Assert.AreEqual(ErrorPosionon, E.Position, {'Expected: ' + IntToStr(ErrorPosionon) + 94 | ', actual: ' + IntToStr(E.Position) + ', message: ' +} E.Message + #13 + visualize); 95 | Exit; 96 | end; 97 | end; 98 | Assert.Fail('Error in "' + Expression + '" not found!'); 99 | end; 100 | 101 | initialization 102 | TDUnitX.RegisterTestFixture(TMathParserTest); 103 | 104 | end. 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /Tests/Tests.dpr: -------------------------------------------------------------------------------- 1 | program Tests; 2 | 3 | {$IFNDEF TESTINSIGHT} 4 | {$APPTYPE CONSOLE} 5 | {$ENDIF} 6 | {$STRONGLINKTYPES ON} 7 | uses 8 | System.SysUtils, 9 | {$IFDEF TESTINSIGHT} 10 | TestInsight.DUnitX, 11 | {$ELSE} 12 | DUnitX.Loggers.Console, 13 | DUnitX.Loggers.Xml.NUnit, 14 | {$ENDIF } 15 | DUnitX.TestFramework, 16 | MathParserTest in 'MathParserTest.pas', 17 | MathParser in '..\MathParser.pas'; 18 | 19 | {$IFNDEF TESTINSIGHT} 20 | var 21 | runner: ITestRunner; 22 | results: IRunResults; 23 | logger: ITestLogger; 24 | nunitLogger : ITestLogger; 25 | {$ENDIF} 26 | begin 27 | {$IFDEF TESTINSIGHT} 28 | TestInsight.DUnitX.RunRegisteredTests; 29 | {$ELSE} 30 | try 31 | //Check command line options, will exit if invalid 32 | TDUnitX.CheckCommandLine; 33 | //Create the test runner 34 | runner := TDUnitX.CreateRunner; 35 | //Tell the runner to use RTTI to find Fixtures 36 | runner.UseRTTI := True; 37 | //When true, Assertions must be made during tests; 38 | runner.FailsOnNoAsserts := False; 39 | 40 | //tell the runner how we will log things 41 | //Log to the console window if desired 42 | if TDUnitX.Options.ConsoleMode <> TDunitXConsoleMode.Off then 43 | begin 44 | logger := TDUnitXConsoleLogger.Create(TDUnitX.Options.ConsoleMode = TDunitXConsoleMode.Quiet); 45 | runner.AddLogger(logger); 46 | end; 47 | //Generate an NUnit compatible XML File 48 | nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); 49 | runner.AddLogger(nunitLogger); 50 | 51 | //Run tests 52 | results := runner.Execute; 53 | if not results.AllPassed then 54 | System.ExitCode := EXIT_ERRORS; 55 | 56 | {$IFNDEF CI} 57 | //We don't want this happening when running under CI. 58 | if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then 59 | begin 60 | System.Write('Done.. press <Enter> key to quit.'); 61 | System.Readln; 62 | end; 63 | {$ENDIF} 64 | except 65 | on E: Exception do 66 | System.Writeln(E.ClassName, ': ', E.Message); 67 | end; 68 | {$ENDIF} 69 | end. 70 | -------------------------------------------------------------------------------- /Tests/Tests.dproj: -------------------------------------------------------------------------------- 1 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 | <PropertyGroup> 3 | <ProjectGuid>{1B0A8394-899C-42D1-BDE2-2CFFEED1AB33}</ProjectGuid> 4 | <ProjectVersion>19.3</ProjectVersion> 5 | <FrameworkType>None</FrameworkType> 6 | <Base>True</Base> 7 | <Config Condition="'$(Config)'==''">Debug</Config> 8 | <Platform Condition="'$(Platform)'==''">Win32</Platform> 9 | <TargetedPlatforms>1</TargetedPlatforms> 10 | <AppType>Console</AppType> 11 | <MainSource>Tests.dpr</MainSource> 12 | </PropertyGroup> 13 | <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> 14 | <Base>true</Base> 15 | </PropertyGroup> 16 | <PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''"> 17 | <Base_Android>true</Base_Android> 18 | <CfgParent>Base</CfgParent> 19 | <Base>true</Base> 20 | </PropertyGroup> 21 | <PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''"> 22 | <Base_Android64>true</Base_Android64> 23 | <CfgParent>Base</CfgParent> 24 | <Base>true</Base> 25 | </PropertyGroup> 26 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> 27 | <Base_Win32>true</Base_Win32> 28 | <CfgParent>Base</CfgParent> 29 | <Base>true</Base> 30 | </PropertyGroup> 31 | <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''"> 32 | <Base_Win64>true</Base_Win64> 33 | <CfgParent>Base</CfgParent> 34 | <Base>true</Base> 35 | </PropertyGroup> 36 | <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''"> 37 | <Cfg_1>true</Cfg_1> 38 | <CfgParent>Base</CfgParent> 39 | <Base>true</Base> 40 | </PropertyGroup> 41 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''"> 42 | <Cfg_1_Win32>true</Cfg_1_Win32> 43 | <CfgParent>Cfg_1</CfgParent> 44 | <Cfg_1>true</Cfg_1> 45 | <Base>true</Base> 46 | </PropertyGroup> 47 | <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''"> 48 | <Cfg_2>true</Cfg_2> 49 | <CfgParent>Base</CfgParent> 50 | <Base>true</Base> 51 | </PropertyGroup> 52 | <PropertyGroup Condition="'$(Base)'!=''"> 53 | <DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput> 54 | <DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput> 55 | <DCC_E>false</DCC_E> 56 | <DCC_N>false</DCC_N> 57 | <DCC_S>false</DCC_S> 58 | <DCC_F>false</DCC_F> 59 | <DCC_K>false</DCC_K> 60 | <DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace> 61 | <UsingDelphiRTL>true</UsingDelphiRTL> 62 | <Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon> 63 | <Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns> 64 | <DCC_UnitSearchPath>$(DUnitX);$(DCC_UnitSearchPath)</DCC_UnitSearchPath> 65 | <SanitizedProjectName>Tests</SanitizedProjectName> 66 | </PropertyGroup> 67 | <PropertyGroup Condition="'$(Base_Android)'!=''"> 68 | <DCC_UsePackage>fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;ibmonitor;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;ibxbindings;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;ibxpress;dsnap;CloudService;FMXTee;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 69 | <EnabledSysJars>annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar</EnabledSysJars> 70 | </PropertyGroup> 71 | <PropertyGroup Condition="'$(Base_Android64)'!=''"> 72 | <DCC_UsePackage>fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;ibmonitor;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;ibxbindings;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;ibxpress;dsnap;CloudService;FMXTee;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 73 | <EnabledSysJars>annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar</EnabledSysJars> 74 | </PropertyGroup> 75 | <PropertyGroup Condition="'$(Base_Win32)'!=''"> 76 | <DCC_UsePackage>vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;EsVclComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 77 | <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> 78 | <BT_BuildType>Debug</BT_BuildType> 79 | <VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys> 80 | <VerInfo_Locale>1033</VerInfo_Locale> 81 | </PropertyGroup> 82 | <PropertyGroup Condition="'$(Base_Win64)'!=''"> 83 | <DCC_UsePackage>vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;EsVclComponents;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;ibxbindings;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage> 84 | </PropertyGroup> 85 | <PropertyGroup Condition="'$(Cfg_1)'!=''"> 86 | <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> 87 | <DCC_DebugDCUs>true</DCC_DebugDCUs> 88 | <DCC_Optimize>false</DCC_Optimize> 89 | <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> 90 | <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe> 91 | <DCC_RemoteDebug>true</DCC_RemoteDebug> 92 | <DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck> 93 | <DCC_RangeChecking>true</DCC_RangeChecking> 94 | </PropertyGroup> 95 | <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''"> 96 | <DCC_RemoteDebug>false</DCC_RemoteDebug> 97 | </PropertyGroup> 98 | <PropertyGroup Condition="'$(Cfg_2)'!=''"> 99 | <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> 100 | <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> 101 | <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> 102 | <DCC_DebugInformation>0</DCC_DebugInformation> 103 | </PropertyGroup> 104 | <ItemGroup> 105 | <DelphiCompile Include="$(MainSource)"> 106 | <MainSource>MainSource</MainSource> 107 | </DelphiCompile> 108 | <DCCReference Include="MathParserTest.pas"/> 109 | <DCCReference Include="..\MathParser.pas"/> 110 | <BuildConfiguration Include="Base"> 111 | <Key>Base</Key> 112 | </BuildConfiguration> 113 | <BuildConfiguration Include="Debug"> 114 | <Key>Cfg_1</Key> 115 | <CfgParent>Base</CfgParent> 116 | </BuildConfiguration> 117 | <BuildConfiguration Include="Release"> 118 | <Key>Cfg_2</Key> 119 | <CfgParent>Base</CfgParent> 120 | </BuildConfiguration> 121 | </ItemGroup> 122 | <ProjectExtensions> 123 | <Borland.Personality>Delphi.Personality.12</Borland.Personality> 124 | <Borland.ProjectType>Application</Borland.ProjectType> 125 | <BorlandProject> 126 | <Delphi.Personality> 127 | <Source> 128 | <Source Name="MainSource">Tests.dpr</Source> 129 | </Source> 130 | </Delphi.Personality> 131 | <Deployment Version="3"> 132 | <DeployFile LocalName="Win32\Debug\Tests.exe" Configuration="Debug" Class="ProjectOutput"> 133 | <Platform Name="Win32"> 134 | <RemoteName>Tests.exe</RemoteName> 135 | <Overwrite>true</Overwrite> 136 | </Platform> 137 | </DeployFile> 138 | <DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"> 139 | <Platform Name="iOSSimulator"> 140 | <Overwrite>true</Overwrite> 141 | </Platform> 142 | </DeployFile> 143 | <DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"> 144 | <Platform Name="OSX32"> 145 | <Overwrite>true</Overwrite> 146 | </Platform> 147 | </DeployFile> 148 | <DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule"> 149 | <Platform Name="iOSSimulator"> 150 | <Overwrite>true</Overwrite> 151 | </Platform> 152 | </DeployFile> 153 | <DeployClass Name="AdditionalDebugSymbols"> 154 | <Platform Name="iOSSimulator"> 155 | <Operation>1</Operation> 156 | </Platform> 157 | <Platform Name="OSX32"> 158 | <RemoteDir>Contents\MacOS</RemoteDir> 159 | <Operation>1</Operation> 160 | </Platform> 161 | <Platform Name="Win32"> 162 | <Operation>0</Operation> 163 | </Platform> 164 | </DeployClass> 165 | <DeployClass Name="AndroidClasses"> 166 | <Platform Name="Android"> 167 | <RemoteDir>classes</RemoteDir> 168 | <Operation>64</Operation> 169 | </Platform> 170 | <Platform Name="Android64"> 171 | <RemoteDir>classes</RemoteDir> 172 | <Operation>64</Operation> 173 | </Platform> 174 | </DeployClass> 175 | <DeployClass Name="AndroidFileProvider"> 176 | <Platform Name="Android"> 177 | <RemoteDir>res\xml</RemoteDir> 178 | <Operation>1</Operation> 179 | </Platform> 180 | <Platform Name="Android64"> 181 | <RemoteDir>res\xml</RemoteDir> 182 | <Operation>1</Operation> 183 | </Platform> 184 | </DeployClass> 185 | <DeployClass Name="AndroidGDBServer"> 186 | <Platform Name="Android"> 187 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 188 | <Operation>1</Operation> 189 | </Platform> 190 | </DeployClass> 191 | <DeployClass Name="AndroidLibnativeArmeabiFile"> 192 | <Platform Name="Android"> 193 | <RemoteDir>library\lib\armeabi</RemoteDir> 194 | <Operation>1</Operation> 195 | </Platform> 196 | <Platform Name="Android64"> 197 | <RemoteDir>library\lib\armeabi</RemoteDir> 198 | <Operation>1</Operation> 199 | </Platform> 200 | </DeployClass> 201 | <DeployClass Name="AndroidLibnativeArmeabiv7aFile"> 202 | <Platform Name="Android64"> 203 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 204 | <Operation>1</Operation> 205 | </Platform> 206 | </DeployClass> 207 | <DeployClass Name="AndroidLibnativeMipsFile"> 208 | <Platform Name="Android"> 209 | <RemoteDir>library\lib\mips</RemoteDir> 210 | <Operation>1</Operation> 211 | </Platform> 212 | <Platform Name="Android64"> 213 | <RemoteDir>library\lib\mips</RemoteDir> 214 | <Operation>1</Operation> 215 | </Platform> 216 | </DeployClass> 217 | <DeployClass Name="AndroidServiceOutput"> 218 | <Platform Name="Android"> 219 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 220 | <Operation>1</Operation> 221 | </Platform> 222 | <Platform Name="Android64"> 223 | <RemoteDir>library\lib\arm64-v8a</RemoteDir> 224 | <Operation>1</Operation> 225 | </Platform> 226 | </DeployClass> 227 | <DeployClass Name="AndroidServiceOutput_Android32"> 228 | <Platform Name="Android64"> 229 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 230 | <Operation>1</Operation> 231 | </Platform> 232 | </DeployClass> 233 | <DeployClass Name="AndroidSplashImageDef"> 234 | <Platform Name="Android"> 235 | <RemoteDir>res\drawable</RemoteDir> 236 | <Operation>1</Operation> 237 | </Platform> 238 | <Platform Name="Android64"> 239 | <RemoteDir>res\drawable</RemoteDir> 240 | <Operation>1</Operation> 241 | </Platform> 242 | </DeployClass> 243 | <DeployClass Name="AndroidSplashStyles"> 244 | <Platform Name="Android"> 245 | <RemoteDir>res\values</RemoteDir> 246 | <Operation>1</Operation> 247 | </Platform> 248 | <Platform Name="Android64"> 249 | <RemoteDir>res\values</RemoteDir> 250 | <Operation>1</Operation> 251 | </Platform> 252 | </DeployClass> 253 | <DeployClass Name="AndroidSplashStylesV21"> 254 | <Platform Name="Android"> 255 | <RemoteDir>res\values-v21</RemoteDir> 256 | <Operation>1</Operation> 257 | </Platform> 258 | <Platform Name="Android64"> 259 | <RemoteDir>res\values-v21</RemoteDir> 260 | <Operation>1</Operation> 261 | </Platform> 262 | </DeployClass> 263 | <DeployClass Name="Android_Colors"> 264 | <Platform Name="Android"> 265 | <RemoteDir>res\values</RemoteDir> 266 | <Operation>1</Operation> 267 | </Platform> 268 | <Platform Name="Android64"> 269 | <RemoteDir>res\values</RemoteDir> 270 | <Operation>1</Operation> 271 | </Platform> 272 | </DeployClass> 273 | <DeployClass Name="Android_DefaultAppIcon"> 274 | <Platform Name="Android"> 275 | <RemoteDir>res\drawable</RemoteDir> 276 | <Operation>1</Operation> 277 | </Platform> 278 | <Platform Name="Android64"> 279 | <RemoteDir>res\drawable</RemoteDir> 280 | <Operation>1</Operation> 281 | </Platform> 282 | </DeployClass> 283 | <DeployClass Name="Android_LauncherIcon144"> 284 | <Platform Name="Android"> 285 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 286 | <Operation>1</Operation> 287 | </Platform> 288 | <Platform Name="Android64"> 289 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 290 | <Operation>1</Operation> 291 | </Platform> 292 | </DeployClass> 293 | <DeployClass Name="Android_LauncherIcon192"> 294 | <Platform Name="Android"> 295 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 296 | <Operation>1</Operation> 297 | </Platform> 298 | <Platform Name="Android64"> 299 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 300 | <Operation>1</Operation> 301 | </Platform> 302 | </DeployClass> 303 | <DeployClass Name="Android_LauncherIcon36"> 304 | <Platform Name="Android"> 305 | <RemoteDir>res\drawable-ldpi</RemoteDir> 306 | <Operation>1</Operation> 307 | </Platform> 308 | <Platform Name="Android64"> 309 | <RemoteDir>res\drawable-ldpi</RemoteDir> 310 | <Operation>1</Operation> 311 | </Platform> 312 | </DeployClass> 313 | <DeployClass Name="Android_LauncherIcon48"> 314 | <Platform Name="Android"> 315 | <RemoteDir>res\drawable-mdpi</RemoteDir> 316 | <Operation>1</Operation> 317 | </Platform> 318 | <Platform Name="Android64"> 319 | <RemoteDir>res\drawable-mdpi</RemoteDir> 320 | <Operation>1</Operation> 321 | </Platform> 322 | </DeployClass> 323 | <DeployClass Name="Android_LauncherIcon72"> 324 | <Platform Name="Android"> 325 | <RemoteDir>res\drawable-hdpi</RemoteDir> 326 | <Operation>1</Operation> 327 | </Platform> 328 | <Platform Name="Android64"> 329 | <RemoteDir>res\drawable-hdpi</RemoteDir> 330 | <Operation>1</Operation> 331 | </Platform> 332 | </DeployClass> 333 | <DeployClass Name="Android_LauncherIcon96"> 334 | <Platform Name="Android"> 335 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 336 | <Operation>1</Operation> 337 | </Platform> 338 | <Platform Name="Android64"> 339 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 340 | <Operation>1</Operation> 341 | </Platform> 342 | </DeployClass> 343 | <DeployClass Name="Android_NotificationIcon24"> 344 | <Platform Name="Android"> 345 | <RemoteDir>res\drawable-mdpi</RemoteDir> 346 | <Operation>1</Operation> 347 | </Platform> 348 | <Platform Name="Android64"> 349 | <RemoteDir>res\drawable-mdpi</RemoteDir> 350 | <Operation>1</Operation> 351 | </Platform> 352 | </DeployClass> 353 | <DeployClass Name="Android_NotificationIcon36"> 354 | <Platform Name="Android"> 355 | <RemoteDir>res\drawable-hdpi</RemoteDir> 356 | <Operation>1</Operation> 357 | </Platform> 358 | <Platform Name="Android64"> 359 | <RemoteDir>res\drawable-hdpi</RemoteDir> 360 | <Operation>1</Operation> 361 | </Platform> 362 | </DeployClass> 363 | <DeployClass Name="Android_NotificationIcon48"> 364 | <Platform Name="Android"> 365 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 366 | <Operation>1</Operation> 367 | </Platform> 368 | <Platform Name="Android64"> 369 | <RemoteDir>res\drawable-xhdpi</RemoteDir> 370 | <Operation>1</Operation> 371 | </Platform> 372 | </DeployClass> 373 | <DeployClass Name="Android_NotificationIcon72"> 374 | <Platform Name="Android"> 375 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 376 | <Operation>1</Operation> 377 | </Platform> 378 | <Platform Name="Android64"> 379 | <RemoteDir>res\drawable-xxhdpi</RemoteDir> 380 | <Operation>1</Operation> 381 | </Platform> 382 | </DeployClass> 383 | <DeployClass Name="Android_NotificationIcon96"> 384 | <Platform Name="Android"> 385 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 386 | <Operation>1</Operation> 387 | </Platform> 388 | <Platform Name="Android64"> 389 | <RemoteDir>res\drawable-xxxhdpi</RemoteDir> 390 | <Operation>1</Operation> 391 | </Platform> 392 | </DeployClass> 393 | <DeployClass Name="Android_SplashImage426"> 394 | <Platform Name="Android"> 395 | <RemoteDir>res\drawable-small</RemoteDir> 396 | <Operation>1</Operation> 397 | </Platform> 398 | <Platform Name="Android64"> 399 | <RemoteDir>res\drawable-small</RemoteDir> 400 | <Operation>1</Operation> 401 | </Platform> 402 | </DeployClass> 403 | <DeployClass Name="Android_SplashImage470"> 404 | <Platform Name="Android"> 405 | <RemoteDir>res\drawable-normal</RemoteDir> 406 | <Operation>1</Operation> 407 | </Platform> 408 | <Platform Name="Android64"> 409 | <RemoteDir>res\drawable-normal</RemoteDir> 410 | <Operation>1</Operation> 411 | </Platform> 412 | </DeployClass> 413 | <DeployClass Name="Android_SplashImage640"> 414 | <Platform Name="Android"> 415 | <RemoteDir>res\drawable-large</RemoteDir> 416 | <Operation>1</Operation> 417 | </Platform> 418 | <Platform Name="Android64"> 419 | <RemoteDir>res\drawable-large</RemoteDir> 420 | <Operation>1</Operation> 421 | </Platform> 422 | </DeployClass> 423 | <DeployClass Name="Android_SplashImage960"> 424 | <Platform Name="Android"> 425 | <RemoteDir>res\drawable-xlarge</RemoteDir> 426 | <Operation>1</Operation> 427 | </Platform> 428 | <Platform Name="Android64"> 429 | <RemoteDir>res\drawable-xlarge</RemoteDir> 430 | <Operation>1</Operation> 431 | </Platform> 432 | </DeployClass> 433 | <DeployClass Name="Android_Strings"> 434 | <Platform Name="Android"> 435 | <RemoteDir>res\values</RemoteDir> 436 | <Operation>1</Operation> 437 | </Platform> 438 | <Platform Name="Android64"> 439 | <RemoteDir>res\values</RemoteDir> 440 | <Operation>1</Operation> 441 | </Platform> 442 | </DeployClass> 443 | <DeployClass Name="DebugSymbols"> 444 | <Platform Name="iOSSimulator"> 445 | <Operation>1</Operation> 446 | </Platform> 447 | <Platform Name="OSX32"> 448 | <RemoteDir>Contents\MacOS</RemoteDir> 449 | <Operation>1</Operation> 450 | </Platform> 451 | <Platform Name="Win32"> 452 | <Operation>0</Operation> 453 | </Platform> 454 | </DeployClass> 455 | <DeployClass Name="DependencyFramework"> 456 | <Platform Name="OSX32"> 457 | <RemoteDir>Contents\MacOS</RemoteDir> 458 | <Operation>1</Operation> 459 | <Extensions>.framework</Extensions> 460 | </Platform> 461 | <Platform Name="OSX64"> 462 | <RemoteDir>Contents\MacOS</RemoteDir> 463 | <Operation>1</Operation> 464 | <Extensions>.framework</Extensions> 465 | </Platform> 466 | <Platform Name="OSXARM64"> 467 | <RemoteDir>Contents\MacOS</RemoteDir> 468 | <Operation>1</Operation> 469 | <Extensions>.framework</Extensions> 470 | </Platform> 471 | <Platform Name="Win32"> 472 | <Operation>0</Operation> 473 | </Platform> 474 | </DeployClass> 475 | <DeployClass Name="DependencyModule"> 476 | <Platform Name="iOSDevice32"> 477 | <Operation>1</Operation> 478 | <Extensions>.dylib</Extensions> 479 | </Platform> 480 | <Platform Name="iOSDevice64"> 481 | <Operation>1</Operation> 482 | <Extensions>.dylib</Extensions> 483 | </Platform> 484 | <Platform Name="iOSSimulator"> 485 | <Operation>1</Operation> 486 | <Extensions>.dylib</Extensions> 487 | </Platform> 488 | <Platform Name="OSX32"> 489 | <RemoteDir>Contents\MacOS</RemoteDir> 490 | <Operation>1</Operation> 491 | <Extensions>.dylib</Extensions> 492 | </Platform> 493 | <Platform Name="OSX64"> 494 | <RemoteDir>Contents\MacOS</RemoteDir> 495 | <Operation>1</Operation> 496 | <Extensions>.dylib</Extensions> 497 | </Platform> 498 | <Platform Name="OSXARM64"> 499 | <RemoteDir>Contents\MacOS</RemoteDir> 500 | <Operation>1</Operation> 501 | <Extensions>.dylib</Extensions> 502 | </Platform> 503 | <Platform Name="Win32"> 504 | <Operation>0</Operation> 505 | <Extensions>.dll;.bpl</Extensions> 506 | </Platform> 507 | </DeployClass> 508 | <DeployClass Required="true" Name="DependencyPackage"> 509 | <Platform Name="iOSDevice32"> 510 | <Operation>1</Operation> 511 | <Extensions>.dylib</Extensions> 512 | </Platform> 513 | <Platform Name="iOSDevice64"> 514 | <Operation>1</Operation> 515 | <Extensions>.dylib</Extensions> 516 | </Platform> 517 | <Platform Name="iOSSimulator"> 518 | <Operation>1</Operation> 519 | <Extensions>.dylib</Extensions> 520 | </Platform> 521 | <Platform Name="OSX32"> 522 | <RemoteDir>Contents\MacOS</RemoteDir> 523 | <Operation>1</Operation> 524 | <Extensions>.dylib</Extensions> 525 | </Platform> 526 | <Platform Name="OSX64"> 527 | <RemoteDir>Contents\MacOS</RemoteDir> 528 | <Operation>1</Operation> 529 | <Extensions>.dylib</Extensions> 530 | </Platform> 531 | <Platform Name="OSXARM64"> 532 | <RemoteDir>Contents\MacOS</RemoteDir> 533 | <Operation>1</Operation> 534 | <Extensions>.dylib</Extensions> 535 | </Platform> 536 | <Platform Name="Win32"> 537 | <Operation>0</Operation> 538 | <Extensions>.bpl</Extensions> 539 | </Platform> 540 | </DeployClass> 541 | <DeployClass Name="File"> 542 | <Platform Name="Android"> 543 | <Operation>0</Operation> 544 | </Platform> 545 | <Platform Name="Android64"> 546 | <Operation>0</Operation> 547 | </Platform> 548 | <Platform Name="iOSDevice32"> 549 | <Operation>0</Operation> 550 | </Platform> 551 | <Platform Name="iOSDevice64"> 552 | <Operation>0</Operation> 553 | </Platform> 554 | <Platform Name="iOSSimulator"> 555 | <Operation>0</Operation> 556 | </Platform> 557 | <Platform Name="OSX32"> 558 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 559 | <Operation>0</Operation> 560 | </Platform> 561 | <Platform Name="OSX64"> 562 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 563 | <Operation>0</Operation> 564 | </Platform> 565 | <Platform Name="OSXARM64"> 566 | <RemoteDir>Contents\Resources\StartUp\</RemoteDir> 567 | <Operation>0</Operation> 568 | </Platform> 569 | <Platform Name="Win32"> 570 | <Operation>0</Operation> 571 | </Platform> 572 | </DeployClass> 573 | <DeployClass Name="iOS_AppStore1024"> 574 | <Platform Name="iOSDevice64"> 575 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 576 | <Operation>1</Operation> 577 | </Platform> 578 | </DeployClass> 579 | <DeployClass Name="iPad_AppIcon152"> 580 | <Platform Name="iOSDevice64"> 581 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 582 | <Operation>1</Operation> 583 | </Platform> 584 | <Platform Name="iOSSimulator"> 585 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 586 | <Operation>1</Operation> 587 | </Platform> 588 | </DeployClass> 589 | <DeployClass Name="iPad_AppIcon167"> 590 | <Platform Name="iOSDevice64"> 591 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 592 | <Operation>1</Operation> 593 | </Platform> 594 | <Platform Name="iOSSimulator"> 595 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 596 | <Operation>1</Operation> 597 | </Platform> 598 | </DeployClass> 599 | <DeployClass Name="iPad_Launch2x"> 600 | <Platform Name="iOSDevice64"> 601 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 602 | <Operation>1</Operation> 603 | </Platform> 604 | <Platform Name="iOSSimulator"> 605 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 606 | <Operation>1</Operation> 607 | </Platform> 608 | </DeployClass> 609 | <DeployClass Name="iPad_LaunchDark2x"> 610 | <Platform Name="iOSDevice64"> 611 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 612 | <Operation>1</Operation> 613 | </Platform> 614 | <Platform Name="iOSSimulator"> 615 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 616 | <Operation>1</Operation> 617 | </Platform> 618 | </DeployClass> 619 | <DeployClass Name="iPad_Notification40"> 620 | <Platform Name="iOSDevice64"> 621 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 622 | <Operation>1</Operation> 623 | </Platform> 624 | <Platform Name="iOSSimulator"> 625 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 626 | <Operation>1</Operation> 627 | </Platform> 628 | </DeployClass> 629 | <DeployClass Name="iPad_Setting58"> 630 | <Platform Name="iOSDevice64"> 631 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 632 | <Operation>1</Operation> 633 | </Platform> 634 | <Platform Name="iOSSimulator"> 635 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 636 | <Operation>1</Operation> 637 | </Platform> 638 | </DeployClass> 639 | <DeployClass Name="iPad_SpotLight80"> 640 | <Platform Name="iOSDevice64"> 641 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 642 | <Operation>1</Operation> 643 | </Platform> 644 | <Platform Name="iOSSimulator"> 645 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 646 | <Operation>1</Operation> 647 | </Platform> 648 | </DeployClass> 649 | <DeployClass Name="iPhone_AppIcon120"> 650 | <Platform Name="iOSDevice64"> 651 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 652 | <Operation>1</Operation> 653 | </Platform> 654 | <Platform Name="iOSSimulator"> 655 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 656 | <Operation>1</Operation> 657 | </Platform> 658 | </DeployClass> 659 | <DeployClass Name="iPhone_AppIcon180"> 660 | <Platform Name="iOSDevice64"> 661 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 662 | <Operation>1</Operation> 663 | </Platform> 664 | <Platform Name="iOSSimulator"> 665 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 666 | <Operation>1</Operation> 667 | </Platform> 668 | </DeployClass> 669 | <DeployClass Name="iPhone_Launch2x"> 670 | <Platform Name="iOSDevice64"> 671 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 672 | <Operation>1</Operation> 673 | </Platform> 674 | <Platform Name="iOSSimulator"> 675 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 676 | <Operation>1</Operation> 677 | </Platform> 678 | </DeployClass> 679 | <DeployClass Name="iPhone_Launch3x"> 680 | <Platform Name="iOSDevice64"> 681 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 682 | <Operation>1</Operation> 683 | </Platform> 684 | <Platform Name="iOSSimulator"> 685 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 686 | <Operation>1</Operation> 687 | </Platform> 688 | </DeployClass> 689 | <DeployClass Name="iPhone_LaunchDark2x"> 690 | <Platform Name="iOSDevice64"> 691 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 692 | <Operation>1</Operation> 693 | </Platform> 694 | <Platform Name="iOSSimulator"> 695 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 696 | <Operation>1</Operation> 697 | </Platform> 698 | </DeployClass> 699 | <DeployClass Name="iPhone_LaunchDark3x"> 700 | <Platform Name="iOSDevice64"> 701 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 702 | <Operation>1</Operation> 703 | </Platform> 704 | <Platform Name="iOSSimulator"> 705 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir> 706 | <Operation>1</Operation> 707 | </Platform> 708 | </DeployClass> 709 | <DeployClass Name="iPhone_Notification40"> 710 | <Platform Name="iOSDevice64"> 711 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 712 | <Operation>1</Operation> 713 | </Platform> 714 | <Platform Name="iOSSimulator"> 715 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 716 | <Operation>1</Operation> 717 | </Platform> 718 | </DeployClass> 719 | <DeployClass Name="iPhone_Notification60"> 720 | <Platform Name="iOSDevice64"> 721 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 722 | <Operation>1</Operation> 723 | </Platform> 724 | <Platform Name="iOSSimulator"> 725 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 726 | <Operation>1</Operation> 727 | </Platform> 728 | </DeployClass> 729 | <DeployClass Name="iPhone_Setting58"> 730 | <Platform Name="iOSDevice64"> 731 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 732 | <Operation>1</Operation> 733 | </Platform> 734 | <Platform Name="iOSSimulator"> 735 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 736 | <Operation>1</Operation> 737 | </Platform> 738 | </DeployClass> 739 | <DeployClass Name="iPhone_Setting87"> 740 | <Platform Name="iOSDevice64"> 741 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 742 | <Operation>1</Operation> 743 | </Platform> 744 | <Platform Name="iOSSimulator"> 745 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 746 | <Operation>1</Operation> 747 | </Platform> 748 | </DeployClass> 749 | <DeployClass Name="iPhone_Spotlight120"> 750 | <Platform Name="iOSDevice64"> 751 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 752 | <Operation>1</Operation> 753 | </Platform> 754 | <Platform Name="iOSSimulator"> 755 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 756 | <Operation>1</Operation> 757 | </Platform> 758 | </DeployClass> 759 | <DeployClass Name="iPhone_Spotlight80"> 760 | <Platform Name="iOSDevice64"> 761 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 762 | <Operation>1</Operation> 763 | </Platform> 764 | <Platform Name="iOSSimulator"> 765 | <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir> 766 | <Operation>1</Operation> 767 | </Platform> 768 | </DeployClass> 769 | <DeployClass Name="ProjectAndroidManifest"> 770 | <Platform Name="Android"> 771 | <Operation>1</Operation> 772 | </Platform> 773 | <Platform Name="Android64"> 774 | <Operation>1</Operation> 775 | </Platform> 776 | </DeployClass> 777 | <DeployClass Name="ProjectiOSDeviceDebug"> 778 | <Platform Name="iOSDevice32"> 779 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 780 | <Operation>1</Operation> 781 | </Platform> 782 | <Platform Name="iOSDevice64"> 783 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 784 | <Operation>1</Operation> 785 | </Platform> 786 | </DeployClass> 787 | <DeployClass Name="ProjectiOSEntitlements"> 788 | <Platform Name="iOSDevice32"> 789 | <RemoteDir>..\</RemoteDir> 790 | <Operation>1</Operation> 791 | </Platform> 792 | <Platform Name="iOSDevice64"> 793 | <RemoteDir>..\</RemoteDir> 794 | <Operation>1</Operation> 795 | </Platform> 796 | </DeployClass> 797 | <DeployClass Name="ProjectiOSInfoPList"> 798 | <Platform Name="iOSDevice32"> 799 | <Operation>1</Operation> 800 | </Platform> 801 | <Platform Name="iOSDevice64"> 802 | <Operation>1</Operation> 803 | </Platform> 804 | <Platform Name="iOSSimulator"> 805 | <Operation>1</Operation> 806 | </Platform> 807 | </DeployClass> 808 | <DeployClass Name="ProjectiOSLaunchScreen"> 809 | <Platform Name="iOSDevice64"> 810 | <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir> 811 | <Operation>64</Operation> 812 | </Platform> 813 | <Platform Name="iOSSimulator"> 814 | <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir> 815 | <Operation>64</Operation> 816 | </Platform> 817 | </DeployClass> 818 | <DeployClass Name="ProjectiOSResource"> 819 | <Platform Name="iOSDevice32"> 820 | <Operation>1</Operation> 821 | </Platform> 822 | <Platform Name="iOSDevice64"> 823 | <Operation>1</Operation> 824 | </Platform> 825 | <Platform Name="iOSSimulator"> 826 | <Operation>1</Operation> 827 | </Platform> 828 | </DeployClass> 829 | <DeployClass Name="ProjectOSXDebug"> 830 | <Platform Name="OSX64"> 831 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 832 | <Operation>1</Operation> 833 | </Platform> 834 | <Platform Name="OSXARM64"> 835 | <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir> 836 | <Operation>1</Operation> 837 | </Platform> 838 | </DeployClass> 839 | <DeployClass Name="ProjectOSXEntitlements"> 840 | <Platform Name="OSX32"> 841 | <RemoteDir>..\</RemoteDir> 842 | <Operation>1</Operation> 843 | </Platform> 844 | <Platform Name="OSX64"> 845 | <RemoteDir>..\</RemoteDir> 846 | <Operation>1</Operation> 847 | </Platform> 848 | <Platform Name="OSXARM64"> 849 | <RemoteDir>..\</RemoteDir> 850 | <Operation>1</Operation> 851 | </Platform> 852 | </DeployClass> 853 | <DeployClass Name="ProjectOSXInfoPList"> 854 | <Platform Name="OSX32"> 855 | <RemoteDir>Contents</RemoteDir> 856 | <Operation>1</Operation> 857 | </Platform> 858 | <Platform Name="OSX64"> 859 | <RemoteDir>Contents</RemoteDir> 860 | <Operation>1</Operation> 861 | </Platform> 862 | <Platform Name="OSXARM64"> 863 | <RemoteDir>Contents</RemoteDir> 864 | <Operation>1</Operation> 865 | </Platform> 866 | </DeployClass> 867 | <DeployClass Name="ProjectOSXResource"> 868 | <Platform Name="OSX32"> 869 | <RemoteDir>Contents\Resources</RemoteDir> 870 | <Operation>1</Operation> 871 | </Platform> 872 | <Platform Name="OSX64"> 873 | <RemoteDir>Contents\Resources</RemoteDir> 874 | <Operation>1</Operation> 875 | </Platform> 876 | <Platform Name="OSXARM64"> 877 | <RemoteDir>Contents\Resources</RemoteDir> 878 | <Operation>1</Operation> 879 | </Platform> 880 | </DeployClass> 881 | <DeployClass Required="true" Name="ProjectOutput"> 882 | <Platform Name="Android"> 883 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 884 | <Operation>1</Operation> 885 | </Platform> 886 | <Platform Name="Android64"> 887 | <RemoteDir>library\lib\arm64-v8a</RemoteDir> 888 | <Operation>1</Operation> 889 | </Platform> 890 | <Platform Name="iOSDevice32"> 891 | <Operation>1</Operation> 892 | </Platform> 893 | <Platform Name="iOSDevice64"> 894 | <Operation>1</Operation> 895 | </Platform> 896 | <Platform Name="iOSSimulator"> 897 | <Operation>1</Operation> 898 | </Platform> 899 | <Platform Name="Linux64"> 900 | <Operation>1</Operation> 901 | </Platform> 902 | <Platform Name="OSX32"> 903 | <RemoteDir>Contents\MacOS</RemoteDir> 904 | <Operation>1</Operation> 905 | </Platform> 906 | <Platform Name="OSX64"> 907 | <RemoteDir>Contents\MacOS</RemoteDir> 908 | <Operation>1</Operation> 909 | </Platform> 910 | <Platform Name="OSXARM64"> 911 | <RemoteDir>Contents\MacOS</RemoteDir> 912 | <Operation>1</Operation> 913 | </Platform> 914 | <Platform Name="Win32"> 915 | <Operation>0</Operation> 916 | </Platform> 917 | </DeployClass> 918 | <DeployClass Name="ProjectOutput_Android32"> 919 | <Platform Name="Android64"> 920 | <RemoteDir>library\lib\armeabi-v7a</RemoteDir> 921 | <Operation>1</Operation> 922 | </Platform> 923 | </DeployClass> 924 | <DeployClass Name="ProjectUWPManifest"> 925 | <Platform Name="Win32"> 926 | <Operation>1</Operation> 927 | </Platform> 928 | <Platform Name="Win64"> 929 | <Operation>1</Operation> 930 | </Platform> 931 | </DeployClass> 932 | <DeployClass Name="UWP_DelphiLogo150"> 933 | <Platform Name="Win32"> 934 | <RemoteDir>Assets</RemoteDir> 935 | <Operation>1</Operation> 936 | </Platform> 937 | <Platform Name="Win64"> 938 | <RemoteDir>Assets</RemoteDir> 939 | <Operation>1</Operation> 940 | </Platform> 941 | </DeployClass> 942 | <DeployClass Name="UWP_DelphiLogo44"> 943 | <Platform Name="Win32"> 944 | <RemoteDir>Assets</RemoteDir> 945 | <Operation>1</Operation> 946 | </Platform> 947 | <Platform Name="Win64"> 948 | <RemoteDir>Assets</RemoteDir> 949 | <Operation>1</Operation> 950 | </Platform> 951 | </DeployClass> 952 | <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/> 953 | <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/> 954 | <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/> 955 | <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/> 956 | <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/> 957 | <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> 958 | <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> 959 | <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/> 960 | <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/> 961 | <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/> 962 | <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/> 963 | </Deployment> 964 | <Platforms> 965 | <Platform value="Android">False</Platform> 966 | <Platform value="Android64">False</Platform> 967 | <Platform value="Win32">True</Platform> 968 | <Platform value="Win64">False</Platform> 969 | </Platforms> 970 | </BorlandProject> 971 | <ProjectFileVersion>12</ProjectFileVersion> 972 | </ProjectExtensions> 973 | <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> 974 | <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> 975 | <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/> 976 | </Project> 977 | -------------------------------------------------------------------------------- /Tests/Tests.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/turborium/SimpleMathParser/fad92031d6cf1b17df11461f626ddf1db220b776/Tests/Tests.res -------------------------------------------------------------------------------- /scr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/turborium/SimpleMathParser/fad92031d6cf1b17df11461f626ddf1db220b776/scr.png --------------------------------------------------------------------------------