Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type parsing #5

Merged
merged 1 commit into from
Aug 17, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Changes to be committed:
	modified:   compiler/compiler.py
	modified:   compiler/parser.py
	modified:   target/libressl/asn1.mi
	modified:   target/lm/lm.mi
  • Loading branch information
marek677 committed Aug 17, 2016
commit 727ef21c48c89121a7df0a4cf42898870000f3e7
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;