<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lee Westlake</title>
    <description>The latest articles on DEV Community by Lee Westlake (@lwestlake).</description>
    <link>https://dev.to/lwestlake</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3780221%2F4ed49563-13c0-4ab0-a998-5115ed1d8741.png</url>
      <title>DEV Community: Lee Westlake</title>
      <link>https://dev.to/lwestlake</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lwestlake"/>
    <language>en</language>
    <item>
      <title>Why the importance of math is inversely proportional to your aptitude for natural reasoning.</title>
      <dc:creator>Lee Westlake</dc:creator>
      <pubDate>Sat, 21 Feb 2026 00:45:06 +0000</pubDate>
      <link>https://dev.to/lwestlake/why-the-importance-of-math-is-inversely-proportional-to-your-aptitude-for-natural-reasoning-iem</link>
      <guid>https://dev.to/lwestlake/why-the-importance-of-math-is-inversely-proportional-to-your-aptitude-for-natural-reasoning-iem</guid>
      <description>&lt;p&gt;In a recent discussion, I contended that the importance of math is inversely proportional to a person’s aptitude for natural reasoning (i.e. the poorer your reasoning skills, the more math you should learn). Needless to say, there were more than a handful of dissenting voices (most eluding to various levels of delusional snobbery), but nevertheless, I stand by my position wholeheartedly.&lt;/p&gt;

&lt;p&gt;Having mooched around the technology arena for more decades than I care to mention, I’ve had the opportunity to rub shoulders with just about every kind of person you can imagine. Whilst each generally exhibited their own personality and unique nuances, all appeared to fit comfortably within one of the following four categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Exceptional natural reasoning skills, with additional contemporary mathematical knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exceptional natural reasoning skills, with no contemporary mathematical knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nominal natural reasoning skills, with additional contemporary mathematical knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nominal natural reasoning skills, with no contemporary mathematical knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obviously, it would be nice if everyone could claim their place within category #1, but the vast majority of us simply aren’t built that way: most of us begin our journey at category #4, accompanied by a vague hope that diligence, perseverance, and hard work will eventually edge us towards category #3. Nonetheless, our personal indignations notwithstanding, category #3 is not to be sniffed at, for it allows us to compete against category #2 using the ratified methods of those clever enough to reside within category #1.&lt;/p&gt;

&lt;p&gt;To illustrate my point, consider the following problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;In March, I purchased a pair of shoes discounted by 25% from the previous month. If I paid £175 in March, what was the RRP in February?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Surprisingly, whilst the majority category-#4 adults are likely to fall at the first hurdle, most 6th graders will derive the answer in under a minute. So what’s the deal here? Are today’s 6th graders infinitely more intelligent than those of yesteryear? Well, probably not, but their mandated curriculum certainly positions them closer to category #3 than those who abandoned their scholastic careers more than twenty years ago.&lt;/p&gt;

&lt;p&gt;So why exactly do these adults fail? Well, it’s simply a matter of perception: as the original RRP is not known, there is no perceived value upon which to apply the original 25% discount. To all intents and purposes, it appears insoluble. Of course, the perceived discount does, in fact, scale reciprocally with the discounted RRP (i.e. if the discounted RRP is 75% of the original, then the perceived discount also changes by the reciprocally proportional value 1/75%), but this is not naturally intuitive to the majority of people who are unaccustomed to thinking in algebraic terms.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof12w6ik8m4rtdq2fwly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof12w6ik8m4rtdq2fwly.png" alt="Figure 1" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our 6th graders, however, they need neither intuition nor natural reasoning to effect the appropriate answer: they need only apply a simple set of ratified and well-rehearsed theorems handed down by their betters:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Specify the problem:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;£175 = RRP - 25% * RRP
     = RRP - 0.25 * RRP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Combine like terms:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;£175 = 1 * RRP - 0.25 * RRP
     = 0.75 * RRP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Solve for RRP:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;£175 / 0.75 = RRP = £~233.33
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In short, mathematics is a proven language for describing phenomena that would otherwise remain elusive to all but the best of us. Furthermore, the poorer your reasoning skills, the more time you should dedicate to learning its nuances and dialects. At the end of the day, the person who’ll steal your promotion will likely be better prepared rather than better endowed.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Writing an Infix Expression Evaluator in C++</title>
      <dc:creator>Lee Westlake</dc:creator>
      <pubDate>Thu, 19 Feb 2026 00:20:59 +0000</pubDate>
      <link>https://dev.to/lwestlake/writing-an-infix-expression-evaluator-in-c-59ml</link>
      <guid>https://dev.to/lwestlake/writing-an-infix-expression-evaluator-in-c-59ml</guid>
      <description>&lt;p&gt;If you intend to work as a professional programmer in the scientific or financial sectors for any reasonable length of time, then infix evaluation is a problem you’re likely to encounter a lot. After all, programmers aren’t the only people who have to deal with complex mathematical expressions. Whilst the most popular solutions often rely on an intermediate prefix/postfix stage, I have chosen to employ a more direct approach here. In the interests of clarity, I’ll begin with an iterative C++ precedence-based evaluator, and subsequently add parentheses support as a retrofit.&lt;/p&gt;

&lt;p&gt;As it’s not always convenient to create an std::exception subclass for every conceivable class of error — the standard C++ exception paradigm is primarily centred around inheritance — we’ll grease the rails a little by deriving a more versatile parameter-based exception class. Maintaining compatibility with the existing ‘throw → catch → what()’ mechanism, this new class facilitates the use of error names, codes, and messages at the point of dissemination (i.e. the point at which the exception is thrown).&lt;/p&gt;

&lt;p&gt;The basic mechanics of this class may be summarised as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;An exception of type “ApplicationException” is thrown, thus:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsfzm4nv1qbvxi0y1khr.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsfzm4nv1qbvxi0y1khr.webp" alt="Application Exception"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The exception is subsequently caught.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The exception object’s “what()” method is used to return an error report of type:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdtlmm07gkck6r5m82mj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdtlmm07gkck6r5m82mj.png" alt="Error Report"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;ApplicationException.h&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* =============================================================================

Concrete base class from which all other application-related exceptions should
be derived. As this class is derived from the standard C++ exception class, it
maintains compatibility with the standard "throw -&amp;gt; catch -&amp;gt; what()" mechanism,
whilst facilitating the use of discriminating error names, codes, and messages
at the point of dissemination (i.e. the point at which the exception is thrown).
As this effectively permits each "throw" statement to distinguish itself from
its peers, the number of unique 'std::exception' subclasses should be
drastically reduced.

============================================================================= */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef APPLICATION_EXCEPTION_ALREADY_INCLUDED
&lt;/span&gt;  &lt;span class="cp"&gt;#define APPLICATION_EXCEPTION_ALREADY_INCLUDED
&lt;/span&gt;
  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;exception&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="c1"&gt;// Class is a derivation of "std::exception".&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApplicationException&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nl"&gt;private:&lt;/span&gt;

      &lt;span class="c1"&gt;// Private member variables to store error code, error message, and error&lt;/span&gt;
      &lt;span class="c1"&gt;// name information. As performance is not a consideration here,&lt;/span&gt;
      &lt;span class="c1"&gt;// std::string objects are used for all string-related data.&lt;/span&gt;

      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;mMessage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;mName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;protected:&lt;/span&gt;

      &lt;span class="c1"&gt;// Protected member variable to store the "what()" method's return string.&lt;/span&gt;
      &lt;span class="c1"&gt;// Derived classes will require direct access should they wish to augment&lt;/span&gt;
      &lt;span class="c1"&gt;// this error string.&lt;/span&gt;

      &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;mReport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;public:&lt;/span&gt;

      &lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

      &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ApplicationException"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Methods to return the error code, error message, and error name&lt;/span&gt;
      &lt;span class="c1"&gt;// associated with this object.&lt;/span&gt;

      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Overridden std::exception "what()" method.&lt;/span&gt;

      &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;ApplicationException.cpp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"ApplicationException.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

&lt;span class="c1"&gt;// PARAMETERS: 1) Error code associated with this exception.&lt;/span&gt;
&lt;span class="c1"&gt;//             2) Error message associated with this exception.&lt;/span&gt;
&lt;span class="c1"&gt;//             3) Error name (default = "ApplicationException").&lt;/span&gt;

&lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                           &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                           &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;

  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;// Assign error parameters to this object.&lt;/span&gt;

    &lt;span class="n"&gt;mCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;mMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;mName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pName&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="c1"&gt;// Generate a report string of type:&lt;/span&gt;

    &lt;span class="c1"&gt;//   Error_Name&lt;/span&gt;
    &lt;span class="c1"&gt;//   **********&lt;/span&gt;
    &lt;span class="c1"&gt;//&lt;/span&gt;
    &lt;span class="c1"&gt;//   Error_Code : Error_Message&lt;/span&gt;

    &lt;span class="c1"&gt;// Typically, this string is returned via the overridden&lt;/span&gt;
    &lt;span class="c1"&gt;// "std::exception::what()" method.&lt;/span&gt;

    &lt;span class="n"&gt;mReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sc"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" : "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Method to return the error code associated with this exception.&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Method to return the error message associated with this exception.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Method to return the error name associated with this exception.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Overridden "std::exception::what()" method. Typically, this method returns&lt;/span&gt;
&lt;span class="c1"&gt;// the report string created during object construction.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mReport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;As it’s often useful to report the position of an error during the evaluation of an infix expression, it makes sense to extend this exception class accordingly. Accommodating both expression and position parameters, the derived class’s “what()” method subsequently returns an error report of type:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx9ob0rryo1ijfhlimgm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmx9ob0rryo1ijfhlimgm.png" alt="Extended Error Report"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: The above example assumes an error at character position 3 of the supplied expression.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;InfixParseException.h&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* =============================================================================

Exception class for all infix-related parsing errors. A derivative of
"ApplicationException", this class additionally facilitates the reporting of
both expression and error position information.

============================================================================= */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef INFIX_PARSE_EXCEPTION_ALREADY_INCLUDED
&lt;/span&gt;  &lt;span class="cp"&gt;#define INFIX_PARSE_EXCEPTION_ALREADY_INCLUDED
&lt;/span&gt;
  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"ApplicationException.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="c1"&gt;// Class is a derivation of "ApplicationException".&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InfixParseException&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nl"&gt;private:&lt;/span&gt;

      &lt;span class="c1"&gt;// Private member variables to store expression and error position&lt;/span&gt;
      &lt;span class="c1"&gt;// information.&lt;/span&gt;

      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;public:&lt;/span&gt;

      &lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

      &lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pPosition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Methods to return the expression and error position associated with&lt;/span&gt;
      &lt;span class="c1"&gt;// this object.&lt;/span&gt;

      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;InfixParseException.cpp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"InfixParseException.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

