Turn main into an ordinary function.
This commit is contained in:
parent
a509a61bfb
commit
5d043566dc
|
@ -44,7 +44,6 @@ public:
|
||||||
virtual void emit(Assert const&) override;
|
virtual void emit(Assert const&) override;
|
||||||
virtual void emit(FunctionCall const&) override;
|
virtual void emit(FunctionCall const&) override;
|
||||||
virtual void emit(Branch const&) override;
|
virtual void emit(Branch const&) override;
|
||||||
virtual void emit(Main const&) override;
|
|
||||||
virtual void emit(Function const&) override;
|
virtual void emit(Function const&) override;
|
||||||
virtual void emit(Module const&) override;
|
virtual void emit(Module const&) override;
|
||||||
virtual void emit(Program const&) override;
|
virtual void emit(Program const&) override;
|
||||||
|
|
|
@ -80,7 +80,7 @@ void CppEmitter::emitStatements(PointerList<Statement> const& node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppEmitter::emit(Main const& main) {
|
void CppEmitter::emitMain(Function const& main) {
|
||||||
stream << "int main() {\n";
|
stream << "int main() {\n";
|
||||||
indent();
|
indent();
|
||||||
emitStatements(main.getBody());
|
emitStatements(main.getBody());
|
||||||
|
|
|
@ -41,7 +41,6 @@ public:
|
||||||
virtual void emit(Assert const&) override;
|
virtual void emit(Assert const&) override;
|
||||||
virtual void emit(FunctionCall const&) override;
|
virtual void emit(FunctionCall const&) override;
|
||||||
virtual void emit(Branch const&) override;
|
virtual void emit(Branch const&) override;
|
||||||
virtual void emit(Main const&) override;
|
|
||||||
virtual void emit(Function const&) override;
|
virtual void emit(Function const&) override;
|
||||||
virtual void emit(Module const&) override;
|
virtual void emit(Module const&) override;
|
||||||
virtual void emit(Program const&) override;
|
virtual void emit(Program const&) override;
|
||||||
|
@ -59,6 +58,7 @@ private:
|
||||||
void emitStatements(PointerList<Statement> const& node);
|
void emitStatements(PointerList<Statement> const& node);
|
||||||
void emitBranchCondition(SemiExpression const& node);
|
void emitBranchCondition(SemiExpression const& node);
|
||||||
void emitBranchCase(BranchCase const& node);
|
void emitBranchCase(BranchCase const& node);
|
||||||
|
void emitMain(Function const& main);
|
||||||
|
|
||||||
void indent();
|
void indent();
|
||||||
void dedent();
|
void dedent();
|
||||||
|
|
|
@ -55,7 +55,6 @@ public:
|
||||||
virtual void emit(Assert const&) = 0;
|
virtual void emit(Assert const&) = 0;
|
||||||
virtual void emit(FunctionCall const&) = 0;
|
virtual void emit(FunctionCall const&) = 0;
|
||||||
virtual void emit(Branch const&) = 0;
|
virtual void emit(Branch const&) = 0;
|
||||||
virtual void emit(Main const&) = 0;
|
|
||||||
virtual void emit(Function const&) = 0;
|
virtual void emit(Function const&) = 0;
|
||||||
virtual void emit(Module const&) = 0;
|
virtual void emit(Module const&) = 0;
|
||||||
virtual void emit(Program const&) = 0;
|
virtual void emit(Program const&) = 0;
|
||||||
|
|
|
@ -100,7 +100,6 @@
|
||||||
Function* funval;
|
Function* funval;
|
||||||
FunArg *argval;
|
FunArg *argval;
|
||||||
PointerList<FunArg> *arglistval;
|
PointerList<FunArg> *arglistval;
|
||||||
Main* mainval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
%type<intval> NUMBER
|
%type<intval> NUMBER
|
||||||
|
@ -114,7 +113,7 @@
|
||||||
%type<callval> fun_call
|
%type<callval> fun_call
|
||||||
%type<argval> arg_decl
|
%type<argval> arg_decl
|
||||||
%type<arglistval> args_decl args
|
%type<arglistval> args_decl args
|
||||||
%type<funval> fun_decl
|
%type<funval> fun_decl main
|
||||||
%type<printval> print_stmt
|
%type<printval> print_stmt
|
||||||
%type<inputval> input_stmt
|
%type<inputval> input_stmt
|
||||||
%type<abortval> abort_stmt
|
%type<abortval> abort_stmt
|
||||||
|
@ -130,7 +129,6 @@
|
||||||
%type<semiexpval> semi_expression
|
%type<semiexpval> semi_expression
|
||||||
%type<idval> variable
|
%type<idval> variable
|
||||||
%type<numericval> numeric
|
%type<numericval> numeric
|
||||||
%type<mainval> main
|
|
||||||
%type<boolval> pointer
|
%type<boolval> pointer
|
||||||
|
|
||||||
%start program
|
%start program
|
||||||
|
@ -182,7 +180,7 @@ arg_decl:
|
||||||
;
|
;
|
||||||
main:
|
main:
|
||||||
MAIN statements {
|
MAIN statements {
|
||||||
$$ = new Main($2);
|
$$ = makeMain($2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
statements:
|
statements:
|
||||||
|
|
35
Nodes.cpp
Normal file
35
Nodes.cpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Monicelli: an esoteric language compiler
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Stefano Sanfilippo
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Nodes.hpp"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace monicelli;
|
||||||
|
|
||||||
|
static const std::string MONICELLI_ENTRYPOINT = "__Monicelli_main";
|
||||||
|
|
||||||
|
Function *monicelli::makeMain(PointerList<Statement> *body) {
|
||||||
|
PointerList<FunArg> *noargs = new PointerList<FunArg>();
|
||||||
|
|
||||||
|
return new Function(
|
||||||
|
new Id(new std::string(MONICELLI_ENTRYPOINT)),
|
||||||
|
Type::VOID, noargs, body
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
25
Nodes.hpp
25
Nodes.hpp
|
@ -371,22 +371,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Main: public Emittable {
|
Function *makeMain(PointerList<Statement> *body);
|
||||||
public:
|
|
||||||
Main(PointerList<Statement> *s): body(s) {}
|
|
||||||
|
|
||||||
virtual void emit(Emitter *emitter) const {
|
|
||||||
emitter->emit(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
PointerList<Statement> const& getBody() const {
|
|
||||||
return *body;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Pointer<PointerList<Statement>> body;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class FunArg {
|
class FunArg {
|
||||||
public:
|
public:
|
||||||
|
@ -499,8 +484,8 @@ public:
|
||||||
emitter->emit(*this);
|
emitter->emit(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMain(Main *m) {
|
void setMain(Function *m) {
|
||||||
main = Pointer<Main>(m);
|
main = Pointer<Function>(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void addFunction(Function *f) {
|
void addFunction(Function *f) {
|
||||||
|
@ -512,7 +497,7 @@ public:
|
||||||
delete m;
|
delete m;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<Main const&> getMain() const {
|
boost::optional<Function const&> getMain() const {
|
||||||
maybe_return(main);
|
maybe_return(main);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -525,7 +510,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Pointer<Main> main;
|
Pointer<Function> main;
|
||||||
PointerList<Function> functions;
|
PointerList<Function> functions;
|
||||||
std::unordered_set<Module> modules;
|
std::unordered_set<Module> modules;
|
||||||
};
|
};
|
||||||
|
|
Reference in New Issue
Block a user