add if, etc.
This commit is contained in:
parent
09db65fef0
commit
d81eca1c15
1 changed files with 30 additions and 3 deletions
|
@ -6,6 +6,7 @@ class Parser():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
float_pattern =r"(?P<flo>[+-]?\d+[.]\d+)"
|
float_pattern =r"(?P<flo>[+-]?\d+[.]\d+)"
|
||||||
|
bool_pattern = r"(?P<bool>True|False)"
|
||||||
int_pattern =r"(?P<int>[+-]?\d+)"
|
int_pattern =r"(?P<int>[+-]?\d+)"
|
||||||
symbol_pattern = r"(?P<sym>[_a-zA-Z][-!._0-9a-zA-Z]*)"
|
symbol_pattern = r"(?P<sym>[_a-zA-Z][-!._0-9a-zA-Z]*)"
|
||||||
string_pattern = r"(?P<str>[\"]([^\"\\]|[\][\\\"\n\t])*[\"])"
|
string_pattern = r"(?P<str>[\"]([^\"\\]|[\][\\\"\n\t])*[\"])"
|
||||||
|
@ -16,7 +17,8 @@ class Parser():
|
||||||
inside_docu_pattern = r"(?P<other>([^%\[\]\n\s\\]|[\\][%\[\]]?)+)"
|
inside_docu_pattern = r"(?P<other>([^%\[\]\n\s\\]|[\\][%\[\]]?)+)"
|
||||||
|
|
||||||
|
|
||||||
self.total_pattern = re.compile("|".join([float_pattern,int_pattern,symbol_pattern,string_pattern,parenthesis_pattern,
|
self.total_pattern = re.compile("|".join([float_pattern,bool_pattern,int_pattern,symbol_pattern,
|
||||||
|
string_pattern,parenthesis_pattern,
|
||||||
percent_pattern,inside_docu_pattern,space_pattern,newline_pattern]))
|
percent_pattern,inside_docu_pattern,space_pattern,newline_pattern]))
|
||||||
|
|
||||||
self.clc_sexp = None
|
self.clc_sexp = None
|
||||||
|
@ -201,7 +203,7 @@ class Intepreter:
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return sexp["token"]
|
return sexp["token"]
|
||||||
elif sexp[0]["token"] in ["+", "-", "*", "/"]:
|
elif sexp[0]["token"] in ["+", "-", "*", "/", "<", "=", ">", "<=", ">="]:
|
||||||
if len(sexp) != 3:
|
if len(sexp) != 3:
|
||||||
raise Exception("Ln %d, Col %d: the argument length %d of %s is not correct." %
|
raise Exception("Ln %d, Col %d: the argument length %d of %s is not correct." %
|
||||||
(sexp[0]["line"], sexp[0]["col"], len(sexp), a.generate_printable_sexp(sexp)))
|
(sexp[0]["line"], sexp[0]["col"], len(sexp), a.generate_printable_sexp(sexp)))
|
||||||
|
@ -212,8 +214,19 @@ class Intepreter:
|
||||||
return self.interprete_aux(sexp[1]) - self.interprete_aux(sexp[2])
|
return self.interprete_aux(sexp[1]) - self.interprete_aux(sexp[2])
|
||||||
elif sexp[0]["token"] == "*":
|
elif sexp[0]["token"] == "*":
|
||||||
return self.interprete_aux(sexp[1]) * self.interprete_aux(sexp[2])
|
return self.interprete_aux(sexp[1]) * self.interprete_aux(sexp[2])
|
||||||
else:
|
elif sexp[0]["token"] == "/":
|
||||||
return self.interprete_aux(sexp[1]) / self.interprete_aux(sexp[2])
|
return self.interprete_aux(sexp[1]) / self.interprete_aux(sexp[2])
|
||||||
|
elif sexp[0]["token"] == "<":
|
||||||
|
return self.interprete_aux(sexp[1]) < self.interprete_aux(sexp[2])
|
||||||
|
elif sexp[0]["token"] == "=":
|
||||||
|
return self.interprete_aux(sexp[1]) == self.interprete_aux(sexp[2])
|
||||||
|
elif sexp[0]["token"] == ">":
|
||||||
|
return self.interprete_aux(sexp[1]) > self.interprete_aux(sexp[2])
|
||||||
|
elif sexp[0]["token"] == ">=":
|
||||||
|
return self.interprete_aux(sexp[1]) <= self.interprete_aux(sexp[2])
|
||||||
|
else:
|
||||||
|
return self.interprete_aux(sexp[1]) >= self.interprete_aux(sexp[2])
|
||||||
|
|
||||||
|
|
||||||
# macro expanding
|
# macro expanding
|
||||||
elif sexp[0]["token"] in self.macro_list.keys():
|
elif sexp[0]["token"] in self.macro_list.keys():
|
||||||
|
@ -254,6 +267,16 @@ class Intepreter:
|
||||||
(sexp[1]["line"], sexp[1]["col"], sexp[1], sexp[1]["type"]))
|
(sexp[1]["line"], sexp[1]["col"], sexp[1], sexp[1]["type"]))
|
||||||
else:
|
else:
|
||||||
self.env[-1][sexp[1]["token"]] = self.interprete_aux(sexp[2])
|
self.env[-1][sexp[1]["token"]] = self.interprete_aux(sexp[2])
|
||||||
|
elif sexp[0]["token"] == "if":
|
||||||
|
if len(sexp) != 4:
|
||||||
|
raise Exception("Ln %d, Col %d: the number of argument of if should be 3." %
|
||||||
|
(sexp[0]["line"], sexp[0]["col"]))
|
||||||
|
cond = self.interprete_aux(sexp[1])
|
||||||
|
if cond:
|
||||||
|
return self.interprete_aux(sexp[2])
|
||||||
|
else:
|
||||||
|
return self.interprete_aux(sexp[3])
|
||||||
|
|
||||||
elif sexp[0]["token"] == "str":
|
elif sexp[0]["token"] == "str":
|
||||||
if len(sexp) != 2:
|
if len(sexp) != 2:
|
||||||
raise Exception("Ln %d, Col %d: the argument number of str should be 1" %
|
raise Exception("Ln %d, Col %d: the argument number of str should be 1" %
|
||||||
|
@ -422,6 +445,10 @@ text = '''
|
||||||
|
|
||||||
[print[str[bar 156 6546 146514 10 6]]]
|
[print[str[bar 156 6546 146514 10 6]]]
|
||||||
|
|
||||||
|
[define fac [lambda [x] [if [= x 1] 1 [* x [fac [- x 1]]]]]]
|
||||||
|
|
||||||
|
[print [fac 6]]
|
||||||
|
|
||||||
[+[- 2 3][* 5.0 6]]
|
[+[- 2 3][* 5.0 6]]
|
||||||
[define var1 [+[- 2 3][* 5.0 6]]]
|
[define var1 [+[- 2 3][* 5.0 6]]]
|
||||||
[set! var1 [* 10 2]]
|
[set! var1 [* 10 2]]
|
||||||
|
|
Loading…
Reference in a new issue