Source

coffeescript-eclipse /

Filename Size Date modified Message
.metadata
bin
config
csep
csep.tests
csep.ui
doc
grammars
153 B
423 B
6.1 KB
18.5 KB
3.9 KB

This is a project to provide an Eclipse plugin for CoffeeScript, using Xtext. Development uses Xtext 2.1. It just started, so you may be interested in the roadmap, including where we are at the moment.

Starting point

There are quite a few editors with CoffeeScript support, but most of them have just a little more than syntax highlighting. Only three of them do actual parsing:

Besides, there is CoffeeScript's own compilation method as a good source of ideas. Let's see what we can learn from them or how they could be used.

CoffeeBrew is based on IntelliJ's own packages, using a Java-based lexer, and processes a flex file. It's not clear yet if whether and how it can handle significant whispaces of coffeescript, but at first it looks a promising starting point. The only downside is, it's development halted in favor of the official coffeescript support. I couldn't find how parsing is done here.

Regarding the Netbeans plugin, it seems to have implemented both lexing, and parsing in pure Java code, making use of Netbeans' own parsing framework. It would be quite difficult to use it, either directly (importing it), or indirectly understanding the algorithm.

The Aptana Studio3 plugin is based on the Beaver parser generator with a Java scanner class which is either generated, or crafted by hand. It is accompanied by a rewriter class which takes care of indentation and other niceties. Since they extend the Beaver API, they may be not directly usable, but more on that later.

CoffeeScript itself sports a hand-written lexer in coffeescript and a hand-written rewriter to handle indentation and some shortcut features of the language. Its parser is a Jison, a javascript implementation of Bison, processing an annotated grammar file.

First step: a custom lexer

The main issue with coffeescript is that it uses significant whitespaces. It's not obvious how to handle it with Xtext, but there are a few attempts at resolving it. See Pythonisque indent/dedent block structure for a Xtext DSL; a Stackoverflow question about Xtext with significant/semantic whitespace and the todotext implementation referred to in an answer.

Conclusion and status: the Aptana scanner got integrated into Xtext successfully.

Second step: implement an LL grammar for the parser

Other implementations use LALR parsers, but Xtext is based on Antlr which is an LL parser. Transforming a LALR grammar to an LL one is not a mechanic task, even a simple expression language feels challenging at first, see Parsing Expressions with Xtext. There are some basic rules to follow Converting a Grammar from LALR to LL.

On the other hand, some good test cases are needed, too. CoffeeScript tests are geared toward execution and not only parsing, and they quite coarse grained for our purposes now. The parser tests of Aptana may be a good starting point with some drawbacks:

  • The Aptana parser produces a different AST than the one generated by Xtext
  • The test cases suffer from Java's lack of multiline strings.

Conclusion and status: it parses almost anything. At least all examples in the coffeescript documentation folder. There are two cases it cannot handle, though, post-increment and assignment to a deeply nested property.

# Not working
drinkBeer(glasses++)

# Workaround
drinkBeer(glasses)
glasses += 1

# Not working
my.secret.money = 1000

# Workaround
tmp = my.secret
tmp.money = 1000

I guess they don't hurt that much...

Third step: linking, scoping and meaningful messages

Well, we'll see.