&lt;span class="c1"&gt;// PARAMETERS: 1) Error code associated with this exception.&lt;/span&gt;
&lt;span class="c1"&gt;//             2) Error message associated with this exception.&lt;/span&gt;
&lt;span class="c1"&gt;//             3) Infix expression associated with this exception.&lt;/span&gt;
&lt;span class="c1"&gt;//             4) Character position at which the exception occured.&lt;/span&gt;

&lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                         &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                         &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                         &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;// Initialise parent instance (exception name is implicitly changed to&lt;/span&gt;
    &lt;span class="c1"&gt;// "InfixParseException") and assign additional error parameters to this&lt;/span&gt;
    &lt;span class="c1"&gt;// object.&lt;/span&gt;

    &lt;span class="n"&gt;ApplicationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"InfixParseException"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                         &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                         &lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// Augment report string with additional error parameters:&lt;/span&gt;

  &lt;span class="c1"&gt;//   Expression&lt;/span&gt;
  &lt;span class="c1"&gt;//   **********&lt;/span&gt;
  &lt;span class="c1"&gt;//&lt;/span&gt;
  &lt;span class="c1"&gt;//   Exp{@Position}ression&lt;/span&gt;

  &lt;span class="n"&gt;mReport&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Expression&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;**********&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
             &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"{@"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
             &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"}"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
             &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Method to return the expression associated with this exception.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Method to return the error position associated with this exception.&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;noexcept&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;As we’ve decided to implement an iterative rather than a recursive solution here, we’ll need to employ explicit operand/operator stacks as part of our infix sequencing mechanism. Whilst I’ve never been overly fond of the standard C++ library, writing an entire stack template is somewhat overkill for the demonstration code presented here. Thus, for convenience, we’ll be using the standard std::stack template, albeit with the following modifications:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Its “pop” method shall be modified to conform to canonical stack behaviour: popped values should always be returned to the caller.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For convenience, an explicit method shall be provided that allows us to reset the stack to a previous state (i.e. to delete all but the first n stack elements).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;InfixStack.h&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* =============================================================================

A convenience derivative of "std::stack", this modified template effectively
adds both reset functionality and canonical "pop" semantics (i.e. "popped"
values are implicitly returned to the caller).

============================================================================= */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef INFIX_STACK_ALREADY_INCLUDED
&lt;/span&gt;  &lt;span class="cp"&gt;#define INFIX_STACK_ALREADY_INCLUDED
&lt;/span&gt;
  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstddef&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stack&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="c1"&gt;// Template is a derivation of "std::stack".&lt;/span&gt;

  &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InfixStack&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nl"&gt;public:&lt;/span&gt;

      &lt;span class="c1"&gt;// =======================================================================&lt;/span&gt;

      &lt;span class="c1"&gt;// Alternate "pop" method which canonically retuns the popped value.&lt;/span&gt;

      &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Copy element at top of stack.&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Remove value from top of stack.&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Return copied element.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// =======================================================================&lt;/span&gt;

      &lt;span class="c1"&gt;// Method to reset the stack to an earlier state (i.e. only the first "pN"&lt;/span&gt;
      &lt;span class="c1"&gt;// entries are preserved). Note: this method does nothing if the current&lt;/span&gt;
      &lt;span class="c1"&gt;// stack size is lessthan or equal to "pN". &lt;/span&gt;

      &lt;span class="c1"&gt;// PARAMETERS: 1) Number of entries to preserve (default = 0).&lt;/span&gt;

      &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;pN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="c1"&gt;// Iteratively pop elements off the stack, until size &amp;lt;= "pN".&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;With the ancillary drudge out of the way, we can now concentrate on the evaluator classes themselves. For this, we’ll require the services of two discrete interfaces: one to represent the properties of each operator (i.e. symbol, precedence, associativity, and function), and the other to encapsulate the main evaluator functionality. Due to the intrinsic dependency between these two interfaces -- infix operators infur meaning only within the context of an evaluator -- inner classes appear to offer the greatest degree of generality here. As such, each operator class will be semantically contained within the main evaluator class itself.&lt;/p&gt;

&lt;p&gt;When considering the various mechanics and minutiae of the evaluator class as a whole, it’s somewhat useful to acknowledge the following observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Operators must always be evaluated in the order dictated by their established precedence and associativity (BODMAS/BEDMAS).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As an operator’s precedence/associativity is inextricably linked to that of its immediate neighbour, the entire expression can be parsed in a single left-to-right sweep (i.e. it’s sufficient to compare each operator with its immediate neighbour, rather than the entire expression).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As neighbours of increasing precedence are always evaluated in a left-to-right fashion, lower-precedence operators must be ‘remembered’ and subsequently recalled in reverse, right-to-left order (i.e. when processing higher-precedence operators from left-to-right, deferred lower-precedence operators naturally occur in an increasing order of precedence). Therefore, LIFO stack structures represent the best fit for this purpose.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thus, with this in mind, we’ll adopt the following strategy whilst attempting to implement our super-duper no-nonsense XR4i  evaluator method (if that doesn’t betray my age, nothing will):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;From left to right, if the current operator has higher precedence than the operator currently situated at the top of the operator stack, then push the current operator and the subsequent operand onto their respective stacks, and move on to the next operator. Else, pop the top-most operator and its associated operand(s) from their respective stacks, and push the result of the operation back onto the operand stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat step #1 until the entire infix expression has been parsed and the operator stack is empty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pop the final result from the top of the operand stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are, of course, a few corner cases that the above procedure conveniently ignores, such as the initial state, empty stack, and end-of-expression conditions. Whilst these are typically handled via additional program code, I’ve opted to incorporate them into the existing precedence logic by biasing the operator stack with ancillary non-arithmetic start and end operators (each denoting the beginning and end of the expression, respectively).&lt;/p&gt;




