aboutsummaryrefslogtreecommitdiff
path: root/nomsu_compiler.moon
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-09-14 14:00:48 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-09-14 14:01:07 -0700
commit7c1f2dfd69afe119322e19b3a4061876b3dd1033 (patch)
treeee540007cdad2681b03a208c657811591da58cc9 /nomsu_compiler.moon
parent4d48bf359df98512a2a741d48ea222d055b733c0 (diff)
Fixes and improvements, and ported nomsu.3.peg to new tidier syntax.
Diffstat (limited to 'nomsu_compiler.moon')
-rw-r--r--nomsu_compiler.moon34
1 files changed, 18 insertions, 16 deletions
diff --git a/nomsu_compiler.moon b/nomsu_compiler.moon
index 4300327..606bf45 100644
--- a/nomsu_compiler.moon
+++ b/nomsu_compiler.moon
@@ -38,10 +38,25 @@ table.copy = (t)-> setmetatable({k,v for k,v in pairs(t)}, getmetatable(t))
-- consider non-linear codegen, rather than doing thunks for things like comprehensions
-- Re-implement nomsu-to-lua comment translation?
+make_tree = (tree, userdata)->
+ cls = AST[tree.type]
+ tree.source = Source(userdata.filename, tree.start, tree.stop)
+ tree.start, tree.stop = nil, nil
+ tree.type = nil
+ tree.comments = [t for t in *tree when AST.is_syntax_tree(t, "Comment")]
+ if #tree.comments == 0 then tree.comments = nil
+ for i=#tree,1,-1
+ if AST.is_syntax_tree(tree[i], "Comment")
+ table.remove(tree, i)
+ tree = setmetatable(tree, cls)
+ cls.source_code_for_tree[tree] = userdata.source
+ if tree.__init then tree\__init!
+ return tree
+
Parsers = {}
max_parser_version = 0
for version=1,999
- continue unless version == 4 -- TODO: remove
+ continue unless version == 4 or version == 3 -- TODO: remove
peg_file = io.open("nomsu.#{version}.peg")
if not peg_file and package.nomsupath
for path in package.nomsupath\gmatch("[^;]+")
@@ -49,21 +64,8 @@ for version=1,999
break if peg_file
break unless peg_file
max_parser_version = version
- make_tree = (tree, userdata)->
- cls = AST[tree.type]
- tree.source = Source(userdata.filename, tree.start, tree.stop)
- tree.start, tree.stop = nil, nil
- tree.type = nil
- tree.comments = [t for t in *tree when AST.is_syntax_tree(t, "Comment")]
- if #tree.comments == 0 then tree.comments = nil
- for i=#tree,1,-1
- if AST.is_syntax_tree(tree[i], "Comment")
- table.remove(tree, i)
- tree = setmetatable(tree, cls)
- cls.source_code_for_tree[tree] = userdata.source
- if tree.__init then tree\__init!
- return tree
- Parsers[version] = make_parser(peg_file\read("*a"), make_tree)
+ peg_contents = peg_file\read("*a")
+ Parsers[version] = make_parser(peg_contents, make_tree)
peg_file\close!
MAX_LINE = 80 -- For beautification purposes, try not to make lines much longer than this value