diff options
Diffstat (limited to 'lib/pure/pegs.nim')
-rw-r--r-- | lib/pure/pegs.nim | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim index 5827b7444..86ad9c0f6 100644 --- a/lib/pure/pegs.nim +++ b/lib/pure/pegs.nim @@ -168,8 +168,9 @@ func charSet*(s: set[char]): Peg {.rtl, extern: "npegs$1".} = ## constructs a PEG from a character set `s` assert '\0' notin s result = Peg(kind: pkCharChoice) - new(result.charChoice) - result.charChoice[] = s + {.cast(noSideEffect).}: + new(result.charChoice) + result.charChoice[] = s func len(a: Peg): int {.inline.} = return a.sons.len func add(d: var Peg, s: Peg) {.inline.} = add(d.sons, s) @@ -1823,9 +1824,7 @@ type skip: Peg func pegError(p: PegParser, msg: string, line = -1, col = -1) = - var e: ref EInvalidPeg - new(e) - e.msg = errorStr(p, msg, line, col) + var e = (ref EInvalidPeg)(msg: errorStr(p, msg, line, col)) raise e func getTok(p: var PegParser) = @@ -1909,7 +1908,8 @@ func primary(p: var PegParser): Peg = getTok(p) elif not arrowIsNextTok(p): var nt = getNonTerminal(p, p.tok.literal) - incl(nt.flags, ntUsed) + {.cast(noSideEffect).}: + incl(nt.flags, ntUsed) result = nonterminal(nt).token(p) getTok(p) else: @@ -2002,12 +2002,14 @@ func parseRule(p: var PegParser): NonTerminal = result = getNonTerminal(p, p.tok.literal) if ntDeclared in result.flags: pegError(p, "attempt to redefine: " & result.name) - result.line = getLine(p) - result.col = getColumn(p) + {.cast(noSideEffect).}: + result.line = getLine(p) + result.col = getColumn(p) getTok(p) eat(p, tkArrow) - result.rule = parseExpr(p) - incl(result.flags, ntDeclared) # NOW inlining may be attempted + {.cast(noSideEffect).}: + result.rule = parseExpr(p) + incl(result.flags, ntDeclared) # NOW inlining may be attempted else: pegError(p, "rule expected, but found: " & p.tok.literal) |