&lt;p&gt;InfixEvaluator.h&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* =============================================================================

Class to encapsulate the functionality of a stack-based iterative infix
expression evaluator. As extensive use is made of object state, rather than
static/stacked state, this class must be instantiated before use. Due to the
exclusive relationship between an evaluator and its operators (operators
intrinsically require an evaluator context), inner operator classes have been
employed where appropriate.

============================================================================= */&lt;/span&gt;

&lt;span class="cp"&gt;#ifndef INFIX_EVALUATOR_ALREADY_INCLUDED
&lt;/span&gt;  &lt;span class="cp"&gt;#define INFIX_EVALUATOR_ALREADY_INCLUDED
&lt;/span&gt;
  &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"InfixStack.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
  &lt;span class="c1"&gt;// Outer evaluator class.&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InfixEvaluator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// =========================================================================&lt;/span&gt;

    &lt;span class="c1"&gt;// Abstract inner operator class from which all other operator classes are&lt;/span&gt;
    &lt;span class="c1"&gt;// derived.&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InfixOperator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="nl"&gt;private:&lt;/span&gt;

        &lt;span class="c1"&gt;// Private member variables to store symbol, precedence, and&lt;/span&gt;
        &lt;span class="c1"&gt;// associativeness information.&lt;/span&gt;

        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;mSymbol&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mPrecedence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;mIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="nl"&gt;public:&lt;/span&gt;

        &lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

        &lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pSymbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Methods to return the symbol, precedence, and associativeness&lt;/span&gt;
        &lt;span class="c1"&gt;// attributed to this object.&lt;/span&gt;

        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;precedence&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Pure virtual method used to implement the operator's evaluation&lt;/span&gt;
        &lt;span class="c1"&gt;// logic.&lt;/span&gt;

        &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InfixEvaluator&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// =========================================================================&lt;/span&gt;

    &lt;span class="c1"&gt;// Convenience macro used to declare concrete operator classes.&lt;/span&gt;

    &lt;span class="cp"&gt;#define OPERATOR_CLASS(NAME)                                              \
      class NAME : public InfixOperator {                                     \
        public:                                                               \
          NAME();                                                             \
          virtual void evaluate(InfixEvaluator &amp;amp;pEvaluator) const override; }
&lt;/span&gt;
    &lt;span class="c1"&gt;// Inner concrete operator classes.&lt;/span&gt;

    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StartOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExponentOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DivideOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModuloOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MultiplyOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AddOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubtractOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnaryMinusOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnaryPlusOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EndOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// =========================================================================&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

      &lt;span class="c1"&gt;// Static instance of each operator (operators don't have local state).&lt;/span&gt;

      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;StartOperator&lt;/span&gt; &lt;span class="n"&gt;scmStartOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ExponentOperator&lt;/span&gt; &lt;span class="n"&gt;scmExponentOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DivideOperator&lt;/span&gt; &lt;span class="n"&gt;scmDivideOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ModuloOperator&lt;/span&gt; &lt;span class="n"&gt;scmModuloOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MultiplyOperator&lt;/span&gt; &lt;span class="n"&gt;scmMultiplyOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;AddOperator&lt;/span&gt; &lt;span class="n"&gt;scmAddOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;SubtractOperator&lt;/span&gt; &lt;span class="n"&gt;scmSubtractOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;UnaryMinusOperator&lt;/span&gt; &lt;span class="n"&gt;scmUnaryMinusOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;UnaryPlusOperator&lt;/span&gt; &lt;span class="n"&gt;scmUnaryPlusOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EndOperator&lt;/span&gt; &lt;span class="n"&gt;scmEndOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Member variables to store the expression, current expression character,&lt;/span&gt;
      &lt;span class="c1"&gt;// and current operator pointers.&lt;/span&gt;

      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;InfixOperator&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Member variables to store operand and operator stacks.&lt;/span&gt;

      &lt;span class="n"&gt;InfixStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;InfixStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Methods to parse an expected operand/operator at the current expression&lt;/span&gt;
      &lt;span class="c1"&gt;// character position (mExpressionChar).&lt;/span&gt;

      &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;parseOperand&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;parseOperator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

      &lt;span class="c1"&gt;// Constructor method.&lt;/span&gt;

      &lt;span class="n"&gt;InfixEvaluator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

      &lt;span class="c1"&gt;// Infix evaluation method.&lt;/span&gt;

      &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;InfixEvaluator.cpp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"InfixEvaluator.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"InfixParseException.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cmath&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// For convenience, we define the outer class name here; from here on down, the&lt;/span&gt;
&lt;span class="c1"&gt;// outer class name is accessible via the 'OUTER' macro.&lt;/span&gt;

&lt;span class="cp"&gt;#define OUTER InfixEvaluator
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Infix operator inner class constructor method.&lt;/span&gt;

&lt;span class="c1"&gt;// PARAMETERS: 1) Operator symbol&lt;/span&gt;
&lt;span class="c1"&gt;//             2) Operator precedence&lt;/span&gt;
&lt;span class="c1"&gt;//             3) Is operator left-associative&lt;/span&gt;

&lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pSymbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pSymbol&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;mPrecedence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pPrecedence&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;mIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Infix operator inner class 'return symbol' method.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS: The symbol associated with this operator.&lt;/span&gt;

&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mSymbol&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Infix operator inner class 'return precedence' method.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS: The precedence value associated with this operator.&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;precedence&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mPrecedence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Infix operator inner class 'return left-associative' method.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS: Whether or not this operator is left-associative.&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;isLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mIsLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Macro to denote the beginning of the infix precedence entries: the&lt;/span&gt;
&lt;span class="c1"&gt;// precedence counter is effectively reset to zero, and constants are defined&lt;/span&gt;
&lt;span class="c1"&gt;// for the number of precedence bits used and its associated overflow value&lt;/span&gt;
&lt;span class="c1"&gt;// (i.e. max precedence + 1).&lt;/span&gt;

&lt;span class="c1"&gt;// MACRO PARAMETERS: 1) Number of bits required to represent precedence values.&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_PRECEDENCE_BEGIN(NUMBER_OF_BITS)                        \
  constexpr unsigned int cInitialCounter = __COUNTER__;               \
  constexpr unsigned int cPrecedenceBits = NUMBER_OF_BITS;            \
  constexpr unsigned int cPrecedenceOverflow = (1 &amp;lt;&amp;lt; cPrecedenceBits)
&lt;/span&gt;
&lt;span class="c1"&gt;// Helper macro to return the current precedence value (autoincremented upon&lt;/span&gt;
&lt;span class="c1"&gt;// each invocation). Essentially, this macro returns the autoincremented&lt;/span&gt;
&lt;span class="c1"&gt;// system-wide counter, minus its initial value when the INFIX_PRECEDENCE_BEGIN&lt;/span&gt;
&lt;span class="c1"&gt;// macro was last executed (-1 to ensure it's zero-based).&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_COUNTER (__COUNTER__ - cInitialCounter - 1)
&lt;/span&gt;
&lt;span class="c1"&gt;// Macro to define consecutive incremental precedence constants (autoincremented&lt;/span&gt;
&lt;span class="c1"&gt;// upon each invocation).&lt;/span&gt;

&lt;span class="c1"&gt;// MACRO PARAMETERS: 1) C++ constant name.&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_PRECEDENCE(NAMED_CONSTANT)                \
  constexpr unsigned int NAMED_CONSTANT = INFIX_COUNTER
&lt;/span&gt;
&lt;span class="c1"&gt;// Macro to denote the end of the infix precedence entries: a static assert is&lt;/span&gt;
&lt;span class="c1"&gt;// issued at compile time, if the number of consecutive entires exceeds that&lt;/span&gt;
&lt;span class="c1"&gt;// which is representable by the specified number of precedence bits.&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_PRECEDENCE_END                            \
  constexpr unsigned int cFinalCounter = INFIX_COUNTER; \
  static_assert(cFinalCounter &amp;lt;= cPrecedenceOverflow,   \
                "Precedence exceeds number of bits!")
&lt;/span&gt;
&lt;span class="c1"&gt;// Define the precedence values used within this application (each consecutive&lt;/span&gt;
&lt;span class="c1"&gt;// entry has a higher value than its predecessor).&lt;/span&gt;

