Skip to content

JavaScript transpiler for the esoteric language 'Rockstar'

License

Notifications You must be signed in to change notification settings

wolfgang42/rockstar-js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This is a work-in-progress implementation of the Rockstar language.

It transpiles Rockstar code to JavaScript.

Usage:

yarn install
./rockstar program.rock
node program.js

Note: Due to the extremely fast speed of updates to Rockstar, this implementation may not always match the current spec. wolfgang42/rockstar has the version of this spec targeted by this implementation. View differences between the two here: wolfgang42/master...dylanbeattie/master

Also, since this is a WIP not all of Rockstar works properly yet. See the Spec Complete milestone for the list of unimplemented features.

Contributions welcome!

Design

Transpilation is broken up into three stages: parsing, block grouping, and code generation.

Parsing

First, the text of the program is parsed into statements and expressions. The resulting tokens are objects which have a t property containing the type of the token, plus other properties (generally a single mnemonic letter) with additional information about the token.

Parsing is currently implemented using PEG.js, a JS Parser Generator. I'm not entirely convinced that this was the best choice but it seems to work OK so far.

For example, the poetic string literal:

Billy says hello world!

is parsed by this expression:

PoeticString = v:Variable _ 'says' ' ' t:$[^\n]*
	{ return {t: 'Set', v: v, e: {t: 'Literal', v: t}} }

into this token:

{t: "Set", v: {t: "Variable", n: "Billy"}, e: {t: "Literal", v: "hello world!"}}

(Notice that this token contains two other tokens, v and e.)

Note for developers: After changing rockstar-parser.peg, make sure you run yarn build to regenerate the parser code.

Block grouping

The parsing step returns a series of statements, but does not know about blocks. This step (implemented by the groupBlocks function) finds statements which begin blocks (If, While, and so on) and groups the statements together inside a Block token, removing BlankLine tokens.

Code generation

This stage takes the tokens and emits JavaScript code. Each token has a function in the generators object which takes a token and returns a string. Many of these operate recursively, calling expr() on a token to generate code to be included.

For example, the Set token generator:

Set: s => `${expr(s.v)}=${expr(s.e)};`,

takes a Token like this:

{t: "Set", v: {t: "Variable", n: "Billy"}, e: {t: "Literal", v: "hello world!"}}

and returns this code:

Billy="hello world!";

About

JavaScript transpiler for the esoteric language 'Rockstar'

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages