aboutsummaryrefslogtreecommitdiff
path: root/compiler/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-11-25 21:18:34 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-11-25 21:18:34 +0900
commit6ebbc8f9829bf0f3127367769c662d1a8f881a2d (patch)
treee45af1104e3ce736134353c1805fe0c91d04998a /compiler/parser.go
parentSupport White_Space property (Meet RL1.2 of UTS #18 partially) (diff)
downloadtre-6ebbc8f9829bf0f3127367769c662d1a8f881a2d.tar.gz
tre-6ebbc8f9829bf0f3127367769c662d1a8f881a2d.tar.xz
Support Lowercase and Uppercase property (Meet RL1.2 of UTS #18 partially)
Diffstat (limited to 'compiler/parser.go')
-rw-r--r--compiler/parser.go55
1 files changed, 34 insertions, 21 deletions
diff --git a/compiler/parser.go b/compiler/parser.go
index dd73c28..d64b79c 100644
--- a/compiler/parser.go
+++ b/compiler/parser.go
@@ -538,6 +538,7 @@ func (p *parser) parseCharProp() astNode {
sym2 = p.lastTok.propSymbol
}
+ var alt astNode
var propName, propVal string
if sym2 != "" {
propName = sym1
@@ -546,37 +547,49 @@ func (p *parser) parseCharProp() astNode {
propName = "gc"
propVal = sym1
}
- cpRanges, inverse, err := findCodePointRanges(propName, propVal)
+ pat, err := normalizeCharacterProperty(propName, propVal)
if err != nil {
p.errMsgDetails = fmt.Sprintf("%v", err)
raiseSyntaxError(synErrCharPropUnsupported)
}
-
- var alt astNode
- if inverse {
- r := cpRanges[0]
- from := genNormalCharAST(r.From)
- to := genNormalCharAST(r.To)
- alt = exclude(genRangeAST(from, to), genAnyCharAST())
- if alt == nil {
- panic(fmt.Errorf("a pattern that isn't matching any symbols"))
+ if pat != "" {
+ p := newParser(bytes.NewReader([]byte(pat)))
+ ast, err := p.parse()
+ if err != nil {
+ panic(err)
+ }
+ alt = ast
+ } else {
+ cpRanges, inverse, err := findCodePointRanges(propName, propVal)
+ if err != nil {
+ p.errMsgDetails = fmt.Sprintf("%v", err)
+ raiseSyntaxError(synErrCharPropUnsupported)
}
- for _, r := range cpRanges[1:] {
+ if inverse {
+ r := cpRanges[0]
from := genNormalCharAST(r.From)
to := genNormalCharAST(r.To)
- alt = exclude(genRangeAST(from, to), alt)
+ alt = exclude(genRangeAST(from, to), genAnyCharAST())
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),
- )
+ 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),
+ )
+ }
}
}