From cd4b6466ebc847e5859ec47944f9df7bd34f8bbd Mon Sep 17 00:00:00 2001 From: loveencounterflow Date: Sat, 1 Nov 2014 17:55:55 +0100 Subject: [PATCH] autocommit --- README.md | 3 + lib/main.js | 68 ++++++++------------ src/main.coffee | 160 +++++++++++++++++++++++++++--------------------- 3 files changed, 118 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index 674caae..593f397 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,7 @@ > https://github.com/douglascrockford/TDOP adapted for NodeJS +**Note** This is work in progress and probably not very usable for a lot of people. + + diff --git a/lib/main.js b/lib/main.js index 1d1f9fe..39230f8 100644 --- a/lib/main.js +++ b/lib/main.js @@ -10,17 +10,7 @@ */ (function() { - var BNP, TEXT, TRM, TYPES, alert, badge, debug, echo, help, info, log, make_parse, njs_fs, njs_path, rpr, urge, warn, whisper; - - njs_path = require('path'); - - njs_fs = require('fs'); - - TEXT = require('coffeenode-text'); - - TYPES = require('coffeenode-types'); - - BNP = require('coffeenode-bitsnpieces'); + var TRM, badge, debug, make_parse, rpr, warn; TRM = require('coffeenode-trm'); @@ -28,31 +18,25 @@ badge = 'TDOP'; - log = TRM.get_logger('plain', badge); - - info = TRM.get_logger('info', badge); - - alert = TRM.get_logger('alert', badge); - debug = TRM.get_logger('debug', badge); warn = TRM.get_logger('warn', badge); - urge = TRM.get_logger('urge', badge); - whisper = TRM.get_logger('whisper', badge); + /* TAINT modifies `String.prototype` */ + - help = TRM.get_logger('help', badge); + /* TAINT do we want to have a separate tokenizer? */ - echo = TRM.echo.bind(TRM); + require('./tokens'); make_parse = function() { - var advance, assignment, block, constant, expression, infix, infixr, itself, new_scope, original_scope, original_symbol, prefix, scope, statement, statements, stmt, symbol, symbol_table, token, token_nr, tokens; - scope = void 0; + var advance, assignment, block, constant, expression, infix, infixr, itself, new_scope, original_scope, original_symbol, parse, prefix, scope, statement, statements, stmt, symbol, symbol_table, token, token_nr, tokens; + scope = null; symbol_table = {}; - token = void 0; - tokens = void 0; - token_nr = void 0; + token = null; + tokens = null; + token_nr = null; itself = function() { return this; }; @@ -75,7 +59,7 @@ find: function(n) { var e, o; e = this; - o = void 0; + o = null; while (true) { o = e.def[n]; if (o && typeof o !== 'function') { @@ -119,10 +103,10 @@ }; advance = function(id) { var a, o, t, v; - a = void 0; - o = void 0; - t = void 0; - v = void 0; + a = null; + o = null; + t = null; + v = null; if (id && token.id !== id) { token.error('Expected \'' + id + '\'.'); } @@ -156,7 +140,7 @@ }; expression = function(rbp) { var left, t; - left = void 0; + left = null; t = token; advance(); left = t.nud(); @@ -170,7 +154,7 @@ statement = function() { var n, v; n = token; - v = void 0; + v = null; if (n.std) { advance(); scope.reserve(n); @@ -186,7 +170,7 @@ statements = function() { var a, s; a = []; - s = void 0; + s = null; while (true) { if (token.id === '}' || token.id === '(end)') { break; @@ -217,10 +201,10 @@ throw new Error(message); }, nud: function() { - this.error('doesn\'t have a nud: ' + (require('util')).inspect(this)); + this.error("doesn't have a nud: " + (rpr(this))); }, led: function(left) { - this.error('Missing operator / led: ' + (require('util')).inspect(this)); + this.error("Missing operator / led: " + (rpr(this))); } }; symbol = function(id, bp) { @@ -454,8 +438,8 @@ prefix('{', function() { var a, n, v; a = []; - n = void 0; - v = void 0; + n = null; + v = null; if (token.id !== '}') { while (true) { n = token; @@ -489,8 +473,8 @@ stmt('var', function() { var a, n, t; a = []; - n = void 0; - t = void 0; + n = null; + t = null; while (true) { n = token; if (n.arity !== 'name') { @@ -564,7 +548,7 @@ this.arity = 'statement'; return this; }); - return function(source) { + return parse = function(source) { var s; tokens = source.tokens('=<>!+-*&|/%^', '=<>&|'); token_nr = 0; @@ -577,6 +561,6 @@ }; }; - module.exports = make_parse(); + module.exports = make_parse; }).call(this); diff --git a/src/main.coffee b/src/main.coffee index dbb6e10..2d5361a 100644 --- a/src/main.coffee +++ b/src/main.coffee @@ -10,36 +10,33 @@ ############################################################################################################ -njs_path = require 'path' -njs_fs = require 'fs' -#........................................................................................................... -TEXT = require 'coffeenode-text' -TYPES = require 'coffeenode-types' -BNP = require 'coffeenode-bitsnpieces' -#........................................................................................................... TRM = require 'coffeenode-trm' rpr = TRM.rpr.bind TRM badge = 'TDOP' -log = TRM.get_logger 'plain', badge -info = TRM.get_logger 'info', badge -alert = TRM.get_logger 'alert', badge +# log = TRM.get_logger 'plain', badge +# info = TRM.get_logger 'info', badge +# alert = TRM.get_logger 'alert', badge debug = TRM.get_logger 'debug', badge warn = TRM.get_logger 'warn', badge -urge = TRM.get_logger 'urge', badge -whisper = TRM.get_logger 'whisper', badge -help = TRM.get_logger 'help', badge -echo = TRM.echo.bind TRM +# urge = TRM.get_logger 'urge', badge +# whisper = TRM.get_logger 'whisper', badge +# help = TRM.get_logger 'help', badge +# echo = TRM.echo.bind TRM #........................................................................................................... +### TAINT modifies `String.prototype` ### +### TAINT do we want to have a separate tokenizer? ### +require './tokens' +#=========================================================================================================== make_parse = -> - scope = undefined - symbol_table = {} - token = undefined - tokens = undefined - token_nr = undefined - itself = -> - this - + scope = null + symbol_table = {} + token = null + tokens = null + token_nr = null + itself = -> @ + + #--------------------------------------------------------------------------------------------------------- original_scope = define: (n) -> t = @def[n.value] @@ -55,7 +52,7 @@ make_parse = -> find: (n) -> e = this - o = undefined + o = null loop o = e.def[n] return e.def[n] if o and typeof o isnt 'function' @@ -79,6 +76,7 @@ make_parse = -> n.reserved = true return + #--------------------------------------------------------------------------------------------------------- new_scope = -> s = scope scope = Object.create(original_scope) @@ -86,11 +84,12 @@ make_parse = -> scope.parent = s scope + #--------------------------------------------------------------------------------------------------------- advance = (id) -> - a = undefined - o = undefined - t = undefined - v = undefined + a = null + o = null + t = null + v = null token.error 'Expected \'' + id + '\'.' if id and token.id isnt id if token_nr >= tokens.length token = symbol_table['(end)'] @@ -116,8 +115,9 @@ make_parse = -> token.arity = a token + #--------------------------------------------------------------------------------------------------------- expression = (rbp) -> - left = undefined + left = null t = token advance() left = t.nud() @@ -127,9 +127,10 @@ make_parse = -> left = t.led(left) left + #--------------------------------------------------------------------------------------------------------- statement = -> n = token - v = undefined + v = null if n.std advance() scope.reserve n @@ -139,103 +140,119 @@ make_parse = -> advance ';' v + #--------------------------------------------------------------------------------------------------------- statements = -> a = [] - s = undefined + s = null loop break if token.id is '}' or token.id is '(end)' s = statement() a.push s if s (if a.length is 0 then null else (if a.length is 1 then a[0] else a)) + #--------------------------------------------------------------------------------------------------------- block = -> t = token advance '{' t.std() + #--------------------------------------------------------------------------------------------------------- original_symbol = + + #....................................................................................................... error: (message) -> + # console.log( '!!!' + message ); throw new Error(message) - - # console.log( '!!!' + message ); + #....................................................................................................... nud: -> - - # console.log( '©5t9', Object.keys(this)); - @error 'doesn\'t have a nud: ' + (require('util')).inspect(this) + @error "doesn't have a nud: #{rpr @}" return + #....................................................................................................... led: (left) -> - @error 'Missing operator / led: ' + (require('util')).inspect(this) + @error "Missing operator / led: #{rpr @}" return + #--------------------------------------------------------------------------------------------------------- symbol = (id, bp) -> - s = symbol_table[id] - bp = bp or 0 + s = symbol_table[id] + bp = bp or 0 + #....................................................................................................... if s s.lbp = bp if bp >= s.lbp + #....................................................................................................... else s = Object.create(original_symbol) s.id = s.value = id s.lbp = bp symbol_table[id] = s - s + #....................................................................................................... + return s + #--------------------------------------------------------------------------------------------------------- constant = (s, v) -> x = symbol(s) + #....................................................................................................... x.nud = -> scope.reserve this @value = symbol_table[@id].value @arity = 'literal' this - + #....................................................................................................... x.value = v - x + return x + #--------------------------------------------------------------------------------------------------------- infix = (id, bp, led) -> s = symbol(id, bp) + #....................................................................................................... s.led = led or (left) -> @first = left @second = expression(bp) @arity = 'binary' this + #....................................................................................................... + return s - s - + #--------------------------------------------------------------------------------------------------------- infixr = (id, bp, led) -> s = symbol(id, bp) + #....................................................................................................... s.led = led or (left) -> @first = left @second = expression(bp - 1) @arity = 'binary' this + #....................................................................................................... + return s - s - + #--------------------------------------------------------------------------------------------------------- assignment = (id) -> - infixr id, 10, (left) -> + return infixr id, 10, (left) -> left.error 'Bad lvalue.' if left.id isnt '.' and left.id isnt '[' and left.arity isnt 'name' @first = left @second = expression(9) @assignment = true @arity = 'binary' - this - + return @ + #--------------------------------------------------------------------------------------------------------- prefix = (id, nud) -> s = symbol(id) s.nud = nud or -> scope.reserve this @first = expression(70) @arity = 'unary' - this - - s + return @ + #....................................................................................................... + return s + #--------------------------------------------------------------------------------------------------------- stmt = (s, f) -> x = symbol(s) x.std = f - x + return x symbol '(end)' symbol '(name)' @@ -256,7 +273,7 @@ make_parse = -> symbol('this').nud = -> scope.reserve this @arity = 'this' - this + return @ assignment '=' assignment '+=' @@ -267,7 +284,7 @@ make_parse = -> advance ':' @third = expression(0) @arity = 'ternary' - this + return @ infixr '&&', 30 infixr '||', 30 @@ -288,14 +305,14 @@ make_parse = -> @second = token @arity = 'binary' advance() - this + return @ infix '[', 80, (left) -> @first = left @second = expression(0) @arity = 'binary' advance ']' - this + return @ infix '(', 80, (left) -> a = [] @@ -315,7 +332,7 @@ make_parse = -> break if token.id isnt ',' advance ',' advance ')' - this + return @ prefix '!' prefix '-' @@ -348,7 +365,7 @@ make_parse = -> advance '}' @arity = 'function' scope.pop() - this + return @ prefix '[', -> a = [] @@ -360,12 +377,12 @@ make_parse = -> advance ']' @first = a @arity = 'unary' - this + return @ prefix '{', -> a = [] - n = undefined - v = undefined + n = null + v = null if token.id isnt '}' loop n = token @@ -380,7 +397,7 @@ make_parse = -> advance '}' @first = a @arity = 'unary' - this + return @ stmt '{', -> new_scope() @@ -391,8 +408,8 @@ make_parse = -> stmt 'var', -> a = [] - n = undefined - t = undefined + n = null + t = null loop n = token n.error 'Expected a new variable name.' if n.arity isnt 'name' @@ -422,20 +439,20 @@ make_parse = -> else @third = null @arity = 'statement' - this + return @ stmt 'return', -> @first = expression(0) if token.id isnt ';' advance ';' token.error 'Unreachable statement.' if token.id isnt '}' @arity = 'statement' - this + return @ stmt 'break', -> advance ';' token.error 'Unreachable statement.' if token.id isnt '}' @arity = 'statement' - this + return @ stmt 'while', -> advance '(' @@ -443,9 +460,10 @@ make_parse = -> advance ')' @second = block() @arity = 'statement' - this + return @ - (source) -> + #--------------------------------------------------------------------------------------------------------- + return parse = ( source ) -> tokens = source.tokens('=<>!+-*&|/%^', '=<>&|') token_nr = 0 new_scope() @@ -453,6 +471,6 @@ make_parse = -> s = statements() advance '(end)' scope.pop() - s + return s -module.exports = make_parse() +module.exports = make_parse # ()