Types
openArrayParams = openArray[tuple[k: string, t: NimNode]]
Settings = object lexerName*, lexerTuple*, lexerTokenKind*: string tkModifier*: TokenModifierCallback tkPrefix*: string keepUnknown*: bool ## Whether to keep unknown tokens (default false). ## This is useful when building a Markdown parser (for example) useDefaultIdent*: bool ## Disable default string-based handler useDefaultInt*: bool = true ## Disable default `int` handler ## Generate a static `lexer.nim` file (default false) ## Use `-d:toktokStatic` to (re)generate lexer file. ## Useful in case you don't want `toktok` package ## to run every time you build your program. ## ## Also, due to toktok limitations, you may want to ## go deeper and extend the generated lexer manually. ## ## **Important!** Running `-d:toktokStatic` will overwrite ## your existing `lexer.nim`. Be careful keepChar*: bool
TKNode = ref object ## Token identifier case of tString: of tChar: of tRange: of tVariant: of tSet: of tHandler: else: nil
TokenModifierCallback = proc (tkName, tkPrefix: string): string
Lets
defaultTokenModifier {.compileTime.} = proc (tkName, tkPrefix: string): string = result = tkPrefix & capitalizeAscii(tkName)
Consts
defaultSettings = (lexerName: "Lexer", lexerTuple: "TokenTuple", lexerTokenKind: "TokenKind", tkModifier: (:anonymous, nil), tkPrefix: "tk", keepUnknown: true, useDefaultIdent: true, useDefaultInt: true, enableStaticGen: false, keepChar: false)
Procs
proc addField(tkEnum: var NimNode; enumIdent, enumType: NimNode) {....raises: [], tags: [], forbids: [].}
proc addField(tkEnum: var NimNode; enumType: NimNode) {....raises: [], tags: [], forbids: [].}
proc newCaseStmt(caseNode: NimNode; branches: openArray[tuple[cond, body: NimNode]]; elseBranch = newEmptyNode()): NimNode {....raises: [], tags: [], forbids: [].}
proc newExceptionStmt(exception: NimNode; msg: NimNode): NimNode {....raises: [], tags: [], forbids: [].}
proc newExclude(id: string): NimNode {....raises: [], tags: [], forbids: [].}
proc newImport(id: string): NimNode {....raises: [], tags: [], forbids: [].}
proc newInclude(id: string): NimNode {....raises: [], tags: [], forbids: [].}
proc newObject(id: string; fields: openArrayParams = []; parent = ""; public = false): NimNode {....raises: [], tags: [], forbids: [].}
- Create a new object
proc newProc(id: string; params: openArray[tuple[k, t: string, vt: bool]]; public = false; returnType, body = newEmptyNode()): NimNode {. ...raises: [], tags: [], forbids: [].}
- Create a new procedure
proc newTemplate(id: string; params: openArray[tuple[k, t: string, vt: bool]]; public = false; body = newEmptyNode()): NimNode {....raises: [], tags: [], forbids: [].}
- Create a template TODO support for generic parameters
proc newTupleType(id: string; fields: openArrayParams; public = false): NimNode {. ...raises: [], tags: [], forbids: [].}
- Creates a new tuple type
proc newWhenStmt(whenBranch: tuple[cond, body: NimNode]): NimNode {....raises: [], tags: [], forbids: [].}
- Constructor for when statements.
proc newWhenStmt(whenBranch: tuple[cond, body: NimNode]; elseBranch: NimNode): NimNode {. ...raises: [], tags: [], forbids: [].}
- Constructor for when statements.
Macros
macro handlers(custom: untyped)
-
Define your own handlers. For example:
proc handleClass(lex: var Lexer, kind: `TokenKind`) = # your code
macro registerTokens(settings: static Settings; tokens: untyped)