start with comments...

This commit is contained in:
Jeremy Ashkenas
2012-09-25 18:10:43 -05:00
parent 9167b3aca1
commit bb194dc6c6
6 changed files with 21 additions and 17 deletions

View File

@@ -43,7 +43,7 @@
}
merge = exports.helpers.merge;
try {
js = (parser.parse(lexer.tokenize(code))).compile(options);
js = (parser.parse(lexer.tokenize(code, options))).compile(options);
if (!options.header) {
return js;
}

View File

@@ -474,6 +474,7 @@
compileOptions = function(filename) {
return {
filename: filename,
extension: path.extname(filename),
bare: opts.bare,
header: opts.compile
};

View File

@@ -16,6 +16,7 @@
if (opts == null) {
opts = {};
}
this.literate = opts.extension === '.litcoffee';
if (WHITESPACE.test(code)) {
code = "\n" + code;
}
@@ -30,7 +31,7 @@
this.tokens = [];
i = 0;
while (this.chunk = code.slice(i)) {
i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();
i += this.commentToken() || this.identifierToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();
}
this.closeIndentation();
if (tag = this.ends.pop()) {

View File

@@ -36,7 +36,7 @@ exports.helpers = require './helpers'
exports.compile = compile = (code, options = {}) ->
{merge} = exports.helpers
try
js = (parser.parse lexer.tokenize code).compile options
js = (parser.parse lexer.tokenize(code, options)).compile options
return js unless options.header
catch err
err.message = "In #{options.filename}, #{err.message}" if options.filename

View File

@@ -318,7 +318,7 @@ parseOptions = ->
# The compile-time options to pass to the CoffeeScript compiler.
compileOptions = (filename) ->
{filename, bare: opts.bare, header: opts.compile}
{filename, extension: path.extname(filename), bare: opts.bare, header: opts.compile}
# Start up a new Node.js instance with the arguments in `--nodejs` passed to
# the `node` binary, preserving the other options.

View File

@@ -32,25 +32,27 @@ exports.Lexer = class Lexer
# Before returning the token stream, run it through the [Rewriter](rewriter.html)
# unless explicitly asked not to.
tokenize: (code, opts = {}) ->
code = "\n#{code}" if WHITESPACE.test code
code = code.replace(/\r/g, '').replace TRAILING_SPACES, ''
@code = code # The remainder of the source code.
@line = opts.line or 0 # The current line.
@indent = 0 # The current indentation level.
@indebt = 0 # The over-indentation at the current level.
@outdebt = 0 # The under-outdentation at the current level.
@indents = [] # The stack of all current indentation levels.
@ends = [] # The stack for pairing up tokens.
@tokens = [] # Stream of parsed tokens in the form `['TYPE', value, line]`.
@literate = opts.extension is '.litcoffee'
code = "\n#{code}" if WHITESPACE.test code
code = code.replace(/\r/g, '').replace TRAILING_SPACES, ''
@code = code # The remainder of the source code.
@line = opts.line or 0 # The current line.
@indent = 0 # The current indentation level.
@indebt = 0 # The over-indentation at the current level.
@outdebt = 0 # The under-outdentation at the current level.
@indents = [] # The stack of all current indentation levels.
@ends = [] # The stack for pairing up tokens.
@tokens = [] # Stream of parsed tokens in the form `['TYPE', value, line]`.
# At every position, run through this list of attempted matches,
# short-circuiting if any of them succeed. Their order determines precedence:
# `@literalToken` is the fallback catch-all.
i = 0
while @chunk = code[i..]
i += @identifierToken() or
@commentToken() or
i += @commentToken() or
@identifierToken() or
@whitespaceToken() or
@lineToken() or
@heredocToken() or