<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marius Bancila's Blog &#187; RPN</title>
	<atom:link href="http://mariusbancila.ro/blog/tag/rpn/feed/" rel="self" type="application/rss+xml" />
	<link>http://mariusbancila.ro/blog</link>
	<description>Sharing my opinions and ideas!</description>
	<lastBuildDate>Fri, 06 Apr 2012 13:45:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Evaluating Expressions &#8211; Part 1: The Approaches</title>
		<link>http://mariusbancila.ro/blog/2009/02/03/evaluating-expressions-part-1/</link>
		<comments>http://mariusbancila.ro/blog/2009/02/03/evaluating-expressions-part-1/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 14:56:12 +0000</pubDate>
		<dc:creator>Marius Bancila</dc:creator>
				<category><![CDATA[Articles & Tutorials]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[AST]]></category>
		<category><![CDATA[expression]]></category>
		<category><![CDATA[RPN]]></category>

		<guid isPermaLink="false">http://mariusbancila.ro/blog/?p=148</guid>
		<description><![CDATA[I was discussing a few days ago about evaluating expressions and I decided to explain how you can build an evaluator. I will do this in a series of posts, getting one step more in each post. I will use C++, but the approaches are the same regardless the language. Let&#8217;s consider this expression: 1+2*3. [...]]]></description>
			<content:encoded><![CDATA[<p>I was discussing a few days ago about evaluating expressions and I decided to explain how you can build an evaluator. I will do this in a series of posts, getting one step more in each post. I will use C++, but the approaches are the same regardless the language.</p>
<p>Let&#8217;s consider this expression: 1+2*3. The value of this expression is 7. But how do you evaluate it in a language like C++ if you get it as a string? First of all this is a so called &#8220;infix&#8221; notation. There are also prefix and postfix notation. The terms infix, prefix and postfix refer to the position of the operator related to the operands:</p>
<ul>
<li><b>Prefix</b>: <i>operator</i> operand1 operand2 (ex: + 1 2)</li>
<li><b>Infix</b>: operand1 <i>operator</i> operand2 (ex: 1 + 2)</li>
<li><b>Postfix</b>: operand1 operand2 <i>operator</i> (ex: 1 2 +)</li>
</ul>
<p>The human understandable notation is infix. But it turns out that trying to parse a string with infix expression, from left to right and evaluate it is not possible. Because you cannot now what in advance and operators have different precedence; and there are parentheses too.</p>
<p>To solve the problem you&#8217;d have to build a helper structure representing the infix expression. There are two possibilities:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation" target="_blank">Reverse Polish Notation</a> (RPN) implies transforming the infix expression in a postfix expression and then evaluating it from left to right. 1 + 2*3 is transformed into 1 2 3 * +. You go from left to right until you find an operator, evaluate the expression and then replace it in the stack.</li>
<li><a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree" target="_blank">
<p>Abstract Syntax Tree</a> (AST) is an abstract representation of an expression, with inner nodes representing operators and leafs representing numbers.</p>
<p><img style="vertical-align: middle;" src="/blog/wp-content/uploads/2009/02/ast.png" alt="Abstract Syntax Tree" width="177" height="154" /></p>
</li>
</ul>
<p>The RPN is harder to build and evaluate in my opinion, so I will focus on the approach with the AST.</p>
<p>We build an AST while parsing the expression. First, we&#8217;ll have to define the grammar for the expression. Otherwise we wouldn&#8217;t know what to parse. </p>
<pre class="prettyprint">
EXP -> EXP + EXP | EXP - EXP | EXP * EXP | EXP / EXP | - EXP | (EXP) | number
</pre>
<p>First, this grammar is recursive, as you can see, but another important problem is that it does not represent the precedence of the operators. For this reasons, a better grammar is this:</p>
<pre class="prettyprint">
EXP    -> EXP + TERM |
          EXP - TERM |
          TERM
TERM   -> TERM * FACTOR |
          TERM / FACTOR |
          FACTOR
FACTOR -> ( EXP ) | - EXP | number
</pre>
<p>These rules written above are called productions. The symbols used are:</p>
<ul>
<li>EXP, TERM, FACTOR are called non-terminal symbols</li>
<li>+, -, /, *, (, ) number are called terminal symbols</li>
<li>EXT is the start symbol</li>
</ul>
<p>While the grammar has the correct operator precedence, it&#8217;s still recursive, or more precisely, left-recursive. You can see that EXP goes into EXP then operator + then TERM. You never reach to match operator + because you have start again and again with a new expression. There are techniques for eliminating this recursion and the result is:</p>
<pre class="prettyprint">
EXP    -> TERM EXP1
EXP1   -> + TERM EXP1 |
          - TERM EXP1 |
          epsilon
TERM   -> FACTOR TERM1
TERM1  -> * FACTOR TERM1 |
          / FACTOR TERM1 |
          epsilon
FACTOR -> ( EXP ) | - EXP | number
</pre>
<p>&#8216;epsilon&#8217; here means &#8216;nothing&#8217;.</p>
<p>With the theory (well, this is just the tip of the iceberg, but should be a good start for you) in place we&#8217;ll have to do three things:</p>
<ul>
<li><a href="http://mariusbancila.ro/blog/?p=149">Parse the expression</a></li>
<li><a href="http://mariusbancila.ro/blog/?p=150">Build the abstract syntax tree</a></li>
<li><a href="http://mariusbancila.ro/blog/?p=151">Evaluate the abstract syntax tree</a></li>
</ul>
<p>The first two steps will be done the same time, but I&#8217;ll take them one at a time and explain it in details.</p>
<p>Before you continue with the implementation details, I suggest you read more about both RPN and AST and grammars.</p>
<p>Here are several references:</p>
<ul>
<li><a href="http://www.csse.monash.edu.au/~lloyd/tildeProgLang/Grammar/" target="_blank">Syntax, Grammar</a></li>
<li><a href="http://www.csse.monash.edu.au/~lloyd/tildeProgLang/Grammar/Arith-Exp/" target="_blank">Arithmetic Expressions</a></li>
<li><a href="http://www.csse.monash.edu.au/~lloyd/tildeProgLang/Grammar/Abstract/" target="_blank">Abstract Syntax</a></li>
<li><a href="http://www.csse.monash.edu.au/~lloyd/tildeProgLang/Grammar/Top-Down/" target="_blank">Top-Down Parsing</a></li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://mariusbancila.ro/blog/2009/02/03/evaluating-expressions-part-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

