Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nim Cirru Parser

Parser for Cirru Syntax.

nimble install cirru_parser
import cirru_parser

# parse code
parseCirru "a b"

which returns:

(kind: cirruList, list: @[(kind: cirruList, list: @[(kind: cirruToken, token: "a"), (kind: cirruToken, token: "b")])])  : CirruNode

CirruNode is the type of exprssions and tokens parsed from Cirru code. Browse types.nim for definitions.

type
  CirruNodeKind* = enum
    cirruToken,
    cirruList

  CirruNode* = object
    line*: int
    column*: int
    case kind*: CirruNodeKind
    of cirruToken:
      token*: string
    of cirruList:
      list*: DoublyLinkedList[CirruNode]

A quick way to create Cirru nodes is creating nodes from JSON via toCirru function:

let a4 = %* ["a", "$", "$", "b"]
let a5 = toCirru(a4)

toJson(a5) # converts back

To compare Cirru nodes, use ==. Notice that this overloaded == only checks types and values. Nodes are equal even they contain different line or column fields.

To format errors, use:

formatParserFailure(code, error.msg, "filename", error.line, error.column)

Browse tests/ you will find examples of all public APIs.

JavaScript library

Since Nim can be compiled to JavaScript, this library is also published on npm:

yarn add @cirru/parser.nim

Nim strings is different from JavaScript string. To call this library, convert string to number[] first:

a = require '@cirru/parser.nim'
code = 'a b'
codes = code.split('').map (x) -> x.charCodeAt(0)
cirru.parseCirru codes

For return value "b", it's also represented in number[]:

{
  "line": 1,
  "column": 3,
  "kind": 0,
  "text": [
    98
  ],
  "list": null
}

License

MIT

About

Cirru parser in Nim

Topics

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages