allow return; for void returns ... remove string
This commit is contained in:
@@ -66,7 +66,6 @@ fundef(A) ::= type(T) T_IDENTIFIER(ID) T_LPAREN params(P) T_RPAREN T_BEGIN state
|
|||||||
%type type {Type}
|
%type type {Type}
|
||||||
type(A) ::= T_BOOL. { A = Type::BOOL; }
|
type(A) ::= T_BOOL. { A = Type::BOOL; }
|
||||||
type(A) ::= T_INT. { A = Type::INT; }
|
type(A) ::= T_INT. { A = Type::INT; }
|
||||||
type(A) ::= T_STRING. { A = Type::STRING; }
|
|
||||||
type(A) ::= T_VOID. { A = Type::VOID; }
|
type(A) ::= T_VOID. { A = Type::VOID; }
|
||||||
|
|
||||||
%type params {ParameterList*}
|
%type params {ParameterList*}
|
||||||
@@ -84,6 +83,7 @@ statement(A) ::= T_FOR T_LPAREN statement(INIT) expr(COND) T_SEMICOLON statement
|
|||||||
{ A = new ForStatement(INIT, COND, STEP, S); }
|
{ A = new ForStatement(INIT, COND, STEP, S); }
|
||||||
statement(A) ::= T_RFOR T_LPAREN statement(INIT) expr(P) T_SEMICOLON statement(STEP) T_RPAREN statement(S).
|
statement(A) ::= T_RFOR T_LPAREN statement(INIT) expr(P) T_SEMICOLON statement(STEP) T_RPAREN statement(S).
|
||||||
{ A = new RandomForStatement(INIT, P, STEP, S); }
|
{ A = new RandomForStatement(INIT, P, STEP, S); }
|
||||||
|
statement(A) ::= T_RETURN T_SEMICOLON. { A = new ReturnStatement(0); }
|
||||||
statement(A) ::= T_RETURN expr(E) T_SEMICOLON. { A = new ReturnStatement(E); }
|
statement(A) ::= T_RETURN expr(E) T_SEMICOLON. { A = new ReturnStatement(E); }
|
||||||
statement(A) ::= T_BEGIN statements(S) T_END. { A = new Scope(S); }
|
statement(A) ::= T_BEGIN statements(S) T_END. { A = new Scope(S); }
|
||||||
statement(A) ::= vardef(V) T_SEMICOLON. { A = V; }
|
statement(A) ::= vardef(V) T_SEMICOLON. { A = V; }
|
||||||
|
|||||||
@@ -332,12 +332,16 @@ void CodeGenVisitor::visit(RandomIfStatement* e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenVisitor::visit(ReturnStatement* e) {
|
void CodeGenVisitor::visit(ReturnStatement* e) {
|
||||||
e->getExpr()->accept(this);
|
if (e->getExpr() != 0) {
|
||||||
if (!value_) {
|
e->getExpr()->accept(this);
|
||||||
throw "error evaluating expression";
|
if (!value_) {
|
||||||
}
|
throw "error evaluating expression";
|
||||||
|
}
|
||||||
|
|
||||||
builder_->CreateRet(value_);
|
builder_->CreateRet(value_);
|
||||||
|
} else {
|
||||||
|
builder_->CreateRetVoid();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenVisitor::visit(Scope* e) {
|
void CodeGenVisitor::visit(Scope* e) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ int main() {
|
|||||||
rules.add("void", T_VOID);
|
rules.add("void", T_VOID);
|
||||||
rules.add("rfor", T_RFOR);
|
rules.add("rfor", T_RFOR);
|
||||||
rules.add("rif", T_RIF);
|
rules.add("rif", T_RIF);
|
||||||
rules.add("string", T_STRING);
|
//rules.add("string", T_STRING);
|
||||||
|
|
||||||
// special characters
|
// special characters
|
||||||
//rules.add("\"(\"", T_LPAREN);
|
//rules.add("\"(\"", T_LPAREN);
|
||||||
|
|||||||
Reference in New Issue
Block a user