&lt;span class="n"&gt;INFIX_PRECEDENCE_BEGIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cEndPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cStartPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cAddSubPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cDivModMulPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cUnaryPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cExponentPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;INFIX_PRECEDENCE_END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Convenience macro for defining a monadic infix operator function (the 'RHS'&lt;/span&gt;
&lt;span class="c1"&gt;// parameter tag may be safely referenced from within the macro's 'EXPRESSION'&lt;/span&gt;
&lt;span class="c1"&gt;// argument).&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// All monadic functions exhibit the following pattern:&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// 1) Right-hand side (RHS) operand is popped off the operand stack.&lt;/span&gt;
&lt;span class="c1"&gt;// 2) The value of "operator RHS" is pushed back onto the operand stack.&lt;/span&gt;

&lt;span class="c1"&gt;// MACRO PARAMETERS: 1) Name of the outer InfixEvaluator object pointer.&lt;/span&gt;
&lt;span class="c1"&gt;//                   2) C/C++ code that defines the operator's functionality.&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_MONAD(EVALUATOR, EXPRESSION)    \
  double RHS = EVALUATOR.mOperandStack.pop(); \
  EVALUATOR.mOperandStack.push(EXPRESSION)
&lt;/span&gt;
&lt;span class="c1"&gt;// Convenience macro for defining a dyadic infix operator function (both 'LHS'&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;amp; 'RHS' parameter tags may be safely referenced from within the macro's&lt;/span&gt;
&lt;span class="c1"&gt;// 'EXPRESSION' argument).&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// All dyadic functions exhibit the following pattern:&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// 1) Right-hand side (RHS) operand is popped off the operand stack.&lt;/span&gt;
&lt;span class="c1"&gt;// 2) Left-hand side (LHS) operand is popped off the operand stack.&lt;/span&gt;
&lt;span class="c1"&gt;// 3) The value of "LHS operator RHS" is pushed back onto the operand stack.&lt;/span&gt;

&lt;span class="c1"&gt;// MACRO PARAMETERS: 1) Name of the outer InfixEvaluator object pointer.&lt;/span&gt;
&lt;span class="c1"&gt;//                   2) C/C++ code that defines the operator's functionality.&lt;/span&gt;

&lt;span class="cp"&gt;#define INFIX_DYAD(EVALUATOR, EXPRESSION)     \
  double RHS = EVALUATOR.mOperandStack.pop(); \
  double LHS = EVALUATOR.mOperandStack.pop(); \
  EVALUATOR.mOperandStack.push(EXPRESSION)
&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Convenience macro for defining the implementation of a concrete operator&lt;/span&gt;
&lt;span class="c1"&gt;// class. This implementation consists of a constructor and an overridden&lt;/span&gt;
&lt;span class="c1"&gt;// 'evluate' method.&lt;/span&gt;

&lt;span class="c1"&gt;// MACRO PARAMETERS: 1) Name of the operator class.&lt;/span&gt;
&lt;span class="c1"&gt;//                   2) Character symbol associated with this operator.&lt;/span&gt;
&lt;span class="c1"&gt;//                   3) Precedence value associated with this operator.&lt;/span&gt;
&lt;span class="c1"&gt;//                   4) Is operator left-associative (bool).&lt;/span&gt;
&lt;span class="c1"&gt;//                   5) C/C++ code that defines the operator's functionality.&lt;/span&gt;
&lt;span class="c1"&gt;//                      For convenience, the DYAD or MONAD macros are typically&lt;/span&gt;
&lt;span class="c1"&gt;//                      employed here.&lt;/span&gt;

&lt;span class="cp"&gt;#define OPERATOR_IMPLEMENTATION(NAME, SYMBOL, PRECEDENCE, LEFT_ASSOCIATIVE,    \
                                EXPRESSION)                                    \
                                                                               \
  &lt;/span&gt;&lt;span class="cm"&gt;/* Concrete operator inner class constructor method. */&lt;/span&gt;&lt;span class="cp"&gt;                      \
  OUTER::NAME::NAME()                                                          \
    : InfixOperator(SYMBOL, PRECEDENCE, LEFT_ASSOCIATIVE) {}                   \
                                                                               \
  &lt;/span&gt;&lt;span class="cm"&gt;/* Concrete operator inner class 'evaluate' method. */&lt;/span&gt;&lt;span class="cp"&gt;                       \
                                                                               \
  &lt;/span&gt;&lt;span class="cm"&gt;/* PARAMETERS: 1) Reference to outer evaluator object. For maximum        */&lt;/span&gt;&lt;span class="cp"&gt; \
  &lt;/span&gt;&lt;span class="cm"&gt;/*                generality, all processing will be performed within the */&lt;/span&gt;&lt;span class="cp"&gt; \
  &lt;/span&gt;&lt;span class="cm"&gt;/*                context of the outer object. This parameter can be      */&lt;/span&gt;&lt;span class="cp"&gt; \
  &lt;/span&gt;&lt;span class="cm"&gt;/*                safely referenced by name via the macro's 'EXPRESSION'  */&lt;/span&gt;&lt;span class="cp"&gt; \
  &lt;/span&gt;&lt;span class="cm"&gt;/*                parameter.                                              */&lt;/span&gt;&lt;span class="cp"&gt; \
  void OUTER::NAME::evaluate(OUTER &amp;amp;pEvaluator) const {EXPRESSION}
&lt;/span&gt;
&lt;span class="c1"&gt;// Define implementation for concrete 'StartOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StartOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'['&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cStartPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'ExponentOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExponentOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'^'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cExponentPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LHS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;));)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'DivideOperator' class. An exception is&lt;/span&gt;
&lt;span class="c1"&gt;// thrown if the RHS operand is zero.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DivideOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cDivModMulPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nf"&gt;ApplicationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Division by zero"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LHS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'ModuloOperator' class. An exception is&lt;/span&gt;
&lt;span class="c1"&gt;// thrown if the RHS operand is zero.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModuloOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cDivModMulPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nf"&gt;ApplicationException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Modulo of zero"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LHS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;));)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'MultiplyOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MultiplyOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cDivModMulPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LHS&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'AddOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AddOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cAddSubPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LHS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'SubtractOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubtractOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cAddSubPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_DYAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LHS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'UnaryMinusOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnaryMinusOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cUnaryPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_MONAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'UnaryPlusOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnaryPlusOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cUnaryPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;INFIX_MONAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RHS&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'EndOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EndOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'['&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cEndPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Declare storage for outer InfixEvaluator static operator objects.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;StartOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmStartOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ExponentOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmExponentOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DivideOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmDivideOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ModuloOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmModuloOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MultiplyOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmMultiplyOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AddOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmAddOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SubtractOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmSubtractOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UnaryMinusOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmUnaryMinusOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UnaryPlusOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmUnaryPlusOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;EndOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmEndOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Outer InfixEvaluator method to parse an expected operand at the current&lt;/span&gt;
&lt;span class="c1"&gt;// expression position, referenced via the 'mExpressionChar' member variable.&lt;/span&gt;
&lt;span class="c1"&gt;// Leading unary operators are iteratively stacked, and an 'InfixParseException'&lt;/span&gt;
&lt;span class="c1"&gt;// exception is thrown in the event of an absent or invalid operand.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS: The next infixed operand.&lt;/span&gt;

