mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
got about as far as I think I can with operator nodes for now, without zach's optimizations
This commit is contained in:
parent
9339058fc3
commit
76dac9c09c
5 changed files with 223 additions and 122 deletions
|
@ -7,17 +7,17 @@
|
|||
// Detect functions: [
|
||||
unwrap = /function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
|
||||
// Quickie DSL for Jison access.
|
||||
o = function o(pattern_string, func) {
|
||||
o = function o(pattern_string, func, options) {
|
||||
var match;
|
||||
if (func) {
|
||||
func = (match = (func + "").match(unwrap)) ? match[1] : '(' + func + '())';
|
||||
return [pattern_string, '$$ = ' + func + ';'];
|
||||
return [pattern_string, '$$ = ' + func + ';', options];
|
||||
} else {
|
||||
return [pattern_string, '$$ = $1;'];
|
||||
return [pattern_string, '$$ = $1;', options];
|
||||
}
|
||||
};
|
||||
// Precedence ===========================================================
|
||||
operators = [["left", '?'], ["right", 'NOT', '!', '!!', '~', '++', '--'], ["left", '*', '/', '%'], ["left", '+', '-'], ["left", '<<', '>>', '>>>'], ["left", '&', '|', '^'], ["left", '<=', '<', '>', '>='], ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'], ["right", '==', '!=', 'IS', 'ISNT'], ["left", '&&', '||', 'AND', 'OR'], ["right", '-=', '+=', '/=', '*=', '%='], ["left", '.'], ["right", 'INDENT'], ["left", 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY'], ["right", 'THROW', 'FOR', 'NEW', 'SUPER'], ["left", 'EXTENDS'], ["left", '||=', '&&=', '?='], ["right", 'ASSIGN', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE', 'WHILE']];
|
||||
operators = [["left", '?'], ["right", 'UMINUS', 'UPLUS', 'NOT', '!', '!!', '~', '++', '--'], ["left", '*', '/', '%'], ["left", '+', '-'], ["left", '<<', '>>', '>>>'], ["left", '&', '|', '^'], ["left", '<=', '<', '>', '>='], ["right", 'DELETE', 'INSTANCEOF', 'TYPEOF'], ["right", '==', '!=', 'IS', 'ISNT'], ["left", '&&', '||', 'AND', 'OR'], ["right", '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?='], ["left", '.'], ["right", 'INDENT'], ["left", 'OUTDENT'], ["right", 'WHEN', 'LEADING_WHEN', 'IN', 'OF', 'BY'], ["right", 'THROW', 'FOR', 'NEW', 'SUPER'], ["left", 'EXTENDS'], ["right", 'ASSIGN', 'RETURN'], ["right", '->', '=>', 'UNLESS', 'IF', 'ELSE', 'WHILE']];
|
||||
// Grammar ==============================================================
|
||||
grammar = {
|
||||
// All parsing will end in this rule, being the trunk of the AST.
|
||||
|
@ -106,67 +106,92 @@
|
|||
return new CommentNode(yytext);
|
||||
})
|
||||
],
|
||||
//
|
||||
// # Arithmetic and logical operators
|
||||
// # For Ruby's Operator precedence, see: [
|
||||
// # https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html
|
||||
// Operation: [
|
||||
// o "! Expression", -> new OpNode($1, $2)
|
||||
// o "!! Expression", -> new OpNode($1, $2)
|
||||
// o "- Expression", -> new OpNode($1, $2)
|
||||
// o "+ Expression", -> new OpNode($1, $2)
|
||||
// o "NOT Expression", -> new OpNode($1, $2)
|
||||
// o "~ Expression", -> new OpNode($1, $2)
|
||||
// o "-- Expression", -> new OpNode($1, $2)
|
||||
// o "++ Expression", -> new OpNode($1, $2)
|
||||
// o "DELETE Expression", -> new OpNode($1, $2)
|
||||
// o "TYPEOF Expression", -> new OpNode($1, $2)
|
||||
// o "Expression --", -> new OpNode($2, $1, null, true)
|
||||
// o "Expression ++", -> new OpNode($2, $1, null, true)
|
||||
//
|
||||
// o "Expression * Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression / Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression % Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression + Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression - Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression << Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression >> Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression >>> Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression & Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression | Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ^ Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression <= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression < Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression > Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression >= Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression == Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression != Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression IS Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ISNT Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression && Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression || Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression AND Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression OR Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ? Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression -= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression += Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression /= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression *= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression %= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ||= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression &&= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ?= Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression IN Expression", -> new OpNode($2, $1, $3)
|
||||
// ]
|
||||
// Arithmetic and logical operators
|
||||
// For Ruby's Operator precedence, see: [
|
||||
// https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html
|
||||
Operation: [o("! Expression", function() {
|
||||
return new OpNode('!', $2);
|
||||
}), o("!! Expression", function() {
|
||||
return new OpNode('!!', $2);
|
||||
}), o("- Expression", (function() {
|
||||
return new OpNode('-', $2);
|
||||
}), {
|
||||
prec: 'UMINUS'
|
||||
}), o("+ Expression", (function() {
|
||||
return new OpNode('+', $2);
|
||||
}), {
|
||||
prec: 'UPLUS'
|
||||
}), o("NOT Expression", function() {
|
||||
return new OpNode('not', $2);
|
||||
}), o("~ Expression", function() {
|
||||
return new OpNode('~', $2);
|
||||
}), o("-- Expression", function() {
|
||||
return new OpNode('--', $2);
|
||||
}), o("++ Expression", function() {
|
||||
return new OpNode('++', $2);
|
||||
}), o("DELETE Expression", function() {
|
||||
return new OpNode('delete', $2);
|
||||
}), o("TYPEOF Expression", function() {
|
||||
return new OpNode('typeof', $2);
|
||||
}), o("Expression --", function() {
|
||||
return new OpNode('--', $1, null, true);
|
||||
}), o("Expression ++", function() {
|
||||
return new OpNode('++', $1, null, true);
|
||||
}), o("Expression * Expression", function() {
|
||||
return new OpNode('*', $1, $3);
|
||||
}), o("Expression / Expression", function() {
|
||||
return new OpNode('/', $1, $3);
|
||||
}), o("Expression % Expression", function() {
|
||||
return new OpNode('%', $1, $3);
|
||||
}), o("Expression + Expression", function() {
|
||||
return new OpNode('+', $1, $3);
|
||||
}), o("Expression - Expression", function() {
|
||||
return new OpNode('-', $1, $3);
|
||||
}), o("Expression << Expression", function() {
|
||||
return new OpNode('<<', $1, $3);
|
||||
}), o("Expression >> Expression", function() {
|
||||
return new OpNode('>>', $1, $3);
|
||||
}), o("Expression >>> Expression", function() {
|
||||
return new OpNode('>>>', $1, $3);
|
||||
}), o("Expression & Expression", function() {
|
||||
return new OpNode('&', $1, $3);
|
||||
}), o("Expression | Expression", function() {
|
||||
return new OpNode('|', $1, $3);
|
||||
}), o("Expression ^ Expression", function() {
|
||||
return new OpNode('^', $1, $3);
|
||||
}), o("Expression <= Expression", function() {
|
||||
return new OpNode('<=', $1, $3);
|
||||
}), o("Expression < Expression", function() {
|
||||
return new OpNode('<', $1, $3);
|
||||
}), o("Expression > Expression", function() {
|
||||
return new OpNode('>', $1, $3);
|
||||
}), o("Expression >= Expression", function() {
|
||||
return new OpNode('>=', $1, $3);
|
||||
}), o("Expression == Expression", function() {
|
||||
return new OpNode('==', $1, $3);
|
||||
}),
|
||||
// o "Expression != Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression IS Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ISNT Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression && Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression || Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression AND Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression OR Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ? Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression -= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression += Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression /= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression *= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression %= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ||= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression &&= Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression ?= Expression", -> new OpNode($2, $1, $3)
|
||||
//
|
||||
// o "Expression INSTANCEOF Expression", -> new OpNode($2, $1, $3)
|
||||
// o "Expression IN Expression", -> new OpNode($2, $1, $3)
|
||||
],
|
||||
// The existence operator.
|
||||
Existence: [o("Expression ?", function() {
|
||||
return new ExistenceNode($1);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue