コード例 #1
0
ファイル: Stmt.cpp プロジェクト: deadlock-f10/PL0_Complier
void IfElse::gen(label before, label after)
{
	label iftrue = newlabel();
	label iffalse = newlabel();

	e->jumping(0,iffalse);
	emitlabel(iftrue);
	stmt1->gen(iftrue,after);
	emit("goto L"+after);
	emitlabel(iffalse);
	stmt2->gen(iffalse,after);
}
コード例 #2
0
ファイル: Stmt.cpp プロジェクト: deadlock-f10/PL0_Complier
void DoWhile::gen(label before, label after)
{
	label test = newlabel();
	s->gen(before,test);
	emitlabel(test);
	e->jumping(before,0);
}
コード例 #3
0
ファイル: Stmt.cpp プロジェクト: deadlock-f10/PL0_Complier
void If::gen(label before, label after)
{
	label iftrue = newlabel();								
	e->jumping(0,after);
	emitlabel(iftrue);
	s->gen(iftrue,after);
}
コード例 #4
0
Expr * Logical::gen()
{
    
    int f = newlabel(); 
    int a = newlabel();
    Temp * temp = new Temp(this->type);
    this->jumping(0,f);
    //emit(temp->toString() + " = true");
	emit("(=, true, " + temp->toString() + ")");
	log_buffer << a;
    emit("goto L" + log_buffer.str());
	log_buffer.str("");
    emitlabel(f); 
    //emit(temp->toString() + " = false");
	emit("(=, false, " + temp->toString() + ")");
    emitlabel(a);
    return temp;
}
コード例 #5
0
ファイル: Stmt.cpp プロジェクト: deadlock-f10/PL0_Complier
void Seq::gen(label begin , label after){
	if(s1 == Stmt::Null) 
		s2->gen(begin,after);
	else if(s2 == Stmt::Null)
		s1->gen(begin,after);
	else if(s1 != Stmt::Null && s2 != Stmt::Null){
		label l = newlabel();
		s1->gen(begin,l);
		emitlabel(l);
		s2->gen(l,after);
	}
}
コード例 #6
0
ファイル: lburg.c プロジェクト: emtees/old-code
int main(int argc, char *argv[]) {
	int c, i;
	Nonterm p;
	
	for (i = 1; i < argc; i++)
		if (strcmp(argv[i], "-T") == 0)
			Tflag = 1;
		else if (strncmp(argv[i], "-p", 2) == 0 && argv[i][2])
			prefix = &argv[i][2];
		else if (strncmp(argv[i], "-p", 2) == 0 && i + 1 < argc)
			prefix = argv[++i];
		else if (*argv[i] == '-' && argv[i][1]) {
			yyerror("usage: %s [-T | -p prefix]... [ [ input ] output ] \n",
				argv[0]);
			exit(1);
		} else if (infp == NULL) {
			if (strcmp(argv[i], "-") == 0)
				infp = stdin;
			else if ((infp = fopen(argv[i], "r")) == NULL) {
				yyerror("%s: can't read `%s'\n", argv[0], argv[i]);
				exit(1);
			}
		} else if (outfp == NULL) {
			if (strcmp(argv[i], "-") == 0)
				outfp = stdout;
			if ((outfp = fopen(argv[i], "w")) == NULL) {
				yyerror("%s: can't write `%s'\n", argv[0], argv[i]);
				exit(1);
			}
		}
	if (infp == NULL)
		infp = stdin;
	if (outfp == NULL)
		outfp = stdout;
	yyparse();
	if (start)
		ckreach(start);
	for (p = nts; p; p = p->link) {
		if (p->rules == NULL)
			yyerror("undefined nonterminal `%s'\n", p->name);
		if (!p->reached)
			yyerror("can't reach nonterminal `%s'\n", p->name);
	}
	emitheader();
	emitdefs(nts, ntnumber);
	emitstruct(nts, ntnumber);
	emitnts(rules, nrules);
	emitstring(rules);
	emitrule(nts);
	emitclosure(nts);
	if (start)
		emitlabel(terms, start, ntnumber);
	emitkids(rules, nrules);
	if (!feof(infp))
		while ((c = getc(infp)) != EOF)
			putc(c, outfp);
	while (memlist) {	/* for purify */
		struct block *q = memlist->link;
		free(memlist);
		memlist = q;
	}
	return errcnt > 0;
}