&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;parseOperand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Test current expression character.&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="c1"&gt;// Do nothing if current expression character is space or tab (i.e. skip&lt;/span&gt;
      &lt;span class="c1"&gt;// past white space).&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'\t'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Push unary minus operator onto operator stack if current expression&lt;/span&gt;
      &lt;span class="c1"&gt;// character is '-'. &lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmUnaryMinusOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Push unary plus operator onto operator stack if current expression&lt;/span&gt;
      &lt;span class="c1"&gt;// character is '+'. &lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmUnaryPlusOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Else, parse and return numeric operand, or throw exception upon error.&lt;/span&gt;
      &lt;span class="nl"&gt;default:&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;endptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;operand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strtod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;endptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endptr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Operand expected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      
        &lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;operand&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; 

    &lt;span class="c1"&gt;// Test next exception character.&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Outer InfixEvaluator method to parse an expected operator at the current&lt;/span&gt;
&lt;span class="c1"&gt;// expression position, referenced via the 'mExpressionChar' member variable. An&lt;/span&gt;
&lt;span class="c1"&gt;// 'InfixParseException' exception is thrown in the event of an absent or&lt;/span&gt;
&lt;span class="c1"&gt;// invalid operator.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS: The next infixed operator.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InfixOperator&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;parseOperator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// Skip past any whitespace characters at the current expression position.&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sc"&gt;' '&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\t'&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Test the current expression character and return the appropriate operator&lt;/span&gt;
  &lt;span class="c1"&gt;// object, or throw exception upon error.&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Return exponent operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'^'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmExponentOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return division operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmDivideOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return modulo operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'%'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmModuloOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return multiplication operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmMultiplyOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return addition operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmAddOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return subtraction operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmSubtractOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Return end of expression operator.&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'\0'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmEndOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Character is not a valid operator, so throw exception.&lt;/span&gt;
    &lt;span class="nl"&gt;default:&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Operator or EOL expected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mExpression&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Outer InfixEvaluator constructor method.&lt;/span&gt;

&lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// Initialise the bottom of the operator stack with a permanent instance of&lt;/span&gt;
  &lt;span class="c1"&gt;// 'scmStartOperator'. This will remain in situ for the life of the object,&lt;/span&gt;
  &lt;span class="c1"&gt;// simplifying the conditional logic of the main evaluation loop.&lt;/span&gt;
  &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmStartOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;

&lt;span class="c1"&gt;// Outer InfixEvaluator evaluation method.&lt;/span&gt;

&lt;span class="c1"&gt;// PARAMETERS: 1) Infix expression to be evaluated.&lt;/span&gt;

&lt;span class="c1"&gt;// RETURNS...: The evaluated valued of the supplied infix expression.&lt;/span&gt;

&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Initialise object's expression and expression character pointers.&lt;/span&gt;
    &lt;span class="n"&gt;mExpression&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pExpression&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// For simplicity, we'll initialise the current operator to&lt;/span&gt;
    &lt;span class="c1"&gt;// 'scmStartOperator'. As this operator is right-associative, it's&lt;/span&gt;
    &lt;span class="c1"&gt;// implicitly pushed onto the operator stack during the first iteration, and&lt;/span&gt;
    &lt;span class="c1"&gt;// harmlessly popped off again during the last (this operator performs a&lt;/span&gt;
    &lt;span class="c1"&gt;// NOP).&lt;/span&gt;
    &lt;span class="n"&gt;mCurrentOperator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmStartOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="c1"&gt;// If the operator at the top of the operator stack has higher precedence&lt;/span&gt;
      &lt;span class="c1"&gt;// than the current operator, or has the same precedence and is left-&lt;/span&gt;
      &lt;span class="c1"&gt;// associative, then pop and evaluate its value. Else, push the current&lt;/span&gt;
      &lt;span class="c1"&gt;// operator and next operand onto their respective stacks, and move onto&lt;/span&gt;
      &lt;span class="c1"&gt;// the next operator within the expression.&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;precedence&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
             &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;isLeftAssociative&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
               &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;precedence&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cPrecedenceBits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parseOperand&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;mCurrentOperator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseOperator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Continue the evaluation until the implicitly pushed 'scmStartOperator'&lt;/span&gt;
      &lt;span class="c1"&gt;// is eventually popped off the operator stack. NOTE: the permanent&lt;/span&gt;
      &lt;span class="c1"&gt;// 'scmStartOperator' placed on the operator stack during object&lt;/span&gt;
      &lt;span class="c1"&gt;// construction, remains in situ for the next evaluation (i.e. the&lt;/span&gt;
      &lt;span class="c1"&gt;// operator stack size is always &amp;gt; 0).&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Pop and return the final entry from the operand stack.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// In the event of an exception, we must ensure that both operand and&lt;/span&gt;
  &lt;span class="c1"&gt;// operator stacks are reset to their initialised state.&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Remove all elements from the operand stack.&lt;/span&gt;
    &lt;span class="n"&gt;mOperandStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Remove all but the permanent 'scmStartOperator' from the operator stack.&lt;/span&gt;
    &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Rethrow the caught exception.&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Glancing through the code above, there are a couple of interesting points to note about this particular implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In an effort to significantly reduce code repetition (and thus protect my sanity), C macros have been used liberally throughout. Sorry guys, but ‘Macrophobia’ is merely the illogical fear of an otherwise useful, and IMHO, irreplaceable tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As previously mentioned, all operators are implemented via inner classes encapsulated within the evaluator class itself. For maximum flexibility, the operator’s ‘evaluate’ method receives a reference to the outer evaluator object rather than the operands themselves (as is usually the case).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appropriately biased “StartOperator” and “EndOperator” operators are employed to ‘mainstream’ the corner-case logic (i.e. the initial state, empty stack, and end-of-expression conditions are all handled by the existing precedence logic). Of particular interest, a permanent “StartOperator” object should ALWAYS be present at the bottom of the operator stack: special care should be taken to restore this state in the event of an evaluation exception. Due to the minimal initialisation state, it should also be noted that a second “StartOperator” is innocuously pushed and popped at the beginning and end of the evaluation process, respectively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The primary precedence/associativity condition used within this code is merely the arithmetic equivalent of the standard precedence &amp;amp; associativity conditions:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmb3mqjy2ep5qjbun4ey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmb3mqjy2ep5qjbun4ey.png" alt="Precedence Conditions"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Having a working implementation is all well and good, but an infix expression is of little value if we cannot use parentheses to override the default precedence. Thankfully, given the generalised approach adopted thus far, it’s a relatively trivial task to implement parentheses support within the existing class structure.&lt;/p&gt;

