diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-02-14 20:19:22 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-02-14 20:19:22 +0900 |
commit | 467f223668d13ffa42679e6c928d82d5d402d87d (patch) | |
tree | b518082b8af4d79b19b41e8beacc085d6f0cf84f /compiler/parser.go | |
parent | Add dot symbol matching any single character (diff) | |
download | tre-467f223668d13ffa42679e6c928d82d5d402d87d.tar.gz tre-467f223668d13ffa42679e6c928d82d5d402d87d.tar.xz |
Add bracket expression matching specified character
The bracket expression matches any single character specified in it. In the bracket expression, the special characters like ., *, and so on are also handled as normal characters.
Diffstat (limited to 'compiler/parser.go')
-rw-r--r-- | compiler/parser.go | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/compiler/parser.go b/compiler/parser.go index 03dc198..ede601d 100644 --- a/compiler/parser.go +++ b/compiler/parser.go @@ -155,9 +155,31 @@ func (p *parser) parseGroup() astNode { defer p.expect(tokenKindGroupClose) return p.parseAlt() } + return p.parseSingleChar() +} + +func (p *parser) parseSingleChar() astNode { if p.consume(tokenKindAnyChar) { return genAnyCharAST(p.lastTok) } + if p.consume(tokenKindBExpOpen) { + defer p.expect(tokenKindBExpClose) + left := p.parseNormalChar() + if left == nil { + raiseSyntaxError("bracket expression must include at least one character") + } + for { + right := p.parseNormalChar() + if right == nil { + break + } + left = newAltNode(left, right) + } + return left + } + return p.parseNormalChar() +} +func (p *parser) parseNormalChar() astNode { if !p.consume(tokenKindChar) { return nil } @@ -303,12 +325,9 @@ func (p *parser) consume(expected tokenKind) bool { tok = p.peekedTok p.peekedTok = nil } else { - for { - tok, err = p.lex.next() - if err != nil { - panic(err) - } - break + tok, err = p.lex.next() + if err != nil { + panic(err) } } p.lastTok = tok |