add SILE output
This commit is contained in:
parent
3bc6204429
commit
cdcb7a7d46
1 changed files with 47 additions and 16 deletions
|
@ -1,6 +1,7 @@
|
|||
#-*-coding:utf-8-*-
|
||||
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
class Parser():
|
||||
|
||||
|
@ -158,21 +159,32 @@ class Intepreter:
|
|||
# environment
|
||||
self.env = [dict()]
|
||||
self.macro_list = dict()
|
||||
|
||||
self.silexml = ET.Element('sile')
|
||||
|
||||
def remove_spaces_and_newlines(self, sexp):
|
||||
is_inside_defstx = False
|
||||
return self.remove_spaces_and_newlines_aux(sexp, is_inside_defstx)
|
||||
|
||||
def remove_spaces_and_newlines_aux(self, sexp, is_inside_defstx):
|
||||
if isinstance(sexp, list):
|
||||
if isinstance(sexp[0], dict) and sexp[0]["token"] == "docu":
|
||||
result = []
|
||||
if isinstance(sexp[0], dict) and sexp[0]["token"] == "def-syntax":
|
||||
is_inside_defstx = True
|
||||
if isinstance(sexp[0], dict) and sexp[0]["token"] == "docu" \
|
||||
and is_inside_defstx == False:
|
||||
result = []
|
||||
for i in sexp[1:]:
|
||||
if i["type"] in ["space", "nl"]:
|
||||
if isinstance(i, list):
|
||||
result.append(self.remove_spaces_and_newlines_aux(i, is_inside_defstx))
|
||||
elif i["type"] in ["space", "nl"]:
|
||||
result.append(i)
|
||||
else:
|
||||
result.append(self.remove_spaces_and_newlines(i))
|
||||
result.append(self.remove_spaces_and_newlines_aux(i, is_inside_defstx))
|
||||
|
||||
result = sexp[0:1] + result
|
||||
|
||||
result = sexp[0] + result
|
||||
else:
|
||||
result = [self.remove_spaces_and_newlines(i)
|
||||
result = [self.remove_spaces_and_newlines_aux(i, is_inside_defstx)
|
||||
for i in sexp if not isinstance(i, dict) or (i["type"] not in ["space", "nl"])]
|
||||
return result
|
||||
else:
|
||||
|
@ -197,7 +209,7 @@ class Intepreter:
|
|||
break
|
||||
|
||||
if res == None:
|
||||
raise Exception("Ln %d, Col %d: the variable is not found!" % (sexp["line"], sexp["col"], sexp["token"]))
|
||||
raise Exception("Ln %d, Col %d: the variable %s is not found!" % (sexp["line"], sexp["col"], sexp["token"]))
|
||||
else:
|
||||
return res
|
||||
|
||||
|
@ -243,7 +255,8 @@ class Intepreter:
|
|||
syntax_after = i["after"]
|
||||
is_found = True
|
||||
break
|
||||
elif len(i["before"]) < macro_len and re.match(r".+[.]{3}$", i["before"][-1]["token"]):
|
||||
elif len(i["before"]) < macro_len and isinstance(i["before"][-1], dict) \
|
||||
and re.match(r".+[.]{3}$", i["before"][-1]["token"]):
|
||||
unification = self.unify(sexp, i["before"], unification)
|
||||
syntax_after = i["after"]
|
||||
is_found = True
|
||||
|
@ -289,14 +302,15 @@ class Intepreter:
|
|||
raise Exception("Ln %d, Col %d: the argument number of str should be 2" %
|
||||
(sexp[0]["line"], sexp[0]["col"]))
|
||||
else:
|
||||
return sexp[1] + sexp[2]
|
||||
return self.interprete_aux(sexp[1]) + self.interprete_aux(sexp[2])
|
||||
|
||||
elif sexp[0]["token"] == "print":
|
||||
if len(sexp) != 2:
|
||||
raise Exception("Ln %d, Col %d: the argument number of print should be 1" %
|
||||
(sexp[0]["line"], sexp[0]["col"]))
|
||||
else:
|
||||
print(self.interprete_aux(sexp[1]))
|
||||
result = self.interprete_aux(sexp[1])
|
||||
print(result)
|
||||
elif sexp[0]["token"] == "set!":
|
||||
if sexp[1]["type"] != "sym":
|
||||
raise Exception("Ln %d, Col %d: the type of %s should be symbol, not %s" %
|
||||
|
@ -348,6 +362,11 @@ class Intepreter:
|
|||
(sexp[1]["line"], sexp[1]["col"], sexp[1]))
|
||||
else:
|
||||
return Lambda(sexp[1], sexp[2], self.env)
|
||||
|
||||
elif sexp[0]["token"] == "SILE":
|
||||
self.silexml.text = self.interprete_aux(sexp[1])
|
||||
return ET.tostring(self.silexml, encoding="unicode")
|
||||
|
||||
else:
|
||||
sexp_new = [self.interprete_aux(x) for x in sexp]
|
||||
|
||||
|
@ -451,18 +470,30 @@ text = '''
|
|||
[[_ x y] [+ x y]]
|
||||
[[_ x y z...] [+ x [bar y z...]]]]
|
||||
|
||||
[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]]
|
||||
%[print [fac 6]]
|
||||
|
||||
[+[- 2 3][* 5.0 6]]
|
||||
[define var1 [+[- 2 3][* 5.0 6]]]
|
||||
[set! var1 [* 10 2]]
|
||||
[define foo [lambda [x y] [begin [+ x y][set! var1 10] 7]]]
|
||||
[foo 12 5]
|
||||
[print [+ var1 5]]
|
||||
%[print [+ var1 5]]
|
||||
|
||||
[def-syntax docu
|
||||
[[_ x] [SILE[docu_aux x]]]
|
||||
[[_ x y...] [SILE[docu_aux x y...]]]]
|
||||
|
||||
[def-syntax docu_aux
|
||||
[[_ x] [str x]]
|
||||
[[_ [x...]] [str [x...]]]
|
||||
[[_ x y...] [str-append[docu_aux x] [docu_aux y...]]]]
|
||||
|
||||
[print [docu 貓]]
|
||||
[print[docu 我是貓 [+ 12 3],還沒有名字。]]
|
||||
'''
|
||||
|
||||
"""text = '''[[[ 123 1.23 abc "\\123\\\"貓貓貓"] 我是貓,喵\[喵\]貓\%。喵喵%喵
|
||||
|
@ -470,13 +501,13 @@ text = '''
|
|||
|
||||
% TODO
|
||||
[def-syntax docu
|
||||
[[_ x] [sile[docu_aux x]]]
|
||||
[[_ x y...] [sile[docu_aux x y...]]]]
|
||||
[[_ @ para x] [SILE[docu_aux x]]]
|
||||
[[_ @ para x y...] [SILE[docu_aux x y...]]]]
|
||||
|
||||
[def-syntax docu_aux
|
||||
[[_ x] [str x]]
|
||||
[[_ [x...] [str [x...]]]]
|
||||
[[_ x y...] [str-append[docu_aux x] [docu y...]]]]]
|
||||
[[_ x y...] [str-append[docu_aux x] [docu_aux y...]]]]]
|
||||
|
||||
"""
|
||||
|
||||
|
|
Loading…
Reference in a new issue