mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-02-19 03:44:23 -05:00
lexer: had some aligning fun
This commit is contained in:
45
lib/lexer.js
45
lib/lexer.js
@@ -1,5 +1,5 @@
|
||||
(function() {
|
||||
var ASSIGNED, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, CONVERSIONS, HEREDOC, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LEADING_SPACES, LINE_BREAK, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NEXT_CHARACTER, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, _ref, compact, count, include, last, starts;
|
||||
var ASSIGNED, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, CONVERSIONS, HEREDOC, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LEADING_SPACES, LINE_BREAK, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NEGATABLE, NEXT_CHARACTER, NOT_REGEX, NO_NEWLINE, NUMBER, OPERATOR, REGEX, RESERVED, Rewriter, SHIFT, SIMPLESTR, TRAILING_SPACES, UNARY, WHITESPACE, _ref, compact, count, include, last, starts;
|
||||
Rewriter = require('./rewriter').Rewriter;
|
||||
_ref = require('./helpers'), include = _ref.include, count = _ref.count, starts = _ref.starts, compact = _ref.compact, last = _ref.last;
|
||||
exports.Lexer = (function() {
|
||||
@@ -309,9 +309,9 @@
|
||||
return true;
|
||||
};
|
||||
Lexer.prototype.literalToken = function() {
|
||||
var _ref2, match, prev, space, spaced, tag, val, value;
|
||||
if (match = this.chunk.match(OPERATOR)) {
|
||||
_ref2 = match, value = _ref2[0], space = _ref2[1];
|
||||
var match, prev, ptag, pval, tag, value;
|
||||
if (match = OPERATOR.exec(this.chunk)) {
|
||||
value = match[0];
|
||||
if (CODE.test(value)) {
|
||||
this.tagParameters();
|
||||
}
|
||||
@@ -319,19 +319,19 @@
|
||||
value = this.chunk.charAt(0);
|
||||
}
|
||||
this.i += value.length;
|
||||
prev = last(this.tokens);
|
||||
spaced = ((prev != null) ? prev.spaced : undefined);
|
||||
tag = value;
|
||||
if (value === '=') {
|
||||
if (include(JS_FORBIDDEN, val = this.value())) {
|
||||
if (include(JS_FORBIDDEN, pval = this.value())) {
|
||||
this.assignmentError();
|
||||
}
|
||||
if (('or' === val || 'and' === val)) {
|
||||
this.tokens.splice(-1, 1, ['COMPOUND_ASSIGN', CONVERSIONS[val] + '=', prev[2]]);
|
||||
if (('or' === pval || 'and' === pval)) {
|
||||
prev = last(this.tokens);
|
||||
prev[0] = 'COMPOUND_ASSIGN';
|
||||
prev[1] = CONVERSIONS[pval] + '=';
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (value === ';') {
|
||||
if (';' === value) {
|
||||
tag = 'TERMINATOR';
|
||||
} else if (include(LOGIC, value)) {
|
||||
tag = 'LOGIC';
|
||||
@@ -345,20 +345,20 @@
|
||||
tag = 'UNARY';
|
||||
} else if (include(SHIFT, value)) {
|
||||
tag = 'SHIFT';
|
||||
} else if (include(CALLABLE, this.tag()) && !spaced) {
|
||||
} else if ((prev = last(this.tokens)) && !prev.spaced && include(CALLABLE, ptag = prev[0])) {
|
||||
if (value === '(') {
|
||||
if (prev[0] === '?') {
|
||||
if (ptag === '?') {
|
||||
prev[0] = 'FUNC_EXIST';
|
||||
}
|
||||
tag = 'CALL_START';
|
||||
} else if (value === '[') {
|
||||
tag = 'INDEX_START';
|
||||
switch (this.tag()) {
|
||||
switch (ptag) {
|
||||
case '?':
|
||||
this.tag(0, 'INDEX_SOAK');
|
||||
prev[0] = 'INDEX_SOAK';
|
||||
break;
|
||||
case '::':
|
||||
this.tag(0, 'INDEX_PROTO');
|
||||
prev[0] = 'INDEX_PROTO';
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -547,19 +547,13 @@
|
||||
Lexer.prototype.token = function(tag, value) {
|
||||
return this.tokens.push([tag, value, this.line]);
|
||||
};
|
||||
Lexer.prototype.tag = function(index, newTag) {
|
||||
Lexer.prototype.tag = function(index, tag) {
|
||||
var tok;
|
||||
if (!(tok = last(this.tokens, index))) {
|
||||
return null;
|
||||
}
|
||||
return (tok[0] = (newTag != null) ? newTag : tok[0]);
|
||||
return (tok = last(this.tokens, index)) && ((tag != null) ? (tok[0] = tag) : tok[0]);
|
||||
};
|
||||
Lexer.prototype.value = function(index, val) {
|
||||
var tok;
|
||||
if (!(tok = last(this.tokens, index))) {
|
||||
return null;
|
||||
}
|
||||
return (tok[1] = (val != null) ? val : tok[1]);
|
||||
return (tok = last(this.tokens, index)) && ((val != null) ? (tok[1] = val) : tok[1]);
|
||||
};
|
||||
Lexer.prototype.unfinished = function() {
|
||||
var prev, value;
|
||||
@@ -585,7 +579,7 @@
|
||||
IDENTIFIER = /^[a-zA-Z_$][\w$]*/;
|
||||
NUMBER = /^0x[\da-f]+|^(?:\d+(\.\d+)?|\.\d+)(?:e[+-]?\d+)?/i;
|
||||
HEREDOC = /^("""|''')([\s\S]*?)(?:\n[ \t]*)?\1/;
|
||||
OPERATOR = /^(?:-[-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)(?=([ \t]*))/;
|
||||
OPERATOR = /^(?:-[-=>]?|\+[+=]?|[*&|\/%=<>^:!?]+)/;
|
||||
WHITESPACE = /^[ \t]+/;
|
||||
COMMENT = /^###([^#][\s\S]*?)(?:###[ \t]*\n|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/;
|
||||
CODE = /^[-=]>/;
|
||||
@@ -610,6 +604,7 @@
|
||||
MATH = ['*', '/', '%'];
|
||||
NOT_REGEX = ['NUMBER', 'REGEX', '++', '--', 'FALSE', 'NULL', 'TRUE', ']'];
|
||||
CALLABLE = ['IDENTIFIER', 'SUPER', ')', ']', '}', 'STRING', '@', 'THIS', '?', '::'];
|
||||
NEGATABLE = ['IN', 'OF', 'INSTANCEOF'];
|
||||
LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'];
|
||||
CONVERSIONS = {
|
||||
'and': '&&',
|
||||
|
||||
Reference in New Issue
Block a user