mirror of
https://github.com/Cirru/parser.nim
synced 2026-01-14 01:31:45 +00:00
No description
|
|
||
|---|---|---|
| .github/workflows | ||
| scripts | ||
| src | ||
| tests | ||
| .gitignore | ||
| .npmignore | ||
| cirru_parser.nimble | ||
| package.json | ||
| README.md | ||
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