1 /* ScummVM - Graphic Adventure Engine 2 * 3 * ScummVM is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef DIRECTOR_LINGO_LINGO_CODEGEN_H 24 #define DIRECTOR_LINGO_LINGO_CODEGEN_H 25 26 #include "director/types.h" 27 #include "director/lingo/lingo.h" 28 #include "director/lingo/lingo-ast.h" 29 30 namespace Director { 31 32 class LingoCompiler : NodeVisitor { 33 public: 34 LingoCompiler(); ~LingoCompiler()35 virtual ~LingoCompiler() {} 36 37 ScriptContext *compileAnonymous(const Common::U32String &code); 38 ScriptContext *compileLingo(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, const Common::String &scriptName, bool anonyomous = false); 39 ScriptContext *compileLingoV4(Common::SeekableReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName, uint16 version); 40 code1(inst code)41 int code1(inst code) { _currentAssembly->push_back(code); return _currentAssembly->size() - 1; } code2(inst code_1,inst code_2)42 int code2(inst code_1, inst code_2) { int o = code1(code_1); code1(code_2); return o; } code3(inst code_1,inst code_2,inst code_3)43 int code3(inst code_1, inst code_2, inst code_3) { int o = code1(code_1); code1(code_2); code1(code_3); return o; } code4(inst code_1,inst code_2,inst code_3,inst code_4)44 int code4(inst code_1, inst code_2, inst code_3, inst code_4) { int o = code1(code_1); code1(code_2); code1(code_3); code1(code_4); return o; } 45 int codeCmd(const Common::String &s, int numpar); 46 int codeFloat(double f); 47 int codeFunc(const Common::String &s, int numpar); 48 int codeInt(int val); 49 int codeString(const char *s); 50 void codeVarSet(const Common::String &name); 51 void codeVarRef(const Common::String &name); 52 void codeVarGet(const Common::String &name); 53 int getTheFieldID(int entity, const Common::String &field, bool silent = false); 54 void registerFactory(Common::String &s); 55 void registerMethodVar(const Common::String &name, VarType type = kVarGeneric); 56 void updateLoopJumps(uint nextTargetPos, uint exitTargetPos); 57 58 LingoArchive *_assemblyArchive; 59 ScriptContext *_assemblyContext; 60 Node *_assemblyAST; 61 ScriptData *_currentAssembly; 62 bool _indef; 63 uint _linenumber; 64 uint _colnumber; 65 uint _bytenumber; 66 const char *_lines[3]; 67 bool _inFactory; 68 LoopNode *_currentLoop; 69 bool _refMode; 70 71 Common::HashMap<Common::String, VarType, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> *_methodVars; 72 73 bool _hadError; 74 75 public: 76 virtual bool visitScriptNode(ScriptNode *node); 77 virtual bool visitFactoryNode(FactoryNode *node); 78 virtual bool visitHandlerNode(HandlerNode *node); 79 virtual bool visitCmdNode(CmdNode *node); 80 virtual bool visitPutIntoNode(PutIntoNode *node); 81 virtual bool visitPutAfterNode(PutAfterNode *node); 82 virtual bool visitPutBeforeNode(PutBeforeNode *node); 83 virtual bool visitSetNode(SetNode *node); 84 virtual bool visitGlobalNode(GlobalNode *node); 85 virtual bool visitPropertyNode(PropertyNode *node); 86 virtual bool visitInstanceNode(InstanceNode *node); 87 virtual bool visitIfStmtNode(IfStmtNode *node); 88 virtual bool visitIfElseStmtNode(IfElseStmtNode *node); 89 virtual bool visitRepeatWhileNode(RepeatWhileNode *node); 90 virtual bool visitRepeatWithToNode(RepeatWithToNode *node); 91 virtual bool visitRepeatWithInNode(RepeatWithInNode *node); 92 virtual bool visitNextRepeatNode(NextRepeatNode *node); 93 virtual bool visitExitRepeatNode(ExitRepeatNode *node); 94 virtual bool visitExitNode(ExitNode *node); 95 virtual bool visitTellNode(TellNode *node); 96 virtual bool visitWhenNode(WhenNode *node); 97 virtual bool visitDeleteNode(DeleteNode *node); 98 virtual bool visitHiliteNode(HiliteNode *node); 99 virtual bool visitAssertErrorNode(AssertErrorNode *node); 100 virtual bool visitIntNode(IntNode *node); 101 virtual bool visitFloatNode(FloatNode *node); 102 virtual bool visitSymbolNode(SymbolNode *node); 103 virtual bool visitStringNode(StringNode *node); 104 virtual bool visitListNode(ListNode *node); 105 virtual bool visitPropListNode(PropListNode *node); 106 virtual bool visitPropPairNode(PropPairNode *node); 107 virtual bool visitFuncNode(FuncNode *node); 108 virtual bool visitVarNode(VarNode *node); 109 virtual bool visitParensNode(ParensNode *node); 110 virtual bool visitUnaryOpNode(UnaryOpNode *node); 111 virtual bool visitBinaryOpNode(BinaryOpNode *node); 112 virtual bool visitFrameNode(FrameNode *node); 113 virtual bool visitMovieNode(MovieNode *node); 114 virtual bool visitIntersectsNode(IntersectsNode *node); 115 virtual bool visitWithinNode(WithinNode *node); 116 virtual bool visitTheNode(TheNode *node); 117 virtual bool visitTheOfNode(TheOfNode *node); 118 virtual bool visitTheNumberOfNode(TheNumberOfNode *node); 119 virtual bool visitTheLastNode(TheLastNode *node); 120 virtual bool visitTheDateTimeNode(TheDateTimeNode *node); 121 virtual bool visitMenuNode(MenuNode *node); 122 virtual bool visitMenuItemNode(MenuItemNode *node); 123 virtual bool visitSoundNode(SoundNode *node); 124 virtual bool visitSpriteNode(SpriteNode *node); 125 virtual bool visitChunkExprNode(ChunkExprNode *node); 126 127 private: 128 int parse(const char *code); 129 130 public: 131 // lingo-preprocessor.cpp 132 Common::U32String codePreprocessor(const Common::U32String &code, LingoArchive *archive, ScriptType type, CastMemberID id, bool simple = false); 133 134 // lingo-patcher.cpp 135 Common::U32String patchLingoCode(const Common::U32String &line, LingoArchive *archive, ScriptType type, CastMemberID id, int linenumber); 136 }; 137 138 } // End of namespace Director 139 140 #endif 141