diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-11-25 21:18:34 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-11-25 21:18:34 +0900 |
commit | 6ebbc8f9829bf0f3127367769c662d1a8f881a2d (patch) | |
tree | e45af1104e3ce736134353c1805fe0c91d04998a /compiler/parser.go | |
parent | Support White_Space property (Meet RL1.2 of UTS #18 partially) (diff) | |
download | tre-6ebbc8f9829bf0f3127367769c662d1a8f881a2d.tar.gz tre-6ebbc8f9829bf0f3127367769c662d1a8f881a2d.tar.xz |
Support Lowercase and Uppercase property (Meet RL1.2 of UTS #18 partially)
Diffstat (limited to '')
-rw-r--r-- | compiler/parser.go | 55 |
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), + ) + } } } |