Skip to content

Commit

Permalink
Merge pull request #5 from marek677/master
Browse files Browse the repository at this point in the history
Type parsing
  • Loading branch information
akat1 authored Aug 17, 2016
2 parents 85f5c9f + 727ef21 commit a8fb2fe
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 97 deletions.
43 changes: 20 additions & 23 deletions compiler/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,21 @@
def __type_to_minerva(t):
r = "__minerva_"

if t[0][0] != None:
r += t[0][0] + "_"

r += '_'.join(t[0][1].split())

if t[1] == True:
r += "_ptr"
while t[0] is not None:
r += t[0] + "_"
t = t[1]
r += t[1]
r = r.replace("*","ptr")

return r + "_t"

def __type_to_str(t):
r = ""

if t[0][0] != None:
r += t[0][0] + " "

r += t[0][1]

if t[1] == True:
r += " *"
while t[0] is not None:
r += t[0] + " "
t = t[1]
r += t[1]

return r

Expand All @@ -40,7 +35,7 @@ def __compile_type_enum(types):

def __compile_type_name(types):
r = "const char *minerva_type_name[] = {\n"
r += ",\n".join(map(lambda x: "\t\""+x[0][1]+"\"", types))
r += ",\n".join(map(lambda x: "\t\""+__type_to_str(x)+"\"", types))
r += "\n};\n"

return r
Expand All @@ -52,25 +47,27 @@ def __compile_wrapper(funcs):
for f in funcs:
r = "int\n"
r += "__minerva_wrap_call_"+f[2]+"(minerva_var_t *new, minerva_var_t **vars) {\n"
for i, a in enumerate(f[3]):
#skipping void args
args = [ elem for elem in f[3] if elem[0][1] != "void" ]

for i, a in enumerate(args):
a = a[0]
r += "\t"+__type_to_str(a)+" "+"__arg"+str(i)+" = "
if a[1] == True:
if '*' in __type_to_str(a):
r += "("+__type_to_str(a)+")vars["+str(i)+"]->val;\n"
else:
r += "*("+__type_to_str(a)+"*)vars["+str(i)+"]->val;\n"

if f[1][0][1] == 'void' and f[1][1] == 0:
r += "\t"+f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");"
if f[1][1] == 'void':
r += "\t"+f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");"
else:
if f[1][1] == True:
if '*' in f[1][1]:
r += "\tnew->val = " + \
f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");"
f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");"
else:
r += "\tnew->val = xcalloc(1,sizeof("+__type_to_str(f[1])+"));\n"
r += "\tnew->flags |= F_VAR_ALLOC;\n"
r += "\t*(("+__type_to_str(f[1])+"*)new->val) = ("+__type_to_str(f[1])+")"+\
f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");"
f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");"

r += "\n\treturn 1;\n}\n\n"
c.append(r)
Expand Down
65 changes: 52 additions & 13 deletions compiler/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
tokens = (
'LCHEVRON', 'RCHEVRON',
'LBRACKET', 'RBRACKET',
'STRUCT', 'PTR', 'UNION',
'STRUCT', 'PTR', 'UNION','STANDARDTYPE', 'TYPE_QUALIFIER',
'COMMA', 'SEPARATOR', 'COMMENT', 'STRING',
'MIINCLUDE', 'INCLUDE', 'INCLUDEFILE', 'INCLUDEFILELOCAL', 'ARROW'
)
Expand All @@ -17,8 +17,9 @@ def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")

def t_UNION(t): r'union'; return t
def t_STRUCT(t): r'struct'; return t
def t_UNION(t): r'\bunion\b'; return t
def t_STRUCT(t): r'\bstruct\b'; return t
def t_TYPE_QUALIFIER(t): r'\bconst\b'; return t; #skipped volatile
t_LCHEVRON = r'\{'
t_RCHEVRON = r'\}'
t_LBRACKET = r'\('
Expand All @@ -28,7 +29,8 @@ def t_STRUCT(t): r'struct'; return t
t_PTR = r'\*'
t_ARROW = r'\=\>'
t_COMMENT = r'--[^\n]*'
t_STRING = r'((const|unsigned|signed|long|short|struct|restrict)[ ]+)*[a-zA-Z][a-zA-Z0-9_\-\.\/]*'
t_STRING = r'[a-zA-Z][a-zA-Z0-9_\-\.\/]*'
t_STANDARDTYPE = r'\b(void|char|short|int|long|float|double|signed|unsigned)\b'
t_MIINCLUDE = r'%include'
t_INCLUDE = r'\#include'
t_INCLUDEFILE = r'<'+t_STRING+r'>'
Expand Down Expand Up @@ -126,25 +128,62 @@ def p_var_arg_flags(t):
t[0] = [t[1]] + t[0]



