Initial commit
This commit is contained in:
commit
6ed5d05993
6 changed files with 180 additions and 0 deletions
27
Makefile
Normal file
27
Makefile
Normal file
|
@ -0,0 +1,27 @@
|
|||
CC=gcc
|
||||
CXX=g++
|
||||
LD=g++
|
||||
CFLAGS=-O3 -march=native -fstack-protector=strong
|
||||
CXXFLAGS=-O3 -march=native-fstack-protector=strong
|
||||
LEX=flex
|
||||
YACC=bison
|
||||
all: mumei
|
||||
|
||||
mumei: mumei.tab.o lex.yy.o
|
||||
$(LD) -o $@ $^ -lfl
|
||||
|
||||
lex.yy.o: lex.yy.c
|
||||
$(CXX) $(CPPFLAGS) -c -o $@ $^
|
||||
|
||||
mumei.tab.o: mumei.tab.c
|
||||
$(CXX) $(CPPFLAGS) -c -o $@ $^
|
||||
|
||||
lex.yy.c: mumei.tab.c
|
||||
$(LEX) mumei.l
|
||||
|
||||
mumei.tab.c:
|
||||
$(YACC) -d mumei.y
|
||||
|
||||
.PHONY: clean all
|
||||
clean:
|
||||
rm -rf mumei.tab.c mumei.tab.h lex.yy.c mumei *.o
|
4
crt0.asm
Normal file
4
crt0.asm
Normal file
|
@ -0,0 +1,4 @@
|
|||
_start:
|
||||
cpget
|
||||
jmp @main
|
||||
[i0:zero] syscall [ci:0]
|
10
libmtg.asm
Normal file
10
libmtg.asm
Normal file
|
@ -0,0 +1,10 @@
|
|||
puti:
|
||||
bpget
|
||||
spget
|
||||
bpset
|
||||
get -2
|
||||
[i0:pop] syscall [ci:2]
|
||||
bpget
|
||||
spset
|
||||
bpset
|
||||
ret
|
23
mumei.l
Normal file
23
mumei.l
Normal file
|
@ -0,0 +1,23 @@
|
|||
%{
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
using namespace std;
|
||||
#define YY_DECL extern "C" int yylex()
|
||||
#include "mumei.tab.h"
|
||||
int linenum=0;
|
||||
%}
|
||||
%%
|
||||
[ \t\n] ;
|
||||
FUNCTION { return FUNCTION;}
|
||||
END { return END;}
|
||||
[0-9]+ { yylval.ival = atoi(yytext); return INT;}
|
||||
[a-zA-Z][a-zA-Z0-9]* {yylval.sval=strdup(yytext);return VARNAME;}
|
||||
\+ { return PLUS;}
|
||||
\- { return MINUS;}
|
||||
\( { return LPARENS; }
|
||||
\) { return RPARENS; }
|
||||
\* { return MUL;}
|
||||
\/ { return DIV;}
|
||||
\= { return EQ;}
|
||||
\, { return COMMA;}
|
||||
%%
|
110
mumei.y
Normal file
110
mumei.y
Normal file
|
@ -0,0 +1,110 @@
|
|||
%{
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
using namespace std;
|
||||
extern "C" int yylex();
|
||||
extern "C" int yyparse();
|
||||
extern "C" FILE *yyin;
|
||||
void yyerror(const char *s);
|
||||
vector<string> nameTable;
|
||||
int getVarID(string name) {
|
||||
auto it=nameTable.end();
|
||||
for(auto it=nameTable.begin(); it!=nameTable.end(); it++) {
|
||||
if(nameTable[it-nameTable.begin()]==name)
|
||||
return it-nameTable.begin();
|
||||
}
|
||||
nameTable.push_back(name);
|
||||
return nameTable.size()-1;
|
||||
}
|
||||
ofstream out;
|
||||
%}
|
||||
%union {
|
||||
int ival;
|
||||
char* sval;
|
||||
}
|
||||
%token <ival> INT
|
||||
%token PLUS
|
||||
%token MINUS
|
||||
%token MUL
|
||||
%token LPARENS
|
||||
%token RPARENS
|
||||
%token DIV
|
||||
%token <sval> VARNAME
|
||||
%token EQ
|
||||
%token COMMA
|
||||
%token FUNCTION
|
||||
%token END
|
||||
%left PLUS MINUS MUL DIV FUNCTION
|
||||
%right EQ
|
||||
%%
|
||||
program:
|
||||
fh function ef program
|
||||
| fh function ef
|
||||
fh:
|
||||
FUNCTION VARNAME {out << $2 << ":\n\tbpget\n\tspget\n\tbpset" << endl;}
|
||||
ef:
|
||||
END {out << "\tbpget\n\tspset\n\tbpset\n\tret"<<endl;}
|
||||
function:
|
||||
VARNAME EQ exp program {out << "\t[ci:2] store "<<getVarID($1)*4 << endl;}
|
||||
| VARNAME EQ exp {out << "\t[ci:2] store "<<getVarID($1)*4 << endl;}
|
||||
| exp program {out << "\tdrop" << endl;}
|
||||
| exp {out << "\tdrop" << endl;}
|
||||
exp:
|
||||
factor
|
||||
| exp PLUS exp { out << "\tadd" <<endl;}
|
||||
| exp MINUS exp { out << "\tsub" <<endl;}
|
||||
factor:
|
||||
num
|
||||
| factor MUL factor {out << "\tmul" << endl;}
|
||||
| factor DIV factor {out << "\tdiv" << endl;}
|
||||
num:
|
||||
INT { out << "\tpush "<< $1 << endl;}
|
||||
| VARNAME LPARENS function RPARENS {out << "\tcpget\n\tjmp @" << $1 << "\n\t[ci:2] load " << getVarID($1) << endl;}
|
||||
| VARNAME LPARENS RPARENS {out << "\tcpget\n\tjmp @" << $1 << "\n\t[ci:2] load " << getVarID($1) << endl;}
|
||||
| VARNAME { out << "\t[ci:2]load "<<getVarID($1)*4<<endl;}
|
||||
| LPARENS exp RPARENS
|
||||
function:
|
||||
exp COMMA function
|
||||
| exp
|
||||
%%
|
||||
int main(int argc, char** argv) {
|
||||
int pid;
|
||||
mkfifo("tmp.a", 0660);
|
||||
if(!(pid=fork())) {
|
||||
//sleep(1);
|
||||
system("as -o tmp.o crt0.asm tmp.a libmtg.asm");
|
||||
return 0;
|
||||
}
|
||||
out=ofstream("tmp.a",ios::out);
|
||||
unlink("tmp.a"); //Unlink when done
|
||||
if(argc<=3)
|
||||
yyerror("usage: mumei -o outfile infile1 [infile2 [infile3 ...]]");
|
||||
if("-o"s!=argv[1])
|
||||
yyerror("usage: mumei -o outfile infile1 [infile2 [infile3 ...]]");
|
||||
for(int i=3;i<argc;i++) {
|
||||
FILE *f=fopen(argv[i],"rb");
|
||||
yyin = f;
|
||||
do {
|
||||
yyparse();
|
||||
} while (!feof(yyin));
|
||||
fclose(f);
|
||||
}
|
||||
out.close();
|
||||
wait(NULL);
|
||||
system(("explink -o "s+argv[2]+" -c tmp.o -C 0").c_str());
|
||||
unlink("tmp.o");
|
||||
}
|
||||
|
||||
void yyerror(const char *s) {
|
||||
cout << "parse error! Message: " << s << endl;
|
||||
out.close();
|
||||
fclose(yyin);
|
||||
exit(-1);
|
||||
}
|
6
test.mtl
Normal file
6
test.mtl
Normal file
|
@ -0,0 +1,6 @@
|
|||
FUNCTION main
|
||||
this=is-a(new,and,sh+o+rt)*test
|
||||
END
|
||||
FUNCTION a
|
||||
puti(5)
|
||||
END
|
Loading…
Reference in a new issue