aboutsummaryrefslogtreecommitdiff
path: root/compiler/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-11-23 22:15:54 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-11-24 01:04:19 +0900
commitbedf0c1c72a2e13e08fbaa221b8a4c3ccf3a57a7 (patch)
tree642095852ff2e1b6d616e1cbc781d07f3d03d833 /compiler/parser.go
parentFix key of generalCategoryCodePoints map (diff)
downloadtre-bedf0c1c72a2e13e08fbaa221b8a4c3ccf3a57a7.tar.gz
tre-bedf0c1c72a2e13e08fbaa221b8a4c3ccf3a57a7.tar.xz
Support White_Space property (Meet RL1.2 of UTS #18 partially)
Diffstat (limited to 'compiler/parser.go')
-rw-r--r--compiler/parser.go30
1 files changed, 24 insertions, 6 deletions
diff --git a/compiler/parser.go b/compiler/parser.go
index 55b8238..dd73c28 100644
--- a/compiler/parser.go
+++ b/compiler/parser.go
@@ -546,20 +546,38 @@ func (p *parser) parseCharProp() astNode {
propName = "gc"
propVal = sym1
}
- cpRanges, err := findCodePointRanges(propName, propVal)
+ cpRanges, inverse, err := findCodePointRanges(propName, propVal)
if err != nil {
p.errMsgDetails = fmt.Sprintf("%v", err)
raiseSyntaxError(synErrCharPropUnsupported)
}
var alt astNode
- for _, r := range cpRanges {
+ if inverse {
+ r := cpRanges[0]
from := genNormalCharAST(r.From)
to := genNormalCharAST(r.To)
- alt = genAltNode(
- alt,
- genRangeAST(from, to),
- )
+ alt = exclude(genRangeAST(from, to), genAnyCharAST())
+ if alt == nil {
+ panic(fmt.Errorf("a pattern that isn't matching any symbols"))
+ }
+ for _, r := range cpRanges[1:] {
+ from := genNormalCharAST(r.From)
+ to := genNormalCharAST(r.To)
+ alt = exclude(genRangeAST(from, to), alt)
+ if alt == nil {
+ panic(fmt.Errorf("a pattern that isn't matching any symbols"))
+ }
+ }
+ } else {
+ for _, r := range cpRanges {
+ from := genNormalCharAST(r.From)
+ to := genNormalCharAST(r.To)
+ alt = genAltNode(
+ alt,
+ genRangeAST(from, to),
+ )
+ }
}
if !p.consume(tokenKindRBrace) {