def p_type(t):
'''type : type_basic PTR
| type_basic'''
'''type : type_list
| user_definied_type'''
if len(t) == 2:
t[0] = t[1]
else:
t[0] = (t[1],t[2])

def p_user_definied_type(t):
'''user_definied_type : TYPE_QUALIFIER STRING ptr_list
| UNION STRING ptr_list
| STRUCT STRING ptr_list
| struct_things
| STRING ptr_list'''
# I dont like it...
if len(t) == 4:
t[0] = (t[1],(t[2],t[3]))
elif len(t) == 3:
t[0] = (t[1],t[2])
else:
t[0] = t[1]

def p_struct_things(t):
'''struct_things : TYPE_QUALIFIER STRING
| STRUCT STRING
| UNION STRING
| STRING'''
if len(t) == 2 :
t[0] = (None,t[1])
else:
t[0] = (t[1],(None,t[2]))

def p_ptr_list(t):
'''ptr_list : PTR ptr_list
| PTR'''
if len(t) == 2:
t[0] = (t[1], False)
t[0] = (None,t[1])
else:
t[0] = (t[1], True)
t[0] = (t[1],t[2])

def p_type_list(t):
'''type_list : basic_type
| basic_type type_list'''

def p_type_basic(t):
'''type_basic : STRUCT STRING
| UNION STRING
| STRING'''
if len(t) == 2:
t[0] = (None, t[1])
else:
t[0] = (t[1], t[2])

def p_basic_type(t):
'''basic_type : TYPE_QUALIFIER
| STANDARDTYPE
| PTR'''
#skipped storage_class_specifier (auto,register,static, extern, typedef)
t[0] = t[1]

def p_empty(p):
'empty :'
pass
Expand Down
2 changes: 2 additions & 0 deletions target/libressl/asn1.mi
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <minerva_generic.h>
#include <openssl/asn1.h>

ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf) => generic_void;
Expand All @@ -17,3 +18,4 @@ int ASN1_STRING_to_UTF8(char *out, ASN1_STRING *in) => generic_not_zero;
int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, long flags) => generic_not_zero;
int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, long flags) => generic_not_zero;
int ASN1_STRING_print(BIO *out, ASN1_STRING *str) => generic_not_zero;

119 changes: 58 additions & 61 deletions target/lm/lm.mi
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ double fmod(double, double) => generic_success;

