|
- <!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><title>Evaluator.java</title><link href="../../../../css/bootstrap.min.css" rel="stylesheet" type="text/css"/><link href="../../../../css/bootstrap-responsive.min.css" rel="stylesheet" type="text/css"/><link href="../../../../css/atlassian-docco.css" rel="stylesheet" type="text/css"/><link rel="stylesheet" class="codebrush light" title="IDEA" href="//yandex.st/highlightjs/6.2/styles/idea.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Google Code" href="//yandex.st/highlightjs/6.2/styles/googlecode.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="GitHub" href="//yandex.st/highlightjs/6.2/styles/github.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Visual Studio" href="//yandex.st/highlightjs/6.2/styles/vs.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Magula" href="//yandex.st/highlightjs/6.2/styles/magula.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Zenburn" href="//yandex.st/highlightjs/6.2/styles/zenburn.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Arta" href="//yandex.st/highlightjs/6.2/styles/arta.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Monokai" href="//yandex.st/highlightjs/6.2/styles/monokai.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="IR Black" href="//yandex.st/highlightjs/6.2/styles/ir_black.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Solarized Dark" href="//yandex.st/highlightjs/6.2/styles/solarized_dark.min.css"/><script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script><script type="text/javascript" src="//yandex.st/highlightjs/6.2/highlight.min.js"></script><script type="text/javascript" src="../../../../js/jquery.cookie.js"></script><script type="text/javascript" src="../../../../js/bootstrap.min.js"></script><script type="text/javascript" src="../../../../js/atlassian-docco.js"></script></head><body><div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container-fluid"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="#">Evaluator.java</a><div class="nav-collapse"><ul class="nav"><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Index <b class="caret"></b></a><ul class="dropdown-menu"><li class="nav-header">Expression</li><li><a href="../../../../src/main/java/expression/Addition.java.html">Addition.java</a></li><li><a href="../../../../src/main/java/expression/Expression.java.html">Expression.java</a></li><li><a href="../../../../src/main/java/expression/Identifier.java.html">Identifier.java</a></li><li><a href="../../../../src/main/java/expression/Int.java.html">Int.java</a></li><li><a href="../../../../src/main/java/expression/Subtraction.java.html">Subtraction.java</a></li><li class="nav-header">Interpreter</li><li class="active"><a href="../../../../src/main/java/interpreter/Evaluator.java.html">Evaluator.java</a></li><li><a href="../../../../src/main/java/interpreter/Interpreter.java.html">Interpreter.java</a></li><li><a href="../../../../src/main/java/interpreter/InterpreterException.java.html">InterpreterException.java</a></li><li><a href="../../../../src/main/java/interpreter/Visitor.java.html">Visitor.java</a></li><li class="nav-header">Parser</li><li><a href="../../../../src/main/java/parser/Parser.java.html">Parser.java</a></li><li><a href="../../../../src/main/java/parser/SyntaxException.java.html">SyntaxException.java</a></li><li class="nav-header">Printer</li><li><a href="../../../../src/main/java/printer/ExpressionPrinter.java.html">ExpressionPrinter.java</a></li><li><a href="../../../../src/main/java/printer/ProgramPrinter.java.html">ProgramPrinter.java</a></li><li class="nav-header">Program</li><li><a href="../../../../src/main/java/program/Assignment.java.html">Assignment.java</a></li><li><a href="../../../../src/main/java/program/Composition.java.html">Composition.java</a></li><li><a href="../../../../src/main/java/program/Conditional.java.html">Conditional.java</a></li><li><a href="../../../../src/main/java/program/Loop.java.html">Loop.java</a></li><li><a href="../../../../src/main/java/program/Program.java.html">Program.java</a></li></ul></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Theme <b class="caret"></b></a><ul id="themeDropdown" class="dropdown-menu"></ul></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Layout <b class="caret"></b></a><ul class="dropdown-menu"><li><a href="../../../../../horizontal/src/main/java/interpreter/Evaluator.java.html">Horizontal</a></li><li class="active"><a href="#">Vertical</a></li></ul></li></ul></div><!--/.nav-collapse --></div></div></div><div class="container-fluid docco-container"><div class="row-fluid"><div class="span12"><h1>Evaluator</h1><p>The evaluator implements the semantics defined by the function <code>eval: Expr * V -> Z</code>, where <code>V = Id -> Z</code> is the set of all variable valuations to the set <code>Z</code> set of integers. <code>eval</code> is inductively defined as follows:</p>
- <pre><code>eval(e1 "+" e2, v) = eval(e1, v) + eval(e2, v)
- eval(e1 "-" e2, v) = eval(e1, v) − eval(e2, v)
- eval(x, v) = v(x)
- eval(z, v) = z
- </code></pre><p>with</p>
- <ul>
- <li>expressions <code>e</code>, <code>e1</code>, <code>e2</code>,</li>
- <li>a variable valuation <code>v</code>,</li>
- <li>and identifier <code>x</code> and</li>
- <li>an integer <code>z</code>.</li>
- </ul></div></div><div id="section-0" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-0">0</a></span><div class="doctext hidden-doc"></div></div></div><div class="row-fluid"><div class="span12 code"><div class="hidden-code-line">------------------<a href="javascript:void(0)" class="hidden-code-toggle" index="0">Show Header Code (<span class="linecount"></span> lines)</a>------------------</div><pre class="hidden-code"><code class="java">package interpreter;
-
- import expression.*;
-
- import java.util.HashMap;
- import java.util.Map;</code></pre></div></div></div><div id="section-1" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-1">1</a></span><div class="doctext"><p>The <code>Evaluator</code> implements the evaluation function defined above with the help of the <a href="../../../../src/main/java/interpreter/Visitor.java.html">Visitor</a>. The <code>Evaluator</code> takes an <code>Expression</code> in the constructor and provides a method <code>eval()</code> which evaluates the given expression and returns the result as an integer. For a given <code>expression</code> of type <code>Expression</code> it can be used as follows</p>
- <pre><code>Evaluator evaluator = new Evaluator(expression, valuation)
- System.out.println(evaluator.getValue());
- </code></pre><p>The evaluation function <code>eval</code> takes the variable valuation <code>v</code>, which is passed on recursively. As the valuation is not changed during the evaluation process, it can be stored in a global variable which is not changed. </p></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java">public class Evaluator extends Visitor<Integer> {
- private final int value;
- private final Map<String, Integer> valuation = new HashMap<String, Integer>();
-
- public Evaluator(Expression expression, Map<String, Integer> valuation) {
- this.valuation.putAll(valuation);
- value = visit(expression);
- }
-
- public int getValue() {
- return value;
- }</code></pre></div></div></div><div id="section-2" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-2">2</a></span><div class="doctext"><pre><code>eval(e1 "+" e2, v) = eval(e1, v) + eval(e2, v)
- </code></pre></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java"> public Integer visitAddition(Addition addition) {
- return visit(addition.leftHandSide) + visit(addition.rightHandSide);
- }</code></pre></div></div></div><div id="section-3" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-3">3</a></span><div class="doctext"><pre><code>eval(e1 "-" e2, v) = eval(e1, v) - eval(e2, v)
- </code></pre></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java"> public Integer visitSubtraction(Subtraction subtraction) {
- return visit(subtraction.leftHandSide) - visit(subtraction.rightHandSide);
- }</code></pre></div></div></div><div id="section-4" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-4">4</a></span><div class="doctext"><pre><code>eval(x, v) = v(x)
- </code></pre></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java"> public Integer visitInt(Int integer) {
- return integer.value;
- }
-
- public Integer visitIdentifier(Identifier identifier) {</code></pre></div></div></div><div id="section-5" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-5">5</a></span><div class="doctext"><p>Make sure that the identifier actually exists in the valuation and raise an exception otherwise. </p></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java"> if (valuation.containsKey(identifier.name)) {</code></pre></div></div></div><div id="section-6" class="docco-section"><div class="row-fluid"><div class="span12 doc"><span class="label label-info"><a style="color:white" href="#section-6">6</a></span><div class="doctext"><pre><code>eval(z, v) = z
- </code></pre></div></div></div><div class="row-fluid"><div class="span12 code"><pre><code class="java"> return valuation.get(identifier.name);
- } else {
- throw new InterpreterException("Identifier " + identifier.name + " not found.");
- }
- }
- }</code></pre></div></div></div></div></body></html>
|