&lt;p&gt;First, we’ll need to define two new operator classes for the left and right parentheses, respectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LeftParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_CLASS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;LeftParenthesisOperator&lt;/span&gt; &lt;span class="n"&gt;scmLeftParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;RightParenthesisOperator&lt;/span&gt; &lt;span class="n"&gt;scmRightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;… and define their precedence and implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;INFIX_PRECEDENCE_BEGIN&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cEndPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cRightParenthesisPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cLeftParenthesisPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cStartPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cAddSubPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cDivModMulPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cUnaryPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;INFIX_PRECEDENCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cExponentPrecedence&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'LeftParenthesisOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LeftParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cLeftParenthesisPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scmRightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nf"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Right parenthesis expected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
                                  &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpression&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseOperator&lt;/span&gt;&lt;span class="p"&gt;();)&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Define implementation for concrete 'RightParenthesisOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;cRightParenthesisPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The left parenthesis operator, having checked the current operator is a right parenthesis (only a right parenthesis or an end operator has the precedence to force its evaluation), merely parses the next operator from the expression string. The right parenthesis operator, which is never evaluated, performs a no-operation (NOP).&lt;/p&gt;

&lt;p&gt;Next, we’ll need to declare storage for our two new operators and update the operand and operator parsing methods to return each of them, respectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LeftParenthesisOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmLeftParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RightParenthesisOperator&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scmRightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Push left parenthesis operator onto operator stack if current&lt;/span&gt;
&lt;span class="c1"&gt;// expression character is '('.&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;mOperatorStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmLeftParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Return right parenthesis operator.&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;')'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;scmRightParenthesisOperator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the Start operator’s ‘evaluate’ method should be updated to check for any unmatched right parentheses (an unmatched right parenthesis will drive the evaluation back to the nearest start operator):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define implementation for concrete 'StartOperator' class.&lt;/span&gt;
&lt;span class="n"&gt;OPERATOR_IMPLEMENTATION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StartOperator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'['&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cStartPrecedence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mCurrentOperator&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scmEndOperator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nf"&gt;InfixParseException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Unmatched right parenthesis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                              &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpressionChar&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
                                &lt;span class="n"&gt;pEvaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mExpression&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;In the interests of completeness, we’ll also include an example ‘main.cpp’ and basic Makefile for good measure:&lt;/p&gt;




&lt;p&gt;main.cpp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"InfixEvaluator.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"ApplicationException.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;returnCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
                 &lt;span class="s"&gt;"=========================&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
                 &lt;span class="s"&gt;"Iterative Infix Evaluator&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
                 &lt;span class="s"&gt;"(C) 2025, The Code Asylum&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
                 &lt;span class="s"&gt;"=========================&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Usage: InfixEvaluator 'expression'"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;InfixEvaluator&lt;/span&gt; &lt;span class="n"&gt;ie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" = "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;returnCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ApplicationException&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;returnCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;returnCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;returnCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Makefile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CC = g++
LD = g++

EXEC = InfixEvaluator
LFLAGS =
CFLAGS = -O2 -DNDEBUG

################################################################################

$(EXEC): main.o \
         ApplicationException.o \
         InfixParseException.o \
         InfixEvaluator.o
    $(LD) $^ -o $@ $(LFLAGS)

main.o: main.cpp
    $(CC) $(CFLAGS) -c $&amp;lt; -o $@

ApplicationException.o: ApplicationException.cpp ApplicationException.h
    $(CC) $(CFLAGS) -c $&amp;lt; -o $@

InfixParseException.o: InfixParseException.cpp InfixParseException.h
    $(CC) $(CFLAGS) -c $&amp;lt; -o $@

InfixEvaluator.o: InfixEvaluator.cpp InfixEvaluator.h
    $(CC) $(CFLAGS) -c $&amp;lt; -o $@

################################################################################

all: $(EXEC)

################################################################################

clean:
    @rm -rf $(EXEC)
    @rm -rf *.o

################################################################################

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;For those wishing to follow along, the video below presents a visualisation of this particular algorithm at work:&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/ZlF4WK1XTos"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;p&gt;All of the code related to this article is available at our &lt;a href="https://github.com/the-code-asylum-git/Iterative-Infix-Evaluator" rel="noopener noreferrer"&gt;git repository&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;In part 2, we’ll take a look at how a recursive solution achieves the same result without explicit std::stack structures.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>algorithms</category>
      <category>tutorial</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
