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