diff --git a/roll.peg.go b/roll.peg.go index da1854d0..010ae675 100644 --- a/roll.peg.go +++ b/roll.peg.go @@ -3068,9 +3068,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 327, col: 37, offset: 16046, - }, + &anyMatcher{}, }, }, }, @@ -3100,9 +3098,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 328, col: 41, offset: 16149, - }, + &anyMatcher{}, }, }, }, @@ -3132,9 +3128,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 329, col: 42, offset: 16253, - }, + &anyMatcher{}, }, }, }, @@ -3164,9 +3158,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 330, col: 42, offset: 16357, - }, + &anyMatcher{}, }, }, }, @@ -3931,9 +3923,7 @@ var g = &grammar{ }, }, ¬Expr{ - expr: &anyMatcher{ - line: 397, col: 37, offset: 18620, - }, + expr: &anyMatcher{}, }, }, }, @@ -3987,9 +3977,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 401, col: 29, offset: 18721, - }, + &anyMatcher{}, }, }, }, @@ -4002,9 +3990,7 @@ var g = &grammar{ inverted: false, }, ¬Expr{ - expr: &anyMatcher{ - line: 401, col: 44, offset: 18736, - }, + expr: &anyMatcher{}, }, }, }, @@ -4026,9 +4012,7 @@ var g = &grammar{ inverted: false, }, }, - &anyMatcher{ - line: 402, col: 30, offset: 18768, - }, + &anyMatcher{}, }, }, }, @@ -6185,6 +6169,7 @@ var ( errMaxExprCnt = errors.New("max number of expressions parsed") ) +// remove generic because it can't be compiled by gopherjs type parserStack struct { data []savepoint index int @@ -6213,10 +6198,6 @@ func (ss *parserStack) pop() *savepoint { return ref } -func (ss *parserStack) setTop(t savepoint) { - ss.data[ss.index] = t -} - func (ss *parserStack) top() *savepoint { return &ss.data[ss.index] } @@ -6361,7 +6342,7 @@ type charClassMatcher struct { inverted bool } -type anyMatcher position // nolint: structcheck +type anyMatcher struct{} // nolint: structcheck // errList cumulates the errors found by the parser. type errList []error @@ -6677,11 +6658,11 @@ func (p *parser) read() { } // restore parser position to the savepoint pt. -func (p *parser) restore(pt savepoint) { +func (p *parser) restore(pt *savepoint) { if pt.offset == p.pt.offset { return } - p.pt = pt + p.pt = *pt } // get the slice of bytes from the savepoint start to the current position. @@ -6711,7 +6692,6 @@ func (p *parser) parse(grammar *grammar) (val any, err error) { return nil, p.errs.err() } - // TODO : not super critical but this could be generated p.rulesArray = grammar.rules p.buildRulesTable(grammar) @@ -6848,16 +6828,16 @@ func (p *parser) parseExprWrap(expr any) (any, bool) { } func (p *parser) parseActionExpr(act *actionExpr) (any, bool) { - skipCode := p.checkSkipCode() - if !skipCode { - p.spStack.push(&p.pt) + if p.checkSkipCode() { + _, ok := p.parseExprWrap(act.expr) + return nil, ok } + + p.spStack.push(&p.pt) val, ok := p.parseExprWrap(act.expr) + start := p.spStack.pop() + if ok { - if skipCode { - return nil, true - } - start := p.spStack.pop() p.cur.pos = start.position p.cur.text = p.sliceFrom(start) p._errPos = &start.position @@ -6884,7 +6864,7 @@ func (p *parser) parseAndExpr(and *andExpr, logical bool) (any, bool) { matchedOffset := p.pt.offset p.popV() - p.restore(pt) + p.restore(&pt) if logical { return nil, ok && p.pt.offset != matchedOffset @@ -6898,10 +6878,9 @@ func (p *parser) parseAnyMatcher(any *anyMatcher) (any, bool) { p.failAt(false, &p.pt.position, ".") return nil, false } - startOffset := p.pt.offset p.failAt(true, &p.pt.position, ".") p.read() - return p.sliceFromOffset(startOffset), true + return nil, true } // nolint: gocyclo @@ -6925,10 +6904,9 @@ func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (any, bool) { p.failAt(false, &p.pt.position, chr.val) return nil, false } - offset := p.pt.position.offset p.failAt(true, &p.pt.position, chr.val) p.read() - return p.sliceFromOffset(offset), true + return nil, true } } @@ -6939,10 +6917,9 @@ func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (any, bool) { p.failAt(false, &p.pt.position, chr.val) return nil, false } - offset := p.pt.position.offset p.failAt(true, &p.pt.position, chr.val) p.read() - return p.sliceFromOffset(offset), true + return nil, true } } @@ -6953,18 +6930,16 @@ func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (any, bool) { p.failAt(false, &p.pt.position, chr.val) return nil, false } - offset := p.pt.position.offset p.failAt(true, &p.pt.position, chr.val) p.read() - return p.sliceFromOffset(offset), true + return nil, true } } if chr.inverted { - offset := p.pt.position.offset p.failAt(true, &p.pt.position, chr.val) p.read() - return p.sliceFromOffset(offset), true + return nil, true } p.failAt(false, &p.pt.position, chr.val) return nil, false @@ -7019,13 +6994,13 @@ func (p *parser) parseLitMatcher(lit *litMatcher) (any, bool) { } if cur != want { p.failAt(false, &start.position, lit.want) - p.restore(start) + p.restore(&start) return nil, false } p.read() } p.failAt(true, &start.position, lit.want) - return p.sliceFrom(&start), true + return nil, true } func (p *parser) parseNotCodeExpr(not *notCodeExpr) (any, bool) { @@ -7045,7 +7020,7 @@ func (p *parser) parseNotExpr(not *notExpr, logical bool) (any, bool) { p.maxFailInvertExpected = !p.maxFailInvertExpected p.popV() matchedOffset := p.pt.offset - p.restore(pt) + p.restore(&pt) if logical { return nil, ok && p.pt.offset != matchedOffset @@ -7055,18 +7030,21 @@ func (p *parser) parseNotExpr(not *notExpr, logical bool) (any, bool) { func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (any, bool) { var vals []any + var matched bool for { p.pushV() val, ok := p.parseExprWrap(expr.expr) p.popV() if !ok { - if len(vals) == 0 { - // did not match once, no match - return nil, false + if len(vals) > 0 { + return vals, matched } - return vals, true + return nil, matched + } + matched = true + if val != nil { + vals = append(vals, val) } - vals = append(vals, val) } } @@ -7093,19 +7071,23 @@ func (p *parser) parseRuleIRefExpr(ref *ruleIRefExpr) (any, bool) { func (p *parser) parseSeqExpr(seq *seqExpr) (any, bool) { var vals []any + notSkipCode := p.checkSkipCode() pt := p.pt for _, expr := range seq.exprs { val, ok := p.parseExprWrap(expr) if !ok { - p.restore(pt) + p.restore(&pt) return nil, false } - if val != nil && !p.checkSkipCode() { + if notSkipCode && val != nil { vals = append(vals, val) } } - return vals, true + if len(vals) > 0 { + return vals, true + } + return nil, true } func (p *parser) parseThrowExpr(expr *throwExpr) (any, bool) { @@ -7126,9 +7108,14 @@ func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (any, bool) { val, ok := p.parseExprWrap(expr.expr) p.popV() if !ok { - return vals, true + if len(vals) > 0 { + return vals, true + } + return nil, true + } + if val != nil { + vals = append(vals, val) } - vals = append(vals, val) } }