CoffeeScript Cirru HTML CSS
Switch branches/tags

Cirru Parser

Cirru is an indentation-based grammar. You may use it to create your own DSLs or scripting languages.

Find more at


npm install --save cirru-parser
{parse, pare} = require 'cirru-parser'

syntaxTree = parse 'code', 'filename' # [{text: 'code', x: 0, y:0, ex: 4, ey: 1}]
simplifiedTree = pare 'code', 'filename' # ['code']
  • parse(code, filename):

Parse code in Cirru grammar, filename is optional:

A token in syntaxTree is like:

token =
  text: 'get'
  x: 0
  y: 0
  ex: 3
  ey: 3
  path: 'a.cirru'

And expressions here are just tokens in arrays, like:

expression = [
  • pare(code, filename):

pare is short for parse, filename is optional.

simplifiedTree does not contain informations of files, like line numbers, file content, which are needed in caution.

A token from pare is a string, i.e. the text field of parsing results.

Live demo

Demo: . By typing on the left you should see the pare results on the right.


Detailed examples can be found in cirru/ and ast/ directories.

For short, there are then rules of Cirru:

  • It indents with 2 spaces
  • Parentheses are closed in the same line it opened
  • Strings are quoted with double quotes: "string"
  • $ folds followed tokens in an expression
  • , unfolds followed tokens in an expression


Here's a Gist showing how it's parsed(not including the steps solving $ and ,):

This method was developed in [the Go version][go], you may check it out here.


Run tests:

cirru-script test.cirru

Write code:

npm i
gulp html
webpack-dev-server --hot
# view generated index.html in a web server

Read more details



  • switch to ex, ey from $x, $y


  • Rewritten with new solution from Go
  • drop caution