Go to the documentation of this file.00001 #ifndef THYMIO_INTERMEDIATE_REPRESENTATION_H
00002 #define THYMIO_INTERMEDIATE_REPRESENTATION_H
00003
00004 #include <vector>
00005 #include <string>
00006 #include <map>
00007 #include <set>
00008 #include <iostream>
00009
00010 namespace Aseba
00011 {
00012 using namespace std;
00013
00014 enum ThymioIRButtonName
00015 {
00016 THYMIO_BUTTONS_IR = 0,
00017 THYMIO_PROX_IR,
00018 THYMIO_PROX_GROUND_IR,
00019 THYMIO_TAP_IR,
00020 THYMIO_CLAP_IR,
00021 THYMIO_MOVE_IR,
00022 THYMIO_COLOR_IR,
00023 THYMIO_CIRCLE_IR,
00024 THYMIO_SOUND_IR,
00025 THYMIO_MEMORY_IR
00026 };
00027
00028 enum ThymioIRErrorCode
00029 {
00030 THYMIO_NO_ERROR = 0,
00031 THYMIO_MISSING_EVENT,
00032 THYMIO_MISSING_ACTION,
00033 THYMIO_EVENT_MULTISET,
00034 THYMIO_INVALID_CODE
00035 };
00036
00037 enum ThymioIRErrorType
00038 {
00039 THYMIO_NO_TYPE_ERROR = 0,
00040 THYMIO_SYNTAX_ERROR,
00041 THYMIO_TYPE_ERROR,
00042 THYMIO_CODE_ERROR
00043 };
00044
00045 class ThymioIRVisitor;
00046
00047 class ThymioIRButton
00048 {
00049 public:
00050 ThymioIRButton(int size=0, ThymioIRButtonName n=THYMIO_BUTTONS_IR, int states=2);
00051 ~ThymioIRButton();
00052
00053 void setClicked(int i, int status);
00054 int isClicked(int i) const;
00055 int getNumStates() const;
00056 int size() const;
00057 void setMemoryState(int s);
00058 int getMemoryState() const;
00059
00060 ThymioIRButtonName getName() const;
00061 void setBasename(wstring n);
00062 wstring getBasename() const;
00063
00064 bool isEventButton() const;
00065 bool isSet() const;
00066
00067 void accept(ThymioIRVisitor *visitor);
00068
00069 private:
00070 vector<int> buttons;
00071 int memory;
00072 int numStates;
00073 ThymioIRButtonName name;
00074 wstring basename;
00075 };
00076
00077 class ThymioIRButtonSet
00078 {
00079 public:
00080 ThymioIRButtonSet(ThymioIRButton *event=0, ThymioIRButton *action=0);
00081
00082 void addEventButton(ThymioIRButton *event);
00083 void addActionButton(ThymioIRButton *action);
00084
00085 ThymioIRButton *getEventButton();
00086 ThymioIRButton *getActionButton();
00087
00088 bool hasEventButton() const;
00089 bool hasActionButton() const;
00090
00091 void accept(ThymioIRVisitor *visitor);
00092
00093 private:
00094 ThymioIRButton *eventButton;
00095 ThymioIRButton *actionButton;
00096 };
00097
00098 class ThymioIRVisitor
00099 {
00100 public:
00101 ThymioIRVisitor() : errorCode(THYMIO_NO_ERROR) {}
00102
00103 virtual void visit(ThymioIRButton *button);
00104 virtual void visit(ThymioIRButtonSet *buttonSet);
00105
00106 ThymioIRErrorCode getErrorCode() const;
00107 bool isSuccessful() const;
00108
00109 protected:
00110 ThymioIRErrorCode errorCode;
00111 wstring toWstring(int val);
00112 };
00113
00114 class ThymioIRTypeChecker : public ThymioIRVisitor
00115 {
00116 public:
00117 ThymioIRTypeChecker() : ThymioIRVisitor(), activeActionName(THYMIO_BUTTONS_IR) {}
00118 ~ThymioIRTypeChecker();
00119
00120 virtual void visit(ThymioIRButton *button);
00121 virtual void visit(ThymioIRButtonSet *buttonSet);
00122
00123 void reset();
00124 void clear();
00125
00126 private:
00127 ThymioIRButtonName activeActionName;
00128
00129 multimap<wstring, ThymioIRButton*> moveHash;
00130 multimap<wstring, ThymioIRButton*> colorHash;
00131 multimap<wstring, ThymioIRButton*> circleHash;
00132 multimap<wstring, ThymioIRButton*> soundHash;
00133 multimap<wstring, ThymioIRButton*> memoryHash;
00134
00135 set<ThymioIRButtonName> tapSeenActions;
00136 set<ThymioIRButtonName> clapSeenActions;
00137 };
00138
00139 class ThymioIRSyntaxChecker : public ThymioIRVisitor
00140 {
00141 public:
00142 ThymioIRSyntaxChecker() : ThymioIRVisitor() {}
00143 ~ThymioIRSyntaxChecker() {}
00144
00145 virtual void visit(ThymioIRButton *button);
00146 virtual void visit(ThymioIRButtonSet *buttonSet);
00147
00148 void clear() {}
00149 };
00150
00151 class ThymioIRCodeGenerator : public ThymioIRVisitor
00152 {
00153 public:
00154 ThymioIRCodeGenerator();
00155 ~ThymioIRCodeGenerator();
00156
00157 virtual void visit(ThymioIRButton *button);
00158 virtual void visit(ThymioIRButtonSet *buttonSet);
00159
00160 vector<wstring>::const_iterator beginCode() const { return generatedCode.begin(); }
00161 vector<wstring>::const_iterator endCode() const { return generatedCode.end(); }
00162 void reset();
00163 void clear();
00164
00165 int buttonToCode(int id) const;
00166
00167 private:
00168 map<ThymioIRButtonName, pair<int, int> > editor;
00169
00170 vector<wstring> generatedCode;
00171 vector<wstring> directions;
00172 int currentBlock;
00173 bool inIfBlock;
00174 vector<int> buttonToCodeMap;
00175 };
00176
00177 class ThymioCompiler
00178 {
00179 public:
00180 ThymioCompiler();
00181 ~ThymioCompiler();
00182
00183 void compile();
00184 void generateCode();
00185
00186 void addButtonSet(ThymioIRButtonSet *set);
00187 void insertButtonSet(int row, ThymioIRButtonSet *set);
00188 void removeButtonSet(int row);
00189 void replaceButtonSet(int row, ThymioIRButtonSet *set);
00190 void swap(int row1, int row2);
00191 int buttonToCode(int id) const;
00192
00193 ThymioIRErrorCode getErrorCode() const;
00194 bool isSuccessful() const;
00195 int getErrorLine() const;
00196
00197 vector<wstring>::const_iterator beginCode() const;
00198 vector<wstring>::const_iterator endCode() const;
00199
00200 void clear();
00201
00202 private:
00203 vector<ThymioIRButtonSet*> buttonSet;
00204 ThymioIRTypeChecker typeChecker;
00205 ThymioIRSyntaxChecker syntaxChecker;
00206 ThymioIRCodeGenerator codeGenerator;
00207
00208 ThymioIRErrorType errorType;
00209
00210 int errorLine;
00211 };
00212
00213 };
00214
00215 #endif