You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 line
11 KiB

  1. <!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><title>Interpreter.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="http://yandex.st/highlightjs/6.2/styles/idea.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Google Code" href="http://yandex.st/highlightjs/6.2/styles/googlecode.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="GitHub" href="http://yandex.st/highlightjs/6.2/styles/github.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Visual Studio" href="http://yandex.st/highlightjs/6.2/styles/vs.min.css"/><link rel="alternate stylesheet" class="codebrush light" title="Magula" href="http://yandex.st/highlightjs/6.2/styles/magula.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Zenburn" href="http://yandex.st/highlightjs/6.2/styles/zenburn.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Arta" href="http://yandex.st/highlightjs/6.2/styles/arta.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Monokai" href="http://yandex.st/highlightjs/6.2/styles/monokai.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="IR Black" href="http://yandex.st/highlightjs/6.2/styles/ir_black.min.css"/><link rel="alternate stylesheet" class="codebrush dark" title="Solarized Dark" href="http://yandex.st/highlightjs/6.2/styles/solarized_dark.min.css"/><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script><script type="text/javascript" src="http://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="#">Interpreter.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><a href="../../../../src/main/java/interpreter/Evaluator.java.html">Evaluator.java</a></li><li class="active"><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 class="active"><a href="#">Horizontal</a></li><li><a href="../../../../../vertical/src/main/java/interpreter/Interpreter.java.html">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>Interpreter</h1><p>The interpreter consists of the <code>Interpreter</code> defined in this file that can run a <code>Program</code> and the <code>Evaluator</code> that can evaluate an <code>Expression</code>.</p><p>The interpreter implements the semantics defined by the function <code>sem: Prog * V -&gt; V</code>, where <code>V = Id -&gt; Z</code> is the set of all variable valuations to the set <code>Z</code> set of integers. <code>sem</code> is inductively defined as follows:</p>
  2. <pre><code>sem(x &quot;:=&quot; e, v) = v.update(x, eval(e, v))
  3. sem(c1 &quot;;&quot; c2) = sem(c2, sem(c1, v))
  4. sem(&quot;if&quot; &quot;(&quot; e &quot;)&quot; &quot;then&quot; &quot;{&quot; c1 &quot;}&quot; else &quot;{&quot; c2 &quot;}&quot;) =
  5. sem(c1, v) if eval(e, v) != 0
  6. sem(c2, v) else
  7. sem(&quot;while&quot; &quot;(&quot; e &quot;)&quot; &quot;{&quot; c &quot;}&quot;, v) =
  8. sem(c &quot;;&quot; &quot;while&quot; &quot;(&quot; e &quot;)&quot; &quot;{&quot; c &quot;}&quot;, v) if eval(e, v) != 0
  9. v else
  10. </code></pre><p>with</p>
  11. <ul>
  12. <li>a variable valuation <code>v</code>,</li>
  13. <li>an expression <code>e</code>,</li>
  14. <li>an identifier <code>x</code> and</li>
  15. <li>programs <code>c</code>, <code>c1</code>, <code>c2</code>.</li>
  16. </ul><p>The evaluation function <code>eval</code> is described at the <a href="../../../../src/main/java/interpreter/Evaluator.java.html">Evaluator</a>.</p></div></div><div id="section-0" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-0">0</a></span><div class="doctext hidden-doc"></div></div><div class="span6 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;
  17. import program.*;
  18. import java.util.HashMap;
  19. import java.util.Map;</code></pre></div></div><div id="section-1" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-1">1</a></span><div class="doctext"><p>The <code>Interpreter</code> implements the semantic function defined above with the help of the <a href="../../../../src/main/java/interpreter/Visitor.java.html">Visitor</a>. The <code>Interpreter</code> runs the given <code>Program</code> in the constructor and can be used as follows on a given <code>program</code> of type <code>Program</code>.</p>
  20. <pre><code>Interpreter interpreter = new Interpreter(program);
  21. System.out.println(interpreter.getValuation());
  22. </code></pre><p>The semantic function <code>sem</code> passes along the variable valuation <code>v</code>. In the <code>Interpreter</code> the valuation is realized as global variable <code>valuation</code>. Because of the in-order execution this global variable always represents the state of the <code>v</code> passed to the semantic function <code>sem</code>. </p></div></div><div class="span6 code"><pre><code class="java">public class Interpreter extends Visitor {
  23. private final Map&lt;String, Integer&gt; valuation = new HashMap&lt;String, Integer&gt;();
  24. public Map&lt;String, Integer&gt; getValuation() {
  25. Map&lt;String, Integer&gt; result = new HashMap&lt;String, Integer&gt;();
  26. result.putAll(valuation);
  27. return result;
  28. }
  29. public Interpreter(Program program) {
  30. visit(program);
  31. }</code></pre></div></div><div id="section-2" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-2">2</a></span><div class="doctext"><pre><code>sem(x &quot;:=&quot; e, v) = v.update(x, eval(e, v))
  32. </code></pre></div></div><div class="span6 code"><pre><code class="java"> public void visitAssignment(Assignment assignment) {
  33. Evaluator evaluator = new Evaluator(assignment.expression, valuation);
  34. valuation.put(assignment.identifier.name, evaluator.getValue());
  35. }</code></pre></div></div><div id="section-3" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-3">3</a></span><div class="doctext"><pre><code>sem(c1 &quot;;&quot; c2) = sem(c2, sem(c1, v))
  36. </code></pre></div></div><div class="span6 code"><pre><code class="java"> public void visitComposition(Composition composition) {
  37. visit(composition.first);
  38. visit(composition.second);
  39. }</code></pre></div></div><div id="section-4" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-4">4</a></span><div class="doctext"><pre><code>sem(&quot;if&quot; &quot;(&quot; e &quot;)&quot; &quot;then&quot; &quot;{&quot; c1 &quot;}&quot; else &quot;{&quot; c2 &quot;}&quot;) =
  40. sem(c1, v) if eval(e, v) != 0
  41. sem(c2, v) else
  42. </code></pre></div></div><div class="span6 code"><pre><code class="java"> public void visitConditional(Conditional conditional) {
  43. Evaluator evaluator = new Evaluator(conditional.condition, valuation);
  44. if (evaluator.getValue() != 0) {
  45. visit(conditional.thenCase);
  46. } else {
  47. visit(conditional.elseCase);
  48. }
  49. }</code></pre></div></div><div id="section-5" class="row-fluid docco-section"><div class="span6 doc"><span class="label label-info"><a style="color:white" href="#section-5">5</a></span><div class="doctext"><pre><code>sem(&quot;while&quot; &quot;(&quot; e &quot;)&quot; &quot;{&quot; c &quot;}&quot;, v) =
  50. sem(c &quot;;&quot; &quot;while&quot; &quot;(&quot; e &quot;)&quot; &quot;{&quot; c &quot;}&quot;, v) if eval(e, v) != 0
  51. v else
  52. </code></pre></div></div><div class="span6 code"><pre><code class="java"> public void visitLoop(Loop loop) {
  53. Evaluator evaluator = new Evaluator(loop.condition, valuation);
  54. if (evaluator.getValue() != 0) {
  55. visit(new Composition(loop.program, loop));
  56. }
  57. }
  58. }</code></pre></div></div></div><div id="grabber"></div></body></html>