diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2022-11-06 21:31:46 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2022-11-10 00:40:16 +0900 |
commit | f89d021bbe134e3efa0d015a41e9712960cdd009 (patch) | |
tree | 28c6d49611f09dad186b0f6fc4c1a42864a2f7cb /ucd/scripts.go | |
parent | Split SymbolTable's APIs into reader/writer (diff) | |
download | urubu-f89d021bbe134e3efa0d015a41e9712960cdd009.tar.gz urubu-f89d021bbe134e3efa0d015a41e9712960cdd009.tar.xz |
Import source code of lexer generator
From: https://github.com/nihei9/maleeni
Diffstat (limited to 'ucd/scripts.go')
-rw-r--r-- | ucd/scripts.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/ucd/scripts.go b/ucd/scripts.go new file mode 100644 index 0000000..5040283 --- /dev/null +++ b/ucd/scripts.go @@ -0,0 +1,52 @@ +package ucd + +import ( + "fmt" + "io" +) + +type Scripts struct { + Script map[string][]*CodePointRange + ScriptDefaultRange *CodePointRange + ScriptDefaultValue string +} + +// ParseScripts parses the Scripts.txt. +func ParseScripts(r io.Reader, propValAliases *PropertyValueAliases) (*Scripts, error) { + ss := map[string][]*CodePointRange{} + var defaultRange *CodePointRange + var defaultValue string + p := newParser(r) + for p.parse() { + if len(p.fields) > 0 { + cp, err := p.fields[0].codePointRange() + if err != nil { + return nil, err + } + + name, ok := propValAliases.Script[p.fields[1].normalizedSymbol()] + if !ok { + return nil, fmt.Errorf("unknown property: %v", p.fields[1].symbol()) + } + ss[name] = append(ss[name], cp) + } + + if len(p.defaultFields) > 0 { + var err error + defaultRange, err = p.defaultFields[0].codePointRange() + if err != nil { + return nil, err + } + defaultValue = p.defaultFields[1].normalizedSymbol() + } + } + if p.err != nil { + return nil, p.err + } + + return &Scripts{ + Script: ss, + ScriptDefaultRange: defaultRange, + ScriptDefaultValue: defaultValue, + }, nil +} |