aboutsummaryrefslogtreecommitdiff
path: root/compiler/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-02-14 20:19:22 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-02-14 20:19:22 +0900
commit467f223668d13ffa42679e6c928d82d5d402d87d (patch)
treeb518082b8af4d79b19b41e8beacc085d6f0cf84f /compiler/parser.go
parentAdd dot symbol matching any single character (diff)
downloadtre-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.go31
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