double j0(double) => generic_success;
double j1(double) => generic_success;
-- double jn(int, double) => generic_success;
double jn(int, double) => generic_success;
double y0(double) => generic_success;
double y1(double) => generic_success;
double yn(int, double) => generic_success;
Expand All @@ -68,7 +68,6 @@ double trunc(double) => generic_success;
double drem(double, double) => generic_success;
int finite(double) => generic_success;
int isnanf(float) => generic_success;
double gamma_r(double, int *) => generic_success;
double lgamma_r(double, int *) => generic_success;
double significand(double) => generic_success;
float acosf(float) => generic_success;
Expand Down Expand Up @@ -112,8 +111,8 @@ float atanhf(float) => generic_success;
float cbrtf(float) => generic_success;
float logbf(float) => generic_success;
float copysignf(float, float) => generic_success;
--long long llrintf(float) => generic_success;
--long long llroundf(float) => generic_success;
long long llrintf(float) => generic_success;
long long llroundf(float) => generic_success;
long lrintf(float) => generic_success;
long lroundf(float) => generic_success;
float nanf(char *) => generic_success;
Expand All @@ -134,73 +133,71 @@ int finitef(float) => generic_success;
float gammaf(float) => generic_success;
float j0f(float) => generic_success;
float j1f(float) => generic_success;
-- float jnf(int, float) => generic_success;
float jnf(int, float) => generic_success;
float scalbf(float, float) => generic_success;
float y0f(float) => generic_success;
float y1f(float) => generic_success;
float ynf(int, float) => generic_success;
float gammaf_r(float, int *) => generic_success;
float lgammaf_r(float, int *) => generic_success;
float significandf(float) => generic_success;
-- long double acoshl(long double) => generic_success;
-- long double acosl(long double) => generic_success;
-- long double asinhl(long double) => generic_success;
-- long double asinl(long double) => generic_success;
-- long double atan2l(long double, long double) => generic_success;
-- long double atanhl(long double) => generic_success;
-- long double atanl(long double) => generic_success;
-- long double cbrtl(long double) => generic_success;
-- long double ceill(long double) => generic_success;
-- long double copysignl(long double, long double) => generic_success;
-- long double coshl(long double) => generic_success;
-- long double cosl(long double) => generic_success;
-- long double erfcl(long double) => generic_success;
-- long double erfl(long double) => generic_success;
-- long double exp2l(long double) => generic_success;
-- long double expl(long double) => generic_success;
-- long double expm1l(long double) => generic_success;
-- long double fabsl(long double) => generic_success;
-- long double fdiml(long double, long double) => generic_success;
-- long double floorl(long double) => generic_success;
-- long double fmal(long double, long double, long double) => generic_success;
-- long double fmaxl(long double, long double) => generic_success;
-- long double fminl(long double, long double) => generic_success;
-- long double fmodl(long double, long double) => generic_success;
-- long double frexpl(long double value, int *) => generic_success;
-- long double hypotl(long double, long double) => generic_success;
long double acoshl(long double) => generic_success;
long double acosl(long double) => generic_success;
long double asinhl(long double) => generic_success;
long double asinl(long double) => generic_success;
long double atan2l(long double, long double) => generic_success;
long double atanhl(long double) => generic_success;
long double atanl(long double) => generic_success;
long double cbrtl(long double) => generic_success;
long double ceill(long double) => generic_success;
long double copysignl(long double, long double) => generic_success;
long double coshl(long double) => generic_success;
long double cosl(long double) => generic_success;
long double erfcl(long double) => generic_success;
long double erfl(long double) => generic_success;
long double exp2l(long double) => generic_success;
long double expl(long double) => generic_success;
long double expm1l(long double) => generic_success;
long double fabsl(long double) => generic_success;
long double fdiml(long double, long double) => generic_success;
long double floorl(long double) => generic_success;
long double fmal(long double, long double, long double) => generic_success;
long double fmaxl(long double, long double) => generic_success;
long double fminl(long double, long double) => generic_success;
long double fmodl(long double, long double) => generic_success;
long double frexpl(long double value, int *) => generic_success;
long double hypotl(long double, long double) => generic_success;
int ilogbl(long double) => generic_success;
-- long double ldexpl(long double, int) => generic_success;
-- long double lgammal(long double) => generic_success;
-- long long llrintl(long double) => generic_success;
-- long long llroundl(long double) => generic_success;
-- long double log10l(long double) => generic_success;
-- long double log1pl(long double) => generic_success;
-- long double log2l(long double) => generic_success;
-- long double logbl(long double) => generic_success;
-- long double logl(long double) => generic_success;
long double ldexpl(long double, int) => generic_success;
long double lgammal(long double) => generic_success;
long long llrintl(long double) => generic_success;
long long llroundl(long double) => generic_success;
long double log10l(long double) => generic_success;
long double log1pl(long double) => generic_success;
long double log2l(long double) => generic_success;
long double logbl(long double) => generic_success;
long double logl(long double) => generic_success;
long lrintl(long double) => generic_success;
long lroundl(long double) => generic_success;
-- long double modfl(long double, long double *) => generic_success;
-- long double nanl(const char *) => generic_success;
-- long double nearbyintl(long double) => generic_success;
-- long double nextafterl(long double, long double) => generic_success;
long double modfl(long double, long double *) => generic_success;
long double nanl( const char *) => generic_success;
long double nearbyintl(long double) => generic_success;
long double nextafterl(long double, long double) => generic_success;
double nexttoward(double, long double) => generic_success;
float nexttowardf(float, long double) => generic_success;
-- long double nexttowardl(long double, long double) => generic_success;
-- long double powl(long double, long double) => generic_success;
-- long double remainderl(long double, long double) => generic_success;
-- long double remquol(long double, long double, int *) => generic_success;
-- long double rintl(long double) => generic_success;
-- long double roundl(long double) => generic_success;
-- long double scalblnl(long double, long) => generic_success;
-- long double scalbnl(long double, int) => generic_success;
-- long double sinhl(long double) => generic_success;
-- long double sinl(long double) => generic_success;
-- long double sqrtl(long double) => generic_success;
-- long double tanhl(long double) => generic_success;
-- long double tanl(long double) => generic_success;
-- long double tgammal(long double) => generic_success;
-- long double truncl(long double) => generic_success;

long double nexttowardl(long double, long double) => generic_success;
long double powl(long double, long double) => generic_success;
long double remainderl(long double, long double) => generic_success;
long double remquol(long double, long double, int *) => generic_success;
long double rintl(long double) => generic_success;
long double roundl(long double) => generic_success;
long double scalblnl(long double, long) => generic_success;
long double scalbnl(long double, int) => generic_success;
long double sinhl(long double) => generic_success;
long double sinl(long double) => generic_success;
long double sqrtl(long double) => generic_success;
long double tanhl(long double) => generic_success;
long double tanl(long double) => generic_success;
long double tgammal(long double) => generic_success;
long double truncl(long double) => generic_success;


0 comments on commit a8fb2fe

Please sign in to comment.