diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-09-14 14:00:48 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-09-14 14:01:07 -0700 |
| commit | 7c1f2dfd69afe119322e19b3a4061876b3dd1033 (patch) | |
| tree | ee540007cdad2681b03a208c657811591da58cc9 /nomsu_compiler.moon | |
| parent | 4d48bf359df98512a2a741d48ea222d055b733c0 (diff) | |
Fixes and improvements, and ported nomsu.3.peg to new tidier syntax.
Diffstat (limited to 'nomsu_compiler.moon')
| -rw-r--r-- | nomsu_compiler.moon | 34 |
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 |
