amath  1.8.5
Simple command line calculator
evaluator.cpp
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 2014-2018 Carsten Sonne Larsen <cs@innolan.net>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  * Project homepage:
26  * https://amath.innolan.net
27  *
28  */
29 
30 #include "amath.h"
31 #include "parser.h"
32 #include "viewer.h"
33 #include "optimizer.h"
34 #include "evaluator.h"
35 
36 Evaluator::Evaluator(const char* input)
37 {
38  this->input = input;
39  output = new CharBuffer();
40 }
41 
43 {
44  if (output != nullptr)
45  {
46  delete output;
47  }
48 }
49 
50 void Evaluator::Evaluate() const
51 {
53 
54  Parser* parser = new Parser(input);
55  SyntaxNode* node = parser->Parse();
56  delete parser;
57 
58 #if defined(DEBUGTREE)
59  Viewer* viewer = new Viewer(node);
60  const char* vout = viewer->GetTree();
61  output->EnsureGrowth(StrLen(vout));
62  output->Append(vout);
63  delete viewer;
64 #endif
65 
66  Optimizer* optimizer = new Optimizer(node);
67  optimizer->Optimize();
68  node = optimizer->GetRoot();
69  delete optimizer;
70 
71 #if defined(DEBUGTREE)
72  viewer = new Viewer(node);
73  vout = viewer->GetTree();
74  output->EnsureGrowth(StrLen(vout));
75  output->Append(vout);
76  delete viewer;
77 
78  const char* out = node->Execute();
79  output->EnsureGrowth(StrLen(out));
80  output->Append(out);
81 #endif
82 
83 #ifndef DEBUGTREE
84  const char* out = node->Execute();
86 #endif
87 
88  delete node;
89 }
90 
91 char* Evaluator::GetResult() const
92 {
93  return output->GetString();
94 }
char * GetResult() const
Definition: evaluator.cpp:91
char * GetString() const
Definition: charbuf.cpp:306
Base class for all nodes in a syntax tree.
Definition: nodes.h:65
Optimizer(SyntaxNode *root)
Definition: optimizer.cpp:35
void ClearBuffer()
Release memory in buffer.
Definition: charbuf.cpp:65
CharBuffer()
Initialize without allocating memory.
Definition: charbuf.cpp:38
void Optimize() const
Definition: optimizer.cpp:49
virtual char * Execute()=0
Parser(const char *input)
Definition: parser.cpp:43
Evaluator(const char *input)
Definition: evaluator.cpp:36
CharBuffer * output
Definition: evaluator.h:45
SyntaxNode * GetRoot() const
Definition: optimizer.cpp:44
const char * input
Definition: evaluator.h:44
void Evaluate() const
Definition: evaluator.cpp:50
void ClearAndCopy(const char *source)
Release memory, allocate and copy source.
Definition: charbuf.cpp:81
SyntaxNode * Parse()
Parses the input into a syntax tree.
Definition: parser.cpp:56
Encapsulate an character array which can be used as a string.
Definition: charbuf.h:44
Encapsulates a recursive descent parser.
Definition: parser.h:49