diff options
author | gemath <33119724+gemath@users.noreply.github.com> | 2018-06-19 17:13:33 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2018-06-19 18:13:33 +0100 |
commit | db68bbe4f7e3ed2c6321e46d9b4d4977f1855a4e (patch) | |
tree | d37c5a6f7cda8957dbf5e82974c7591a882f60a4 /lib/pure | |
parent | 3ca11def6d320ff5120a3d438cffbdf25a72af7b (diff) | |
download | Nim-db68bbe4f7e3ed2c6321e46d9b4d4977f1855a4e.tar.gz |
Pegs AST read access (#8050)
* Make PEG AST nodes readable from outside the module. * Added a test module for the pegs stdlib module. * Edited changelog. * Renamed ``sons`` iterator to ``items``, added ``pairs``, inlined both. * Updated entry and moved it to the right category.
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/pegs.nim | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim index 39c5790ed..d16527a56 100644 --- a/lib/pure/pegs.nim +++ b/lib/pure/pegs.nim @@ -32,7 +32,7 @@ const ## can be captured. More subpatterns cannot be captured! type - PegKind = enum + PegKind* = enum pkEmpty, pkAny, ## any character (.) pkAnyRune, ## any Unicode character (_) @@ -67,7 +67,7 @@ type pkRule, ## a <- b pkList, ## a, b pkStartAnchor ## ^ --> Internal DSL: startAnchor() - NonTerminalFlag = enum + NonTerminalFlag* = enum ntDeclared, ntUsed NonTerminalObj = object ## represents a non terminal symbol name: string ## the name of the symbol @@ -86,6 +86,25 @@ type else: sons: seq[Peg] NonTerminal* = ref NonTerminalObj +proc name*(nt: NonTerminal): string = nt.name +proc line*(nt: NonTerminal): int = nt.line +proc col*(nt: NonTerminal): int = nt.col +proc flags*(nt: NonTerminal): set[NonTerminalFlag] = nt.flags +proc rule*(nt: NonTerminal): Peg = nt.rule + +proc kind*(p: Peg): PegKind = p.kind +proc term*(p: Peg): string = p.term +proc ch*(p: Peg): char = p.ch +proc charChoice*(p: Peg): ref set[char] = p.charChoice +proc nt*(p: Peg): NonTerminal = p.nt +proc index*(p: Peg): range[0..MaxSubpatterns] = p.index +iterator items*(p: Peg): Peg {.inline.} = + for s in p.sons: + yield s +iterator pairs*(p: Peg): (int, Peg) {.inline.} = + for i in 0 ..< p.sons.len: + yield (i, p.sons[i]) + proc term*(t: string): Peg {.nosideEffect, rtl, extern: "npegs$1Str".} = ## constructs a PEG from a terminal string if t.len != 1: |