diff --git a/CodeCompletion/CodeFormatter.cs b/CodeCompletion/CodeFormatter.cs index 421ca96d1..45b3563b0 100644 --- a/CodeCompletion/CodeFormatter.cs +++ b/CodeCompletion/CodeFormatter.cs @@ -3166,7 +3166,11 @@ namespace CodeFormatters if (_is_pattern_expr.left != null) visit_node(_is_pattern_expr.left); - sb.Append(" is "); + if (_is_pattern_expr.right == null || + !(_is_pattern_expr.right is collection_pattern) && !(_is_pattern_expr.right is tuple_pattern)) + sb.Append(" is "); + else + add_space_before = true; if (_is_pattern_expr.right != null) visit_node(_is_pattern_expr.right); @@ -3211,6 +3215,80 @@ namespace CodeFormatters DecOffset(); } + public override void visit(const_pattern _const_pattern) + { + visit_node(_const_pattern.pattern_expressions); + add_space_after = false; + } + + public override void visit(const_pattern_parameter _const_parameter) + { + visit_node(_const_parameter.const_param); + add_space_after = false; + } + + public override void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + sb.Append("_"); + add_space_after = true; + } + + public override void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + sb.Append("var"); + SetKeywordOffset("var"); + read_from_beg_pos = true; + visit_node(_tuple_pattern_var_parameter.identifier); + } + + public override void visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + sb.Append("_"); + add_space_after = true; + } + + public override void visit(tuple_pattern _tuple_pattern) + { + sb.Append("("); + foreach (var parameter in _tuple_pattern.parameters) + { + visit_node(parameter); + add_space_after = true; + } + add_space_after = false; + } + + public override void visit(collection_pattern _collection_pattern) + { + sb.Append("["); + foreach (var parameter in _collection_pattern.parameters) + { + visit_node(parameter); + add_space_after = true; + } + add_space_after = false; + } + + public override void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + sb.Append(".."); + add_space_after = true; + } + + public override void visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + sb.Append("var"); + SetKeywordOffset("var"); + read_from_beg_pos = true; + visit_node(_collection_pattern_var_parameter.identifier); + } + + public override void visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + sb.Append("_"); + add_space_after = true; + } + public override void visit(deconstructor_pattern _deconstructor_pattern) { visit_node(_deconstructor_pattern.type); @@ -3224,18 +3302,34 @@ namespace CodeFormatters public override void visit(var_deconstructor_parameter _var_deconstructor_parameter) { - sb.Append("var"); - SetKeywordOffset("var"); - read_from_beg_pos = true; + if (_var_deconstructor_parameter.var_keyword_used) + { + sb.Append("var"); + SetKeywordOffset("var"); + read_from_beg_pos = true; + } visit_node(_var_deconstructor_parameter.identifier); if (_var_deconstructor_parameter.type != null) visit_node(_var_deconstructor_parameter.type); } + public override void visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + visit_node(_recursive_pattern_parameter.pattern); + } + public override void visit(recursive_deconstructor_parameter _recursive_deconstructor_parameter) { visit_node(_recursive_deconstructor_parameter.pattern); } + public override void visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + visit_node(_recursive_tuple_parameter.pattern); + } + public override void visit(recursive_collection_parameter _recursive_collection_parameter) + { + visit_node(_recursive_collection_parameter.pattern); + } public override void visit(var_tuple_def_statement _var_tuple_def_statement) { diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs index 2271b1452..9f4c8cbb5 100644 --- a/CodeCompletion/DomSyntaxTreeVisitor.cs +++ b/CodeCompletion/DomSyntaxTreeVisitor.cs @@ -777,7 +777,7 @@ namespace CodeCompletion } else { - foreach (pattern_deconstructor_parameter pdp in _deconstructor_pattern.parameters) + foreach (pattern_parameter pdp in _deconstructor_pattern.parameters) { if (pdp is var_deconstructor_parameter) { diff --git a/CodeCompletion/FindReferences.cs b/CodeCompletion/FindReferences.cs index bd1b4e3cb..47fd0e41c 100644 --- a/CodeCompletion/FindReferences.cs +++ b/CodeCompletion/FindReferences.cs @@ -1682,7 +1682,7 @@ namespace CodeCompletion public override void visit(deconstructor_pattern _deconstructor_pattern) { _deconstructor_pattern.type.visit(this); - foreach (pattern_deconstructor_parameter pdp in _deconstructor_pattern.parameters) + foreach (pattern_parameter pdp in _deconstructor_pattern.parameters) pdp.visit(this); } public override void visit(recursive_deconstructor_parameter _recursive_deconstructor_parameter) diff --git a/CodeExamples/Patterns/patterns-collection-matching1.pas b/CodeExamples/Patterns/patterns-collection-matching1.pas new file mode 100644 index 000000000..f4f644c05 --- /dev/null +++ b/CodeExamples/Patterns/patterns-collection-matching1.pas @@ -0,0 +1,43 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + + public + name: string; + age: integer; + card: CardInfo; + + constructor(name: string; age: integer; card: CardInfo); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: CardInfo); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var a := Arr(1, 9, 8, 7, 2, 3, 4, 5); + + // Расширенный is + if a is [1, .., var x, _, 5] then + Println(x); + + // match .. with + match a with + [1, 9, 8, _, 2]: print(1); + [.., var y, var x]: print(x + y); + [_, .., _]: print(3); + end; +end. \ No newline at end of file diff --git a/CodeExamples/Patterns/patterns-collection-matching2.pas b/CodeExamples/Patterns/patterns-collection-matching2.pas new file mode 100644 index 000000000..8d4ce8724 --- /dev/null +++ b/CodeExamples/Patterns/patterns-collection-matching2.pas @@ -0,0 +1,46 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + + public + name: string; + age: integer; + card: CardInfo; + + constructor(name: string; age: integer; card: CardInfo); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: CardInfo); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var p1 := new Person('Вася', 11, new CardInfo('12345671', 321)); + var p2 := new Person('Петя', 12, new CardInfo('12345672', 322)); + var p3 := new Person('Маша', 13, new CardInfo('12345673', 323)); + var personArr := Arr(p1, p2, p3); + + // Расширенный is + if personArr is [Person(name1, 11, CardInfo(_, cv)), _, Person(name2, 13, _)] then + println(name1, cv, name2); + + // match .. with + match personArr with + [_, _, Person('Вася', age, _)]: print(age); + [var p, .., Person('Маша', _, _)]: print((p as Person).name); + [..]: print(1); + end; +end. \ No newline at end of file diff --git a/CodeExamples/Patterns/patterns-collection-matching3.pas b/CodeExamples/Patterns/patterns-collection-matching3.pas new file mode 100644 index 000000000..444fcd657 --- /dev/null +++ b/CodeExamples/Patterns/patterns-collection-matching3.pas @@ -0,0 +1,43 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + name: string; + age: integer; + card: List := new List(); + + constructor(name: string; age: integer; card: List); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: List); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var cards := new List(); + cards.Add(new CardInfo('12345671', 321)); + cards.Add(new CardInfo('12345672', 322)); + cards.Add(new CardInfo('12345673', 323)); + cards.Add(new CardInfo('12345674', 324)); + + var p := new Person('Вася', 21, cards); + + // match .. with + match p with + Person('Петя', _, _): print('Петя'); + Person('Вася', _, [_, _, var x]): print(x); + Person(name, _, [CardInfo(_, 321), .., CardInfo(_, 324)]): print(name); + end; +end. \ No newline at end of file diff --git a/CodeExamples/Patterns/patterns-simple-const.pas b/CodeExamples/Patterns/patterns-simple-const.pas new file mode 100644 index 000000000..fe66668f7 --- /dev/null +++ b/CodeExamples/Patterns/patterns-simple-const.pas @@ -0,0 +1,8 @@ +begin + var a := 3.14; + match a with + 1.0, 2.0, 3.0: Println(1); + 3.13, 3.14, 3.15, 3.16: print(2); + 123.0: print(3); + end; +end. \ No newline at end of file diff --git a/CodeExamples/Patterns/patterns-simple-tuple.pas b/CodeExamples/Patterns/patterns-simple-tuple.pas new file mode 100644 index 000000000..7acec4bfb --- /dev/null +++ b/CodeExamples/Patterns/patterns-simple-tuple.pas @@ -0,0 +1,7 @@ +begin + match (1, 2, 'string') with + (1, _, var x): Println(x); + (1, _, 'strin'): print(2); + (_, _, 'string'): print(3); + end; +end. \ No newline at end of file diff --git a/CodeExamples/Patterns/patterns-type-matching1.pas b/CodeExamples/Patterns/patterns-type-matching1.pas new file mode 100644 index 000000000..9dc7cc23e --- /dev/null +++ b/CodeExamples/Patterns/patterns-type-matching1.pas @@ -0,0 +1,40 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + name: string; + age: integer; + card: CardInfo; + + constructor(name: string; age: integer; card: CardInfo); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: CardInfo); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var a := new Person('Вася', 11, new CardInfo('12345678', 324)); + + // Расширенный is + if a is Person(_, var age, CardInfo(_, var cv)) then Println(age, cv); + + // match .. with + match a with + Person('Петя', 12, CardInfo('12345678', var cv)): Println(cv); + Person('Вася', _, CardInfo(cardNum, 324)): Println(cardNum); + Person(_, _, CardInfo(_, x)): Println(x); + end; +end. \ No newline at end of file diff --git a/ParserTools/SyntaxTreeVisitors/SyntaxTreeComparer.cs b/ParserTools/SyntaxTreeVisitors/SyntaxTreeComparer.cs index 607820955..e3d10ebf6 100644 --- a/ParserTools/SyntaxTreeVisitors/SyntaxTreeComparer.cs +++ b/ParserTools/SyntaxTreeVisitors/SyntaxTreeComparer.cs @@ -2313,7 +2313,7 @@ namespace PascalABCCompiler.SyntaxTree } } - public void CompareInternal(pattern_deconstructor_parameter left, pattern_deconstructor_parameter right) + public void CompareInternal(pattern_parameter left, pattern_parameter right) { if (left == null && right != null || left != null && right == null) throw_not_equal(left, right); diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index 551436420..6ccd15b86 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -1,9 +1,9 @@ // // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 -// Machine: IVAN-PC -// DateTime: 22.03.2019 13:45:35 -// UserName: Ivan +// Machine: DESKTOP-IF20NRO +// DateTime: 5/23/2019 12:28:25 PM +// UserName: FatCow // GPLEX input file // GPLEX frame file // @@ -124,8 +124,8 @@ namespace GPPGParserScanner enum Result {accept, noMatch, contextFound}; - const int maxAccept = 66; - const int initial = 67; + const int maxAccept = 67; + const int initial = 68; const int eofNum = 0; const int goStart = -1; const int INITIAL = 0; @@ -177,814 +177,814 @@ public PT parsertools; } }; - static int[] startState = new int[] {67, 102, 103, 104, 104, 105, + static int[] startState = new int[] {68, 103, 104, 105, 105, 106, 0}; #region TwoLevelCharacterMap // - // There are 48 equivalence classes + // There are 49 equivalence classes // There are 256 character sequence regions // There are 47 tables, 12032 entries // static sbyte[] mLo0 = new sbyte[256] { -/* '\0' */ 47, 40, 47, 47, 47, 47, 47, 47, 47, 5, 0, 47, 47, 6, 47, 47, -/* '\x10' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\x20' */ 5, 25, 47, 46, 4, 47, 10, 45, 7, 9, 8, 20, 11, 21, 13, 1, -/* '0' */ 42, 42, 27, 42, 42, 42, 42, 42, 42, 26, 12, 14, 23, 19, 22, 17, -/* '@' */ 18, 43, 43, 43, 43, 44, 43, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* 'P' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 15, 47, 16, 24, 41, -/* '`' */ 47, 37, 43, 43, 43, 28, 43, 41, 41, 33, 41, 41, 41, 38, 35, 34, -/* 'p' */ 30, 41, 31, 32, 36, 41, 41, 41, 29, 39, 41, 3, 47, 2, 47, 47, -/* '\x80' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\x90' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\xA0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, 47, 47, 47, 47, -/* '\xB0' */ 47, 47, 47, 47, 47, 41, 47, 47, 47, 47, 41, 47, 47, 47, 47, 47, -/* '\xC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\xD0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\xE0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\xF0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\0' */ 48, 41, 48, 48, 48, 48, 48, 48, 48, 5, 0, 48, 48, 6, 48, 48, +/* '\x10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\x20' */ 5, 26, 48, 47, 4, 48, 10, 46, 7, 9, 8, 21, 11, 22, 13, 1, +/* '0' */ 43, 43, 28, 43, 43, 43, 43, 43, 43, 27, 12, 14, 24, 20, 23, 17, +/* '@' */ 19, 44, 44, 44, 44, 45, 44, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* 'P' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 15, 48, 16, 25, 18, +/* '`' */ 48, 38, 44, 44, 44, 29, 44, 42, 42, 34, 42, 42, 42, 39, 36, 35, +/* 'p' */ 31, 42, 32, 33, 37, 42, 42, 42, 30, 40, 42, 3, 48, 2, 48, 48, +/* '\x80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\x90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\xA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 48, 48, 48, 48, 48, +/* '\xB0' */ 48, 48, 48, 48, 48, 42, 48, 48, 48, 48, 42, 48, 48, 48, 48, 48, +/* '\xC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\xD0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\xE0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\xF0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo1 = new sbyte[256] { -/* '\u0100' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0110' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0120' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0130' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0140' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0150' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0160' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0170' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0180' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0190' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u01F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u0100' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0110' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0120' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0130' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0140' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0150' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0160' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0170' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0180' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0190' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u01F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo2 = new sbyte[256] { -/* '\u0200' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0210' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0220' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0230' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0240' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0250' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0260' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0270' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0280' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0290' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u02A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u02B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u02C0' */ 41, 41, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u02D0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u02E0' */ 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, -/* '\u02F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0200' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0210' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0220' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0230' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0240' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0250' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0260' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0270' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0280' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0290' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u02A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u02B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u02C0' */ 42, 42, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u02D0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u02E0' */ 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 48, +/* '\u02F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo3 = new sbyte[256] { -/* '\u0300' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0310' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0320' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0330' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0340' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0350' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0360' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0370' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 47, 47, -/* '\u0380' */ 47, 47, 47, 47, 47, 47, 41, 47, 41, 41, 41, 47, 41, 47, 41, 41, -/* '\u0390' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u03A0' */ 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u03B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u03C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u03D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u03E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u03F0' */ 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u0300' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0310' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0320' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0330' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0340' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0350' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 48, 48, +/* '\u0380' */ 48, 48, 48, 48, 48, 48, 42, 48, 42, 42, 42, 48, 42, 48, 42, 42, +/* '\u0390' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u03A0' */ 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u03B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u03C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u03D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u03E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u03F0' */ 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo4 = new sbyte[256] { -/* '\u0400' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0410' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0420' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0430' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0440' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0450' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0460' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0470' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0480' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\u0490' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u04F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u0400' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0410' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0420' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0430' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0440' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0450' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0460' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0470' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0480' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\u0490' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u04F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo5 = new sbyte[256] { -/* '\u0500' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0510' */ 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0520' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0530' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0540' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0550' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 41, 47, 47, 47, 47, 47, 47, -/* '\u0560' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0570' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0580' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0590' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u05A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u05B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u05C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u05D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u05E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u05F0' */ 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0500' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0510' */ 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0520' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0530' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0540' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0550' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 42, 48, 48, 48, 48, 48, 48, +/* '\u0560' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0570' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0580' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0590' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u05A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u05B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u05C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u05D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u05E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u05F0' */ 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo6 = new sbyte[256] { -/* '\u0600' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0610' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0620' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0630' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u0640' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u0650' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0660' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, -/* '\u0670' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0680' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0690' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u06A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u06B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u06C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u06D0' */ 41, 41, 41, 41, 47, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u06E0' */ 47, 47, 47, 47, 47, 41, 41, 47, 47, 47, 47, 47, 47, 47, 41, 41, -/* '\u06F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 47, 47, 41 }; +/* '\u0600' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0610' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0620' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0630' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u0640' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u0650' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0660' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, +/* '\u0670' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0680' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0690' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u06A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u06B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u06C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u06D0' */ 42, 42, 42, 42, 48, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u06E0' */ 48, 48, 48, 48, 48, 42, 42, 48, 48, 48, 48, 48, 48, 48, 42, 42, +/* '\u06F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 48, 48, 42 }; static sbyte[] mLo7 = new sbyte[256] { -/* '\u0700' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0710' */ 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0720' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0730' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0740' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, -/* '\u0750' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0760' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\u0770' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0780' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0790' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u07A0' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u07B0' */ 47, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u07C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\u07D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u07E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u07F0' */ 47, 47, 47, 47, 41, 41, 47, 47, 47, 47, 41, 47, 47, 47, 47, 47 }; +/* '\u0700' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0710' */ 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0720' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0730' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0740' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, +/* '\u0750' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0760' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\u0770' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0780' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0790' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u07A0' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u07B0' */ 48, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u07C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\u07D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u07E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u07F0' */ 48, 48, 48, 48, 42, 42, 48, 48, 48, 48, 42, 48, 48, 48, 48, 48 }; static sbyte[] mLo8 = new sbyte[256] { -/* '\u0800' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0810' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0820' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0830' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0840' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0850' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0860' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0870' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0880' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0890' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u08F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0800' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0810' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0820' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0830' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0840' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0850' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0860' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0870' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0880' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0890' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u08F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo9 = new sbyte[256] { -/* '\u0900' */ 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0910' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0920' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0930' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 41, 47, 47, -/* '\u0940' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0950' */ 41, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0960' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0970' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, -/* '\u0980' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 41, -/* '\u0990' */ 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u09A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u09B0' */ 41, 47, 41, 47, 47, 47, 41, 41, 41, 41, 47, 47, 47, 41, 47, 47, -/* '\u09C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, -/* '\u09D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 47, 41, -/* '\u09E0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u09F0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0900' */ 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0910' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0920' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0930' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 42, 48, 48, +/* '\u0940' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0950' */ 42, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0960' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0970' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, +/* '\u0980' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 42, +/* '\u0990' */ 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u09A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u09B0' */ 42, 48, 42, 48, 48, 48, 42, 42, 42, 42, 48, 48, 48, 42, 48, 48, +/* '\u09C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 48, +/* '\u09D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 48, 42, +/* '\u09E0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u09F0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo10 = new sbyte[256] { -/* '\u0A00' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 41, -/* '\u0A10' */ 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0A20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0A30' */ 41, 47, 41, 41, 47, 41, 41, 47, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\u0A40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0A50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 47, 41, 47, -/* '\u0A60' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0A70' */ 47, 47, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0A80' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, -/* '\u0A90' */ 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0AA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0AB0' */ 41, 47, 41, 41, 47, 41, 41, 41, 41, 41, 47, 47, 47, 41, 47, 47, -/* '\u0AC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0AD0' */ 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0AE0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0AF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0A00' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 42, +/* '\u0A10' */ 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0A20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0A30' */ 42, 48, 42, 42, 48, 42, 42, 48, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\u0A40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0A50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 48, 42, 48, +/* '\u0A60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0A70' */ 48, 48, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0A80' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, +/* '\u0A90' */ 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0AA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0AB0' */ 42, 48, 42, 42, 48, 42, 42, 42, 42, 42, 48, 48, 48, 42, 48, 48, +/* '\u0AC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0AD0' */ 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0AE0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0AF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo11 = new sbyte[256] { -/* '\u0B00' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 41, -/* '\u0B10' */ 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0B20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0B30' */ 41, 47, 41, 41, 47, 41, 41, 41, 41, 41, 47, 47, 47, 41, 47, 47, -/* '\u0B40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0B50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 47, 41, -/* '\u0B60' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0B70' */ 47, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0B80' */ 47, 47, 47, 41, 47, 41, 41, 41, 41, 41, 41, 47, 47, 47, 41, 41, -/* '\u0B90' */ 41, 47, 41, 41, 41, 41, 47, 47, 47, 41, 41, 47, 41, 47, 41, 41, -/* '\u0BA0' */ 47, 47, 47, 41, 41, 47, 47, 47, 41, 41, 41, 47, 47, 47, 41, 41, -/* '\u0BB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\u0BC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0BD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0BE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0BF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0B00' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 42, +/* '\u0B10' */ 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0B20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0B30' */ 42, 48, 42, 42, 48, 42, 42, 42, 42, 42, 48, 48, 48, 42, 48, 48, +/* '\u0B40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0B50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 48, 42, +/* '\u0B60' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0B70' */ 48, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0B80' */ 48, 48, 48, 42, 48, 42, 42, 42, 42, 42, 42, 48, 48, 48, 42, 42, +/* '\u0B90' */ 42, 48, 42, 42, 42, 42, 48, 48, 48, 42, 42, 48, 42, 48, 42, 42, +/* '\u0BA0' */ 48, 48, 48, 42, 42, 48, 48, 48, 42, 42, 42, 48, 48, 48, 42, 42, +/* '\u0BB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\u0BC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0BD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0BE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0BF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo12 = new sbyte[256] { -/* '\u0C00' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\u0C10' */ 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0C20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0C30' */ 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\u0C40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0C50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0C60' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0C70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0C80' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\u0C90' */ 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0CA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0CB0' */ 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 47, 47, 47, 41, 47, 47, -/* '\u0CC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0CD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, -/* '\u0CE0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0CF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0C00' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\u0C10' */ 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0C20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0C30' */ 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\u0C40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0C50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0C60' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0C70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0C80' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\u0C90' */ 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0CA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0CB0' */ 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 48, 48, 48, 42, 48, 48, +/* '\u0CC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0CD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 48, +/* '\u0CE0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0CF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo13 = new sbyte[256] { -/* '\u0D00' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\u0D10' */ 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0D20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\u0D30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\u0D40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0D50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0D60' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0D70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0D80' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0D90' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\u0DA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0DB0' */ 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, 47, -/* '\u0DC0' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0DD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0DE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0DF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0D00' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\u0D10' */ 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0D20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\u0D30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\u0D40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0D50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0D60' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0D70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0D80' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0D90' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\u0DA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0DB0' */ 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, 48, +/* '\u0DC0' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo14 = new sbyte[256] { -/* '\u0E00' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0E10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0E20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0E30' */ 41, 47, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0E40' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0E50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0E60' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0E70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0E80' */ 47, 41, 41, 47, 41, 47, 47, 41, 41, 47, 41, 47, 47, 41, 47, 47, -/* '\u0E90' */ 47, 47, 47, 47, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, -/* '\u0EA0' */ 47, 41, 41, 41, 47, 41, 47, 41, 47, 47, 41, 41, 47, 41, 41, 41, -/* '\u0EB0' */ 41, 47, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 47, 47, -/* '\u0EC0' */ 41, 41, 41, 41, 41, 47, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0ED0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 47, 47, -/* '\u0EE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0EF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0E00' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0E10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0E20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0E30' */ 42, 48, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0E40' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0E50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0E60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0E70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0E80' */ 48, 42, 42, 48, 42, 48, 48, 42, 42, 48, 42, 48, 48, 42, 48, 48, +/* '\u0E90' */ 48, 48, 48, 48, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, +/* '\u0EA0' */ 48, 42, 42, 42, 48, 42, 48, 42, 48, 48, 42, 42, 48, 42, 42, 42, +/* '\u0EB0' */ 42, 48, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 48, 48, +/* '\u0EC0' */ 42, 42, 42, 42, 42, 48, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0ED0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 48, 48, +/* '\u0EE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0EF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo15 = new sbyte[256] { -/* '\u0F00' */ 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0F10' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0F20' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0F30' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0F40' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, -/* '\u0F50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u0F60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u0F70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0F80' */ 47, 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 47, 47, 47, 47, -/* '\u0F90' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FA0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FB0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u0FF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u0F00' */ 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0F10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0F20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0F30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0F40' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, +/* '\u0F50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u0F60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u0F70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0F80' */ 48, 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 48, 48, 48, 48, +/* '\u0F90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u0FF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo16 = new sbyte[256] { -/* '\u1000' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1010' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1020' */ 41, 41, 47, 41, 41, 41, 41, 41, 47, 41, 41, 47, 47, 47, 47, 47, -/* '\u1030' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1040' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1050' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1060' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1070' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1080' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1090' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u10A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u10B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u10C0' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u10D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u10E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u10F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, 47, 47 }; +/* '\u1000' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1010' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1020' */ 42, 42, 48, 42, 42, 42, 42, 42, 48, 42, 42, 48, 48, 48, 48, 48, +/* '\u1030' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1040' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1050' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1070' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1080' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1090' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u10A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u10B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u10C0' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u10D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u10E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u10F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, 48, 48 }; static sbyte[] mLo17 = new sbyte[256] { -/* '\u1100' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1110' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1120' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1130' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1140' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1150' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 41, -/* '\u1160' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1170' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1180' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1190' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11A0' */ 41, 41, 41, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u11F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47 }; +/* '\u1100' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1110' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1120' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1130' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1140' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1150' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 42, +/* '\u1160' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1170' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1180' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1190' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11A0' */ 42, 42, 42, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u11F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo18 = new sbyte[256] { -/* '\u1200' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1210' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1220' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1230' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1240' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 47, 47, -/* '\u1250' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, 41, 41, 41, 41, 47, 47, -/* '\u1260' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1270' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1280' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 47, 47, -/* '\u1290' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u12A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u12B0' */ 41, 47, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u12C0' */ 41, 47, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u12D0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u12E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u12F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u1200' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1210' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1220' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1230' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1240' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 48, 48, +/* '\u1250' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, 42, 42, 42, 42, 48, 48, +/* '\u1260' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1270' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1280' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 48, 48, +/* '\u1290' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u12A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u12B0' */ 42, 48, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u12C0' */ 42, 48, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u12D0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u12E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u12F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo19 = new sbyte[256] { -/* '\u1300' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1310' */ 41, 47, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1320' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1330' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1340' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1350' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u1360' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1370' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1380' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1390' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u13A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u13B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u13C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u13D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u13E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u13F0' */ 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1300' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1310' */ 42, 48, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1320' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1330' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1340' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1350' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u1360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1380' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1390' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u13A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u13B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u13C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u13D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u13E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u13F0' */ 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo20 = new sbyte[256] { -/* '\u1400' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1410' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1420' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1430' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1440' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1450' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1460' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1470' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1480' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1490' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u14F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u1400' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1410' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1420' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1430' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1440' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1450' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1460' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1470' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1480' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1490' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u14F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo22 = new sbyte[256] { -/* '\u1600' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1610' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1620' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1630' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1640' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1650' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1660' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 41, -/* '\u1670' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1680' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1690' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u16A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u16B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u16C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u16D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u16E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\u16F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1600' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1610' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1620' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1630' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1640' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1650' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1660' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 42, +/* '\u1670' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1680' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1690' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u16A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u16B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u16C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u16D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u16E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\u16F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo23 = new sbyte[256] { -/* '\u1700' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\u1710' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1720' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1730' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1740' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1750' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1760' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\u1770' */ 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1780' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1790' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u17A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u17B0' */ 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u17C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u17D0' */ 47, 47, 47, 47, 47, 47, 47, 41, 47, 47, 47, 47, 41, 47, 47, 47, -/* '\u17E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u17F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1700' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\u1710' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1720' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1730' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1740' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1750' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1760' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\u1770' */ 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1780' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1790' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u17A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u17B0' */ 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u17C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u17D0' */ 48, 48, 48, 48, 48, 48, 48, 42, 48, 48, 48, 48, 42, 48, 48, 48, +/* '\u17E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u17F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo24 = new sbyte[256] { -/* '\u1800' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1810' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1820' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1830' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1840' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1850' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1860' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1870' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1880' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1890' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u18A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, -/* '\u18B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u18C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u18D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u18E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u18F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1800' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1810' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1820' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1830' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1840' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1850' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1860' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1870' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1880' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1890' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u18A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, +/* '\u18B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u18C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u18D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u18E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u18F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo25 = new sbyte[256] { -/* '\u1900' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1910' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\u1920' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1930' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1940' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1950' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1960' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\u1970' */ 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1980' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1990' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u19A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\u19B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u19C0' */ 47, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u19D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u19E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u19F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1900' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1910' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\u1920' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1930' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1940' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1950' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1960' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\u1970' */ 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1980' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1990' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u19A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\u19B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u19C0' */ 48, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u19D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u19E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u19F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo26 = new sbyte[256] { -/* '\u1A00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1A10' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A20' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A30' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A60' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A80' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1A90' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AA0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AB0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1AF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1A00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1A10' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1A90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1AF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo27 = new sbyte[256] { -/* '\u1B00' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1B10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1B20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1B30' */ 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1B40' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, -/* '\u1B50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1B60' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1B70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1B80' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1B90' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BA0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BB0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1BF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1B00' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1B10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1B20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1B30' */ 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1B40' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, +/* '\u1B50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1B60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1B70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1B80' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1B90' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BA0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BB0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1BF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo29 = new sbyte[256] { -/* '\u1D00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1D90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1DA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1DB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1DC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1DD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1DE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u1DF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u1D00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1D90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1DA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1DB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1DC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u1DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo30 = new sbyte[256] { -/* '\u1E00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1E90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, -/* '\u1EA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1EB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1EC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1ED0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1EE0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1EF0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47 }; +/* '\u1E00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1E90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, +/* '\u1EA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1EB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1EC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1ED0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1EE0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1EF0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo31 = new sbyte[256] { -/* '\u1F00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1F10' */ 41, 41, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\u1F20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1F30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1F40' */ 41, 41, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\u1F50' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, 41, 47, 41, 47, 41, -/* '\u1F60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1F70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\u1F80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1F90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1FA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u1FB0' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, -/* '\u1FC0' */ 47, 47, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\u1FD0' */ 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, -/* '\u1FE0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\u1FF0' */ 47, 47, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47 }; +/* '\u1F00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1F10' */ 42, 42, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\u1F20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1F30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1F40' */ 42, 42, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\u1F50' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, 42, 48, 42, 48, 42, +/* '\u1F60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1F70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\u1F80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1F90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1FA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u1FB0' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, +/* '\u1FC0' */ 48, 48, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\u1FD0' */ 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, +/* '\u1FE0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\u1FF0' */ 48, 48, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48 }; static sbyte[] mLo32 = new sbyte[256] { -/* '\u2000' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2010' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2020' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2030' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2040' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2050' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2060' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2070' */ 47, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, -/* '\u2080' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2090' */ 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u20F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u2000' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2010' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2020' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2030' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2040' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2050' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2070' */ 48, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, +/* '\u2080' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2090' */ 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u20F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo33 = new sbyte[256] { -/* '\u2100' */ 47, 47, 41, 47, 47, 47, 47, 41, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\u2110' */ 41, 41, 41, 41, 47, 41, 47, 47, 47, 41, 41, 41, 41, 41, 47, 47, -/* '\u2120' */ 47, 47, 47, 47, 41, 47, 41, 47, 41, 47, 41, 41, 41, 41, 47, 41, -/* '\u2130' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, -/* '\u2140' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 47, 47, 47, 47, 41, 47, -/* '\u2150' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2160' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2170' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2180' */ 47, 47, 47, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2190' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u21F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u2100' */ 48, 48, 42, 48, 48, 48, 48, 42, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\u2110' */ 42, 42, 42, 42, 48, 42, 48, 48, 48, 42, 42, 42, 42, 42, 48, 48, +/* '\u2120' */ 48, 48, 48, 48, 42, 48, 42, 48, 42, 48, 42, 42, 42, 42, 48, 42, +/* '\u2130' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, +/* '\u2140' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 48, 48, 48, 48, 42, 48, +/* '\u2150' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2160' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2170' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2180' */ 48, 48, 48, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2190' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u21F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo44 = new sbyte[256] { -/* '\u2C00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2C10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2C20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2C30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2C40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2C50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2C60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\u2C70' */ 47, 47, 47, 47, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2C80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2C90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2CA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2CB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2CC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2CD0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2CE0' */ 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2CF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u2C00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2C10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2C20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2C30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2C40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2C50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2C60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\u2C70' */ 48, 48, 48, 48, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2C80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2C90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2CA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2CB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2CC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2CD0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2CE0' */ 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2CF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo45 = new sbyte[256] { -/* '\u2D00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D20' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2D30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D60' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 41, -/* '\u2D70' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2D80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u2D90' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2DA0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2DB0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2DC0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2DD0' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u2DE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u2DF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u2D00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D20' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2D30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D60' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 42, +/* '\u2D70' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2D80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u2D90' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2DA0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2DB0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2DC0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2DD0' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u2DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u2DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo48 = new sbyte[256] { -/* '\u3000' */ 47, 47, 47, 47, 47, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u3010' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u3020' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u3030' */ 47, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 41, 41, 47, 47, 47, -/* '\u3040' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3050' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3060' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3070' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3080' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3090' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 41, 41, 41, -/* '\u30A0' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u30B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u30C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u30D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u30E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u30F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41 }; +/* '\u3000' */ 48, 48, 48, 48, 48, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u3010' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u3020' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u3030' */ 48, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 42, 42, 48, 48, 48, +/* '\u3040' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3050' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3060' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3070' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3080' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3090' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 42, 42, 42, +/* '\u30A0' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u30B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u30C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u30D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u30E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u30F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42 }; static sbyte[] mLo49 = new sbyte[256] { -/* '\u3100' */ 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3110' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3120' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\u3130' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3140' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3150' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3160' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3170' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u3180' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\u3190' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u31A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u31B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u31C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u31D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u31E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u31F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\u3100' */ 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3110' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3120' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\u3130' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3140' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3150' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3160' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3170' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u3180' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\u3190' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u31A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u31B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u31C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u31D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u31E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u31F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo77 = new sbyte[256] { -/* '\u4D00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4D90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4DA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u4DB0' */ 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u4DC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u4DD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u4DE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u4DF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u4D00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4D90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4DA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u4DB0' */ 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u4DC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u4DD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u4DE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u4DF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo159 = new sbyte[256] { -/* '\u9F00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9F90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9FA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\u9FB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, -/* '\u9FC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u9FD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u9FE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\u9FF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\u9F00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9F90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9FA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\u9FB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, +/* '\u9FC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u9FD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u9FE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\u9FF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo164 = new sbyte[256] { -/* '\uA400' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA410' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA420' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA430' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA440' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA450' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA460' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA470' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA480' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, -/* '\uA490' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA4F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uA400' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA410' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA420' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA430' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA440' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA450' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA460' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA470' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA480' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, +/* '\uA490' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA4F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo167 = new sbyte[256] { -/* '\uA700' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA710' */ 47, 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\uA720' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA730' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA740' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA750' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA760' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA770' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA780' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA790' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA7F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uA700' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA710' */ 48, 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\uA720' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA730' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA740' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA750' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA760' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA770' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA780' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA790' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA7F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo168 = new sbyte[256] { -/* '\uA800' */ 41, 41, 47, 41, 41, 41, 47, 41, 41, 41, 41, 47, 41, 41, 41, 41, -/* '\uA810' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA820' */ 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA830' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA840' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA850' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA860' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uA870' */ 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA880' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA890' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8A0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uA8F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uA800' */ 42, 42, 48, 42, 42, 42, 48, 42, 42, 42, 42, 48, 42, 42, 42, 42, +/* '\uA810' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA820' */ 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA830' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA840' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA850' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA860' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uA870' */ 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA880' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA890' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8A0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uA8F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo215 = new sbyte[256] { -/* '\uD700' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD710' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD720' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD730' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD740' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD750' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD760' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD770' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD780' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD790' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uD7A0' */ 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uD7B0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uD7C0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uD7D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uD7E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uD7F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uD700' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD710' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD720' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD730' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD740' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD750' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD760' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD770' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD780' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD790' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uD7A0' */ 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uD7B0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uD7C0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uD7D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uD7E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uD7F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo250 = new sbyte[256] { -/* '\uFA00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\uFA30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA40' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\uFA70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFA90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFAA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFAB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFAC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFAD0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\uFAE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFAF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uFA00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\uFA30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA40' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\uFA70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFA90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFAA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFAB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFAC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFAD0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\uFAE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFAF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mLo251 = new sbyte[256] { -/* '\uFB00' */ 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFB10' */ 47, 47, 47, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 41, 47, 41, -/* '\uFB20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\uFB30' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 47, 41, 47, -/* '\uFB40' */ 41, 41, 47, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFB50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFB60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFB70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFB80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFB90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFBA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFBB0' */ 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFBC0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFBD0' */ 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFBE0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFBF0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\uFB00' */ 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFB10' */ 48, 48, 48, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 42, 48, 42, +/* '\uFB20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\uFB30' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 48, 42, 48, +/* '\uFB40' */ 42, 42, 48, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFB50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFB60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFB70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFB80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFB90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFBA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFBB0' */ 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFBC0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFBD0' */ 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFBE0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFBF0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mLo253 = new sbyte[256] { -/* '\uFD00' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD10' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\uFD40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFD50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD60' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFD90' */ 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFDA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFDB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFDC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFDD0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFDE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFDF0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47 }; +/* '\uFD00' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD10' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\uFD40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFD50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD60' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFD90' */ 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFDA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFDB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFDC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFDD0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFDE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFDF0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48 }; static sbyte[] mLo254 = new sbyte[256] { -/* '\uFE00' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE10' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE20' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE30' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE40' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE50' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE60' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFE70' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFE80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFE90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFEA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFEB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFEC0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFED0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFEE0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFEF0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47 }; +/* '\uFE00' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE20' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE30' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE40' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE50' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE60' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFE70' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFE80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFE90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFEA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFEB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFEC0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFED0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFEE0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFEF0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48 }; static sbyte[] mLo255 = new sbyte[256] { -/* '\uFF00' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFF10' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFF20' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFF30' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\uFF40' */ 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFF50' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, -/* '\uFF60' */ 47, 47, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFF70' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFF80' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFF90' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFFA0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\uFFB0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\uFFC0' */ 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\uFFD0' */ 47, 47, 41, 41, 41, 41, 41, 41, 47, 47, 41, 41, 41, 47, 47, 47, -/* '\uFFE0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\uFFF0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\uFF00' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFF10' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFF20' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFF30' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\uFF40' */ 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFF50' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, +/* '\uFF60' */ 48, 48, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFF70' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFF80' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFF90' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFFA0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\uFFB0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\uFFC0' */ 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\uFFD0' */ 48, 48, 42, 42, 42, 42, 42, 42, 48, 48, 42, 42, 42, 48, 48, 48, +/* '\uFFE0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\uFFF0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[][] map = new sbyte[256][] { /* '\u00xx' */ mLo0, mLo1, mLo2, mLo3, mLo4, mLo5, mLo6, mLo7, mLo8, mLo9, mLo10, mLo11, mLo12, mLo13, mLo14, mLo15, @@ -1008,99 +1008,99 @@ public PT parsertools; #region CompressedCharacterMap // - // There are 48 equivalence classes + // There are 49 equivalence classes // There are 21 character sequence regions // There are 6 tables, 1255 entries // There are 15 runs, 0 singletons // Decision tree depth is 5 // static sbyte[] mapC0 = new sbyte[251] { -/* '\U00010000' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, -/* '\U00010010' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010020' */ 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010030' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 47, 41, -/* '\U00010040' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\U00010050' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\U00010060' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010070' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010080' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010090' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100C0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000100F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41 }; +/* '\U00010000' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, +/* '\U00010010' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010020' */ 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010030' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 48, 42, +/* '\U00010040' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\U00010050' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\U00010060' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010070' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010080' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010090' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100C0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000100F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; static sbyte[] mapC2 = new sbyte[256] { -/* '\U00010300' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010310' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\U00010320' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010330' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010340' */ 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, 47, 47, 47, 47, -/* '\U00010350' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010360' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010370' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010380' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010390' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 47, -/* '\U000103A0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000103B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000103C0' */ 41, 41, 41, 41, 47, 47, 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U000103D0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U000103E0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U000103F0' */ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47 }; +/* '\U00010300' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010310' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\U00010320' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010330' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010340' */ 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, +/* '\U00010350' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010360' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010370' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010380' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010390' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 48, +/* '\U000103A0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000103B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000103C0' */ 42, 42, 42, 42, 48, 48, 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U000103D0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U000103E0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U000103F0' */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; static sbyte[] mapC5 = new sbyte[64] { -/* '\U00010800' */ 41, 41, 41, 41, 41, 41, 47, 47, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\U00010810' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010820' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010830' */ 41, 41, 41, 41, 41, 41, 47, 41, 41, 47, 47, 47, 41, 47, 47, 41 }; +/* '\U00010800' */ 42, 42, 42, 42, 42, 42, 48, 48, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\U00010810' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010820' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010830' */ 42, 42, 42, 42, 42, 42, 48, 42, 42, 48, 48, 48, 42, 48, 48, 42 }; static sbyte[] mapC9 = new sbyte[52] { -/* '\U00010A00' */ 41, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -/* '\U00010A10' */ 41, 41, 41, 41, 47, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010A20' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U00010A30' */ 41, 41, 41, 41 }; +/* '\U00010A00' */ 42, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* '\U00010A10' */ 42, 42, 42, 42, 48, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010A20' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U00010A30' */ 42, 42, 42, 42 }; static sbyte[] mapC13 = new sbyte[338] { -/* '\U0001D400' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D410' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D420' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D430' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D440' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D450' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D460' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D470' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D480' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D490' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\U0001D4A0' */ 47, 47, 41, 47, 47, 41, 41, 47, 47, 41, 41, 41, 41, 47, 41, 41, -/* '\U0001D4B0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 47, 41, 41, 41, -/* '\U0001D4C0' */ 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D4D0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D4E0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D4F0' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D500' */ 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 47, 47, 41, 41, 41, -/* '\U0001D510' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\U0001D520' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D530' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 47, -/* '\U0001D540' */ 41, 41, 41, 41, 41, 47, 41, 47, 47, 47, 41, 41, 41, 41, 41, 41, -/* '\U0001D550' */ 41, 47 }; +/* '\U0001D400' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D410' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D420' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D430' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D440' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D450' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D460' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D470' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D480' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D490' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\U0001D4A0' */ 48, 48, 42, 48, 48, 42, 42, 48, 48, 42, 42, 42, 42, 48, 42, 42, +/* '\U0001D4B0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 48, 42, 42, 42, +/* '\U0001D4C0' */ 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D4D0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D4E0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D4F0' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D500' */ 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 48, 48, 42, 42, 42, +/* '\U0001D510' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\U0001D520' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D530' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 48, +/* '\U0001D540' */ 42, 42, 42, 42, 42, 48, 42, 48, 48, 48, 42, 42, 42, 42, 42, 42, +/* '\U0001D550' */ 42, 48 }; static sbyte[] mapC15 = new sbyte[294] { -/* '\U0001D6A6' */ 47, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D6B6' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, -/* '\U0001D6C6' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D6D6' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D6E6' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D6F6' */ 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D706' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\U0001D716' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D726' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, -/* '\U0001D736' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D746' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\U0001D756' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D766' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, -/* '\U0001D776' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D786' */ 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D796' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D7A6' */ 41, 41, 41, 47, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -/* '\U0001D7B6' */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, -/* '\U0001D7C6' */ 41, 41, 41, 41, 41, 41 }; +/* '\U0001D6A6' */ 48, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D6B6' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, +/* '\U0001D6C6' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D6D6' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D6E6' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D6F6' */ 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D706' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\U0001D716' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D726' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, +/* '\U0001D736' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D746' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\U0001D756' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D766' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, +/* '\U0001D776' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D786' */ 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D796' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D7A6' */ 42, 42, 42, 48, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, +/* '\U0001D7B6' */ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 48, 42, 42, +/* '\U0001D7C6' */ 42, 42, 42, 42, 42, 42 }; static sbyte MapC(int code) { // '\U00010000' <= code <= '\U0010FFFF' @@ -1110,61 +1110,61 @@ public PT parsertools; if (code < 65787) // '\U00010000' <= code <= '\U000100FA' return mapC0[code - 65536]; else // '\U000100FB' <= code <= '\U000102FF' - return (sbyte)47; + return (sbyte)48; else // '\U00010300' <= code <= '\U000107FF' if (code < 66560) // '\U00010300' <= code <= '\U000103FF' return mapC2[code - 66304]; else // '\U00010400' <= code <= '\U000107FF' if (code < 66718) // '\U00010400' <= code <= '\U0001049D' - return (sbyte)41; + return (sbyte)42; else // '\U0001049E' <= code <= '\U000107FF' - return (sbyte)47; + return (sbyte)48; else // '\U00010800' <= code <= '\U00010A33' if (code < 67840) // '\U00010800' <= code <= '\U000108FF' if (code < 67648) // '\U00010800' <= code <= '\U0001083F' return mapC5[code - 67584]; else // '\U00010840' <= code <= '\U000108FF' - return (sbyte)47; + return (sbyte)48; else // '\U00010900' <= code <= '\U00010A33' if (code < 67862) // '\U00010900' <= code <= '\U00010915' - return (sbyte)41; + return (sbyte)42; else // '\U00010916' <= code <= '\U00010A33' if (code < 68096) // '\U00010916' <= code <= '\U000109FF' - return (sbyte)47; + return (sbyte)48; else // '\U00010A00' <= code <= '\U00010A33' return mapC9[code - 68096]; else // '\U00010A34' <= code <= '\U0010FFFF' if (code < 120486) // '\U00010A34' <= code <= '\U0001D6A5' if (code < 74607) // '\U00010A34' <= code <= '\U0001236E' if (code < 73728) // '\U00010A34' <= code <= '\U00011FFF' - return (sbyte)47; + return (sbyte)48; else // '\U00012000' <= code <= '\U0001236E' - return (sbyte)41; + return (sbyte)42; else // '\U0001236F' <= code <= '\U0001D6A5' if (code < 119808) // '\U0001236F' <= code <= '\U0001D3FF' - return (sbyte)47; + return (sbyte)48; else // '\U0001D400' <= code <= '\U0001D6A5' if (code < 120146) // '\U0001D400' <= code <= '\U0001D551' return mapC13[code - 119808]; else // '\U0001D552' <= code <= '\U0001D6A5' - return (sbyte)41; + return (sbyte)42; else // '\U0001D6A6' <= code <= '\U0010FFFF' if (code < 173783) // '\U0001D6A6' <= code <= '\U0002A6D6' if (code < 120780) // '\U0001D6A6' <= code <= '\U0001D7CB' return mapC15[code - 120486]; else // '\U0001D7CC' <= code <= '\U0002A6D6' if (code < 131072) // '\U0001D7CC' <= code <= '\U0001FFFF' - return (sbyte)47; + return (sbyte)48; else // '\U00020000' <= code <= '\U0002A6D6' - return (sbyte)41; + return (sbyte)42; else // '\U0002A6D7' <= code <= '\U0010FFFF' if (code < 194560) // '\U0002A6D7' <= code <= '\U0002F7FF' - return (sbyte)47; + return (sbyte)48; else // '\U0002F800' <= code <= '\U0010FFFF' if (code < 195102) // '\U0002F800' <= code <= '\U0002FA1D' - return (sbyte)41; + return (sbyte)42; else // '\U0002FA1E' <= code <= '\U0010FFFF' - return (sbyte)47; + return (sbyte)48; } #endregion @@ -1177,54 +1177,60 @@ public PT parsertools; return MapC(code); } - static Table[] NxS = new Table[107] { + static Table[] NxS = new Table[108] { /* NxS[ 0] */ new Table(0, 0, 0, null), -/* NxS[ 1] */ new Table(1, 19, -1, new sbyte[] {55, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56}), +/* NxS[ 1] */ new Table(1, 20, -1, new sbyte[] {56, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57}), /* NxS[ 2] */ new Table(0, 0, -1, null), -/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {101}), -/* NxS[ 4] */ new Table(26, 20, -1, new sbyte[] {52, 52, 52, -1, -1, -1, - -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, 52, 52, 52, 100}), -/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {51}), -/* NxS[ 6] */ new Table(8, 12, -1, new sbyte[] {49, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 50}), +/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {102}), +/* NxS[ 4] */ new Table(27, 20, -1, new sbyte[] {53, 53, 53, -1, -1, -1, + -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, 53, 53, 53, 101}), +/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {52}), +/* NxS[ 6] */ new Table(8, 13, -1, new sbyte[] {50, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 51}), /* NxS[ 7] */ new Table(0, 0, -1, null), -/* NxS[ 8] */ new Table(28, 17, -1, new sbyte[] {25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, -1, 25, -1, 25, 25}), +/* NxS[ 8] */ new Table(18, 28, -1, new sbyte[] {26, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, -1, 26, -1, 26, 26}), /* NxS[ 9] */ new Table(0, 0, -1, null), -/* NxS[ 10] */ new Table(19, 1, -1, new sbyte[] {48}), -/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {47}), +/* NxS[ 10] */ new Table(20, 1, -1, new sbyte[] {49}), +/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {48}), /* NxS[ 12] */ new Table(0, 0, -1, null), /* NxS[ 13] */ new Table(0, 0, -1, null), /* NxS[ 14] */ new Table(0, 0, -1, null), -/* NxS[ 15] */ new Table(13, 5, -1, new sbyte[] {44, -1, 45, -1, 46}), -/* NxS[ 16] */ new Table(0, 0, -1, null), +/* NxS[ 15] */ new Table(13, 5, -1, new sbyte[] {45, -1, 46, -1, 47}), +/* NxS[ 16] */ new Table(18, 28, -1, new sbyte[] {26, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, -1, 26, 26, 26, 26}), /* NxS[ 17] */ new Table(0, 0, -1, null), -/* NxS[ 18] */ new Table(19, 1, -1, new sbyte[] {43}), -/* NxS[ 19] */ new Table(19, 4, -1, new sbyte[] {41, -1, -1, 42}), -/* NxS[ 20] */ new Table(19, 1, -1, new sbyte[] {40}), -/* NxS[ 21] */ new Table(19, 5, -1, new sbyte[] {35, -1, -1, 36, 73}), -/* NxS[ 22] */ new Table(0, 0, -1, null), -/* NxS[ 23] */ new Table(26, 1, -1, new sbyte[] {72}), -/* NxS[ 24] */ new Table(13, 32, -1, new sbyte[] {69, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 24, 24, 70, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 24, -1, 70}), -/* NxS[ 25] */ new Table(26, 19, -1, new sbyte[] {25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, -1, 25, 25, 25, 25}), -/* NxS[ 26] */ new Table(0, 0, -1, null), -/* NxS[ 27] */ new Table(45, 4, 68, new sbyte[] {31, 68, 68, -1}), -/* NxS[ 28] */ new Table(26, 19, -1, new sbyte[] {29, 29, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 29, 30, 30}), -/* NxS[ 29] */ new Table(26, 17, -1, new sbyte[] {29, 29, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29}), -/* NxS[ 30] */ new Table(26, 19, -1, new sbyte[] {30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 30, 30, 30}), -/* NxS[ 31] */ new Table(45, 1, -1, new sbyte[] {68}), -/* NxS[ 32] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}), -/* NxS[ 33] */ new Table(26, 19, -1, new sbyte[] {33, 33, 70, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 70}), -/* NxS[ 34] */ new Table(0, 0, -1, null), +/* NxS[ 18] */ new Table(0, 0, -1, null), +/* NxS[ 19] */ new Table(20, 1, -1, new sbyte[] {44}), +/* NxS[ 20] */ new Table(20, 4, -1, new sbyte[] {42, -1, -1, 43}), +/* NxS[ 21] */ new Table(20, 1, -1, new sbyte[] {41}), +/* NxS[ 22] */ new Table(20, 5, -1, new sbyte[] {36, -1, -1, 37, 74}), +/* NxS[ 23] */ new Table(0, 0, -1, null), +/* NxS[ 24] */ new Table(27, 1, -1, new sbyte[] {73}), +/* NxS[ 25] */ new Table(13, 33, -1, new sbyte[] {70, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 25, 25, 71, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, 71}), +/* NxS[ 26] */ new Table(18, 28, -1, new sbyte[] {26, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, -1, 26, 26, 26, 26}), +/* NxS[ 27] */ new Table(0, 0, -1, null), +/* NxS[ 28] */ new Table(46, 4, 69, new sbyte[] {32, 69, 69, -1}), +/* NxS[ 29] */ new Table(18, 28, -1, new sbyte[] {30, -1, -1, -1, -1, -1, + -1, -1, -1, 31, 31, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, -1, 30, 31, 30, 30}), +/* NxS[ 30] */ new Table(18, 28, -1, new sbyte[] {30, -1, -1, -1, -1, -1, + -1, -1, -1, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, -1, 30, 30, 30, 30}), +/* NxS[ 31] */ new Table(27, 17, -1, new sbyte[] {31, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31}), +/* NxS[ 32] */ new Table(46, 1, -1, new sbyte[] {69}), +/* NxS[ 33] */ new Table(27, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33}), +/* NxS[ 34] */ new Table(27, 19, -1, new sbyte[] {34, 34, 71, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, 71}), /* NxS[ 35] */ new Table(0, 0, -1, null), /* NxS[ 36] */ new Table(0, 0, -1, null), /* NxS[ 37] */ new Table(0, 0, -1, null), @@ -1242,72 +1248,73 @@ public PT parsertools; /* NxS[ 49] */ new Table(0, 0, -1, null), /* NxS[ 50] */ new Table(0, 0, -1, null), /* NxS[ 51] */ new Table(0, 0, -1, null), -/* NxS[ 52] */ new Table(26, 19, -1, new sbyte[] {52, 52, 52, -1, -1, -1, - -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, 52, 52, 52}), -/* NxS[ 53] */ new Table(45, 1, -1, new sbyte[] {100}), -/* NxS[ 54] */ new Table(0, 0, -1, null), -/* NxS[ 55] */ new Table(0, 7, 55, new sbyte[] {-1, 55, 55, 55, 55, 55, +/* NxS[ 52] */ new Table(0, 0, -1, null), +/* NxS[ 53] */ new Table(27, 19, -1, new sbyte[] {53, 53, 53, -1, -1, -1, + -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, 53, 53, 53}), +/* NxS[ 54] */ new Table(46, 1, -1, new sbyte[] {101}), +/* NxS[ 55] */ new Table(0, 0, -1, null), +/* NxS[ 56] */ new Table(0, 7, 56, new sbyte[] {-1, 56, 56, 56, 56, 56, -1}), -/* NxS[ 56] */ new Table(0, 0, -1, null), /* NxS[ 57] */ new Table(0, 0, -1, null), /* NxS[ 58] */ new Table(0, 0, -1, null), /* NxS[ 59] */ new Table(0, 0, -1, null), -/* NxS[ 60] */ new Table(9, 1, -1, new sbyte[] {61}), -/* NxS[ 61] */ new Table(0, 0, -1, null), +/* NxS[ 60] */ new Table(0, 0, -1, null), +/* NxS[ 61] */ new Table(9, 1, -1, new sbyte[] {62}), /* NxS[ 62] */ new Table(0, 0, -1, null), -/* NxS[ 63] */ new Table(1, 1, -1, new sbyte[] {66}), -/* NxS[ 64] */ new Table(4, 1, -1, new sbyte[] {106}), -/* NxS[ 65] */ new Table(0, 0, -1, null), -/* NxS[ 66] */ new Table(0, 7, 66, new sbyte[] {-1, 66, 66, 66, 66, 66, +/* NxS[ 63] */ new Table(0, 0, -1, null), +/* NxS[ 64] */ new Table(1, 1, -1, new sbyte[] {67}), +/* NxS[ 65] */ new Table(4, 1, -1, new sbyte[] {107}), +/* NxS[ 66] */ new Table(0, 0, -1, null), +/* NxS[ 67] */ new Table(0, 7, 67, new sbyte[] {-1, 67, 67, 67, 67, 67, -1}), -/* NxS[ 67] */ new Table(40, 36, 25, new sbyte[] {26, 25, 24, 25, 25, 27, - 28, 2, -1, 1, 2, 3, 4, -1, -1, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24}), -/* NxS[ 68] */ new Table(45, 4, 68, new sbyte[] {31, 68, 68, -1}), -/* NxS[ 69] */ new Table(26, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1, +/* NxS[ 68] */ new Table(41, 37, 26, new sbyte[] {27, 26, 25, 26, 26, 28, + 29, 2, -1, 1, 2, 3, 4, -1, -1, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25}), +/* NxS[ 69] */ new Table(46, 4, 69, new sbyte[] {32, 69, 69, -1}), +/* NxS[ 70] */ new Table(27, 17, -1, new sbyte[] {34, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34}), +/* NxS[ 71] */ new Table(21, 23, -1, new sbyte[] {72, 72, -1, -1, -1, -1, + 33, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 33}), +/* NxS[ 72] */ new Table(27, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33}), -/* NxS[ 70] */ new Table(20, 23, -1, new sbyte[] {71, 71, -1, -1, -1, -1, - 32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 32}), -/* NxS[ 71] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}), -/* NxS[ 72] */ new Table(27, 1, -1, new sbyte[] {34}), -/* NxS[ 73] */ new Table(28, 9, -1, new sbyte[] {74, -1, -1, -1, 75, -1, - -1, -1, 76}), -/* NxS[ 74] */ new Table(29, 1, -1, new sbyte[] {90}), -/* NxS[ 75] */ new Table(36, 1, -1, new sbyte[] {81}), -/* NxS[ 76] */ new Table(39, 1, -1, new sbyte[] {77}), -/* NxS[ 77] */ new Table(30, 1, -1, new sbyte[] {78}), -/* NxS[ 78] */ new Table(28, 1, -1, new sbyte[] {79}), -/* NxS[ 79] */ new Table(22, 1, -1, new sbyte[] {80}), -/* NxS[ 80] */ new Table(22, 1, -1, new sbyte[] {37}), -/* NxS[ 81] */ new Table(37, 1, -1, new sbyte[] {82}), -/* NxS[ 82] */ new Table(36, 1, -1, new sbyte[] {83}), -/* NxS[ 83] */ new Table(28, 1, -1, new sbyte[] {84}), -/* NxS[ 84] */ new Table(38, 1, -1, new sbyte[] {85}), -/* NxS[ 85] */ new Table(28, 1, -1, new sbyte[] {86}), -/* NxS[ 86] */ new Table(35, 1, -1, new sbyte[] {87}), +/* NxS[ 73] */ new Table(28, 1, -1, new sbyte[] {35}), +/* NxS[ 74] */ new Table(29, 9, -1, new sbyte[] {75, -1, -1, -1, 76, -1, + -1, -1, 77}), +/* NxS[ 75] */ new Table(30, 1, -1, new sbyte[] {91}), +/* NxS[ 76] */ new Table(37, 1, -1, new sbyte[] {82}), +/* NxS[ 77] */ new Table(40, 1, -1, new sbyte[] {78}), +/* NxS[ 78] */ new Table(31, 1, -1, new sbyte[] {79}), +/* NxS[ 79] */ new Table(29, 1, -1, new sbyte[] {80}), +/* NxS[ 80] */ new Table(23, 1, -1, new sbyte[] {81}), +/* NxS[ 81] */ new Table(23, 1, -1, new sbyte[] {38}), +/* NxS[ 82] */ new Table(38, 1, -1, new sbyte[] {83}), +/* NxS[ 83] */ new Table(37, 1, -1, new sbyte[] {84}), +/* NxS[ 84] */ new Table(29, 1, -1, new sbyte[] {85}), +/* NxS[ 85] */ new Table(39, 1, -1, new sbyte[] {86}), +/* NxS[ 86] */ new Table(29, 1, -1, new sbyte[] {87}), /* NxS[ 87] */ new Table(36, 1, -1, new sbyte[] {88}), -/* NxS[ 88] */ new Table(22, 1, -1, new sbyte[] {89}), -/* NxS[ 89] */ new Table(22, 1, -1, new sbyte[] {38}), -/* NxS[ 90] */ new Table(30, 1, -1, new sbyte[] {91}), +/* NxS[ 88] */ new Table(37, 1, -1, new sbyte[] {89}), +/* NxS[ 89] */ new Table(23, 1, -1, new sbyte[] {90}), +/* NxS[ 90] */ new Table(23, 1, -1, new sbyte[] {39}), /* NxS[ 91] */ new Table(31, 1, -1, new sbyte[] {92}), -/* NxS[ 92] */ new Table(28, 1, -1, new sbyte[] {93}), -/* NxS[ 93] */ new Table(32, 1, -1, new sbyte[] {94}), -/* NxS[ 94] */ new Table(32, 1, -1, new sbyte[] {95}), +/* NxS[ 92] */ new Table(32, 1, -1, new sbyte[] {93}), +/* NxS[ 93] */ new Table(29, 1, -1, new sbyte[] {94}), +/* NxS[ 94] */ new Table(33, 1, -1, new sbyte[] {95}), /* NxS[ 95] */ new Table(33, 1, -1, new sbyte[] {96}), /* NxS[ 96] */ new Table(34, 1, -1, new sbyte[] {97}), /* NxS[ 97] */ new Table(35, 1, -1, new sbyte[] {98}), -/* NxS[ 98] */ new Table(22, 1, -1, new sbyte[] {99}), -/* NxS[ 99] */ new Table(22, 1, -1, new sbyte[] {39}), -/* NxS[ 100] */ new Table(45, 4, 100, new sbyte[] {53, 100, 100, -1}), -/* NxS[ 101] */ new Table(0, 7, 101, new sbyte[] {-1, 101, 54, 101, 101, 101, +/* NxS[ 98] */ new Table(36, 1, -1, new sbyte[] {99}), +/* NxS[ 99] */ new Table(23, 1, -1, new sbyte[] {100}), +/* NxS[ 100] */ new Table(23, 1, -1, new sbyte[] {40}), +/* NxS[ 101] */ new Table(46, 4, 101, new sbyte[] {54, 101, 101, -1}), +/* NxS[ 102] */ new Table(0, 7, 102, new sbyte[] {-1, 102, 55, 102, 102, 102, -1}), -/* NxS[ 102] */ new Table(2, 1, 57, new sbyte[] {58}), -/* NxS[ 103] */ new Table(8, 1, 59, new sbyte[] {60}), -/* NxS[ 104] */ new Table(0, 0, -1, null), -/* NxS[ 105] */ new Table(1, 3, 62, new sbyte[] {63, 62, 64}), -/* NxS[ 106] */ new Table(0, 7, 106, new sbyte[] {-1, 106, 65, 106, 106, 106, +/* NxS[ 103] */ new Table(2, 1, 58, new sbyte[] {59}), +/* NxS[ 104] */ new Table(8, 1, 60, new sbyte[] {61}), +/* NxS[ 105] */ new Table(0, 0, -1, null), +/* NxS[ 106] */ new Table(1, 3, 63, new sbyte[] {64, 63, 65}), +/* NxS[ 107] */ new Table(0, 7, 107, new sbyte[] {-1, 107, 66, 107, 107, 107, -1}), }; @@ -1318,7 +1325,7 @@ int NextState() { unchecked { int rslt; int idx = Map(code) - NxS[state].min; - if (idx < 0) idx += 48; + if (idx < 0) idx += 49; if ((uint)idx >= (uint)NxS[state].rng) rslt = NxS[state].dflt; else rslt = NxS[state].nxt[idx]; return rslt; @@ -1743,9 +1750,9 @@ yylval = new Union(); yylval.op = new op_type_node(Operators.Division); return ( break; case 2: case 4: - case 23: - case 27: + case 24: case 28: + case 29: parsertools.AddErrorFromResource("UNEXPECTED_SYMBOL{0}",CurrentLexLocation, yytext); return -1; break; @@ -1786,33 +1793,36 @@ return (int)Tokens.tkSquareClose; return (int)Tokens.tkQuestion; break; case 16: -yylval = new Union(); yylval.op = new op_type_node(Operators.AddressOf); return (int)Tokens.tkAddressOf; +return (int)Tokens.tkUnderscore; break; case 17: -yylval = new Union(); yylval.op = new op_type_node(Operators.Equal); return (int)Tokens.tkEqual; +yylval = new Union(); yylval.op = new op_type_node(Operators.AddressOf); return (int)Tokens.tkAddressOf; break; case 18: -yylval = new Union(); yylval.op = new op_type_node(Operators.Plus); return (int)Tokens.tkPlus; +yylval = new Union(); yylval.op = new op_type_node(Operators.Equal); return (int)Tokens.tkEqual; break; case 19: -yylval = new Union(); yylval.op = new op_type_node(Operators.Minus); return (int)Tokens.tkMinus; +yylval = new Union(); yylval.op = new op_type_node(Operators.Plus); return (int)Tokens.tkPlus; break; case 20: -yylval = new Union(); yylval.op = new op_type_node(Operators.Greater); return (int)Tokens.tkGreater; +yylval = new Union(); yylval.op = new op_type_node(Operators.Minus); return (int)Tokens.tkMinus; break; case 21: -yylval = new Union(); yylval.op = new op_type_node(Operators.Less); return (int)Tokens.tkLower; +yylval = new Union(); yylval.op = new op_type_node(Operators.Greater); return (int)Tokens.tkGreater; break; case 22: +yylval = new Union(); yylval.op = new op_type_node(Operators.Less); return (int)Tokens.tkLower; + break; + case 23: yylval = new Union(); yylval.op = new op_type_node(Operators.Deref); return (int)Tokens.tkDeref; break; - case 24: + case 25: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.ex = parsertools.create_int_const(yytext,currentLexLocation); return (int)Tokens.tkInteger; break; - case 25: + case 26: string cur_yytext = yytext; int res = Keywords.KeywordOrIDToken(cur_yytext); currentLexLocation = CurrentLexLocation; @@ -2014,100 +2024,100 @@ string cur_yytext = yytext; } return res; break; - case 26: + case 27: return (int)Tokens.INVISIBLE; break; - case 29: -yylval = new Union(); - currentLexLocation = CurrentLexLocation; - yylval.stn = parsertools.create_sharp_char_const(yytext,currentLexLocation); - return (int)Tokens.tkAsciiChar; - break; case 30: yylval = new Union(); yylval.id = new ident(yytext,CurrentLexLocation); return (int)Tokens.tkDirectiveName; break; case 31: +yylval = new Union(); + currentLexLocation = CurrentLexLocation; + yylval.stn = parsertools.create_sharp_char_const(yytext,currentLexLocation); + return (int)Tokens.tkAsciiChar; + break; + case 32: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.stn = parsertools.create_string_const(yytext,currentLexLocation); return (int)Tokens.tkStringLiteral; break; - case 32: case 33: + case 34: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.ex = parsertools.create_double_const(yytext,currentLexLocation); return (int)Tokens.tkFloat; break; - case 34: -yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; - break; case 35: -yylval = new Union(); yylval.op = new op_type_node(Operators.LessEqual); return (int)Tokens.tkLowerEqual; +yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; break; case 36: -yylval = new Union(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.tkNotEqual; +yylval = new Union(); yylval.op = new op_type_node(Operators.LessEqual); return (int)Tokens.tkLowerEqual; break; case 37: -return (int)Tokens.tkParseModeType; +yylval = new Union(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.tkNotEqual; break; case 38: -return (int)Tokens.tkParseModeStatement; +return (int)Tokens.tkParseModeType; break; case 39: -return (int)Tokens.tkParseModeExpression; +return (int)Tokens.tkParseModeStatement; break; case 40: -yylval = new Union(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.tkGreaterEqual; +return (int)Tokens.tkParseModeExpression; break; case 41: -yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.tkMinusEqual; +yylval = new Union(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.tkGreaterEqual; break; case 42: -yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; +yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.tkMinusEqual; break; case 43: -yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual; +yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; break; case 44: -return (int)Tokens.tkQuestionPoint; +yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual; break; case 45: -return (int)Tokens.tkQuestionSquareOpen; +return (int)Tokens.tkQuestionPoint; break; case 46: -return (int)Tokens.tkDoubleQuestion; +return (int)Tokens.tkQuestionSquareOpen; break; case 47: -return (int)Tokens.tkDotDot; +return (int)Tokens.tkDoubleQuestion; break; case 48: -yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; +return (int)Tokens.tkDotDot; break; case 49: -yylval = new Union(); yylval.op = new op_type_node(Operators.Power); return (int)Tokens.tkStarStar; +yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; break; case 50: -yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual; +yylval = new Union(); yylval.op = new op_type_node(Operators.Power); return (int)Tokens.tkStarStar; break; case 51: -BEGIN(COMMENT1); +yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual; break; case 52: +BEGIN(COMMENT1); + break; + case 53: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation); return (int)Tokens.tkHex; break; - case 53: + case 54: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.stn = parsertools.create_format_string_const(yytext,currentLexLocation); return (int)Tokens.tkFormatStringLiteral; break; - case 54: + case 55: if (parsertools.build_tree_for_formatter) break; @@ -2163,36 +2173,36 @@ if (parsertools.build_tree_for_formatter) Defines.Remove(directiveparam); } break; - case 55: + case 56: { } break; - case 56: + case 57: yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual; break; - case 57: + case 58: { } break; - case 58: -BEGIN(INITIAL); - break; case 59: - case 60: -{ -} - break; - case 61: BEGIN(INITIAL); break; - case 62: - case 63: - case 64: + case 60: + case 61: { } break; + case 62: +BEGIN(INITIAL); + break; + case 63: + case 64: case 65: +{ +} + break; + case 66: parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam); parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE! if (directivename == "IFDEF") @@ -2224,7 +2234,7 @@ parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam); BEGIN(INITIAL); } break; - case 66: + case 67: { } diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex index e3ed62dfd..10231aee0 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex @@ -191,6 +191,7 @@ UNICODEARROW \x890 "[" { return (int)Tokens.tkSquareOpen; } "]" { return (int)Tokens.tkSquareClose; } "?" { return (int)Tokens.tkQuestion; } +"_" { return (int)Tokens.tkUnderscore; } "?." { return (int)Tokens.tkQuestionPoint; } "??" { return (int)Tokens.tkDoubleQuestion; } "?[" { return (int)Tokens.tkQuestionSquareOpen; } diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index d4c0639bc..a3b303200 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -32,7 +32,7 @@ %start parse_goal -%token tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkQuestionPoint tkDoubleQuestion tkQuestionSquareOpen +%token tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkUnderscore tkQuestionPoint tkDoubleQuestion tkQuestionSquareOpen %token tkSizeOf tkTypeOf tkWhere tkArray tkCase tkClass tkAuto tkStatic tkConst tkConstructor tkDestructor tkElse tkExcept tkFile tkFor tkForeach tkFunction tkMatch tkWhen %token tkIf tkImplementation tkInherited tkInterface tkProcedure tkOperator tkProperty tkRaise tkRecord tkSet tkType tkThen tkUses tkVar tkWhile tkWith tkNil %token tkGoto tkOf tkLabel tkLock tkProgram tkEvent tkDefault tkTemplate tkPacked tkExports tkResourceString tkThreadvar tkSealed tkPartial tkTo tkDownto @@ -146,7 +146,7 @@ %type simple_property_definition %type stmt_or_expression unlabelled_stmt stmt case_item %type set_type -%type as_is_expr as_is_constexpr is_expr as_expr power_expr power_constexpr +%type as_is_expr as_is_constexpr is_type_expr as_expr power_expr power_constexpr %type unsized_array_type simple_type_or_ simple_type simple_type_question/*array_name_for_new_expr*/ foreach_stmt_ident_dype_opt fptype type_ref fptype_noproctype array_type %type template_param template_empty_param structured_type unpacked_structured_type empty_template_type_reference simple_or_template_type_reference type_ref_or_secific for_stmt_decl_or_assign type_decl_type %type type_ref_and_secific_list @@ -175,8 +175,10 @@ %type full_lambda_fp_list lambda_simple_fp_sect lambda_function_body lambda_procedure_body common_lambda_body optional_full_lambda_fp_list %type field_in_unnamed_object list_fields_in_unnamed_object func_class_name_ident_list rem_lambda variable_list var_ident_list %type tkAssignOrEqual -%type pattern pattern_optional_var match_with pattern_case pattern_cases pattern_out_param pattern_out_param_optional_var -%type pattern_out_param_list pattern_out_param_list_optional_var +%type pattern pattern_optional_var const_pattern collection_pattern tuple_pattern collection_pattern_list_item tuple_pattern_item collection_pattern_var_item match_with pattern_case pattern_cases pattern_out_param pattern_out_param_optional_var const_pattern_expr_list +%type pattern_out_param_list pattern_out_param_list_optional_var collection_pattern_expr_list tuple_pattern_item_list +%type const_pattern_expression + %% parse_goal @@ -2806,6 +2808,22 @@ pattern_case { $$ = new pattern_case($1 as pattern_node, $3 as statement, null, @$); } + | const_pattern tkWhen expr_l1 tkColon unlabelled_stmt + { + $$ = new pattern_case($1 as pattern_node, $5 as statement, $3, @$); + } + | const_pattern tkColon unlabelled_stmt + { + $$ = new pattern_case($1 as pattern_node, $3 as statement, null, @$); + } + | collection_pattern tkColon unlabelled_stmt + { + $$ = new pattern_case($1 as pattern_node, $3 as statement, null, @$); + } + | tuple_pattern tkColon unlabelled_stmt + { + $$ = new pattern_case($1 as pattern_node, $3 as statement, null, @$); + } ; case_stmt @@ -3282,44 +3300,188 @@ relop_expr { $$ = new bin_expr($1, $3, $2.type, @$); } - | is_expr tkRoundOpen pattern_out_param_list tkRoundClose + | is_type_expr tkRoundOpen pattern_out_param_list tkRoundClose { var isTypeCheck = $1 as typecast_node; - var deconstructorPattern = new deconstructor_pattern($3 as List, isTypeCheck.type_def, @$); + var deconstructorPattern = new deconstructor_pattern($3 as List, isTypeCheck.type_def, null, @$); $$ = new is_pattern_expr(isTypeCheck.expr, deconstructorPattern, @$); } + + | term tkIs collection_pattern + { + $$ = new is_pattern_expr($1, $3 as pattern_node, @$); + } + | term tkIs tuple_pattern + { + $$ = new is_pattern_expr($1, $3 as pattern_node, @$); + } ; pattern : simple_or_template_type_reference tkRoundOpen pattern_out_param_list tkRoundClose { - $$ = new deconstructor_pattern($3 as List, $1, @$); + $$ = new deconstructor_pattern($3 as List, $1, null, @$); } ; pattern_optional_var : simple_or_template_type_reference tkRoundOpen pattern_out_param_list_optional_var tkRoundClose { - $$ = new deconstructor_pattern($3 as List, $1, @$); + $$ = new deconstructor_pattern($3 as List, $1, null, @$); } - ; + ; + +collection_pattern + : tkSquareOpen collection_pattern_expr_list tkSquareClose + { + $$ = new collection_pattern($2 as List, @$); + } + ; + +collection_pattern_expr_list + : collection_pattern_list_item + { + $$ = new List(); + ($$ as List).Add($1 as pattern_parameter); + } + | collection_pattern_expr_list tkComma collection_pattern_list_item + { + var list = $1 as List; + list.Add($3 as pattern_parameter); + $$ = list; + } + ; + +collection_pattern_list_item + : literal_or_number + { + $$ = new const_pattern_parameter($1, @$); + } + | collection_pattern_var_item + { + $$ = $1; + } + | tkUnderscore + { + $$ = new collection_pattern_wild_card(@$); + } + /*| pattern + { + $$ = new recursive_deconstructor_parameter($1 as pattern_node, @$); + }*/ + | pattern_optional_var + { + $$ = new recursive_deconstructor_parameter($1 as pattern_node, @$); + } + | collection_pattern + { + $$ = new recursive_collection_parameter($1 as pattern_node, @$); + } + | tuple_pattern + { + $$ = new recursive_tuple_parameter($1 as pattern_node, @$); + } + | tkDotDot + { + $$ = new collection_pattern_gap_parameter(@$); + } + ; + +collection_pattern_var_item + : tkVar identifier + { + $$ = new collection_pattern_var_parameter($2, null, @$); + } + ; + +const_pattern + : const_pattern_expr_list + { + $$ = new const_pattern($1 as expression_list, @$); + } + ; + +const_pattern_expr_list + : const_pattern_expression + { + $$ = new expression_list($1, @$); + } + | const_pattern_expr_list tkComma const_pattern_expression + { + $$ = ($1 as expression_list).Add($3, @$); + } + ; + +const_pattern_expression + : literal_or_number { $$ = $1; } + ; +tuple_pattern + : tkRoundOpen tuple_pattern_item_list tkRoundClose + { + if (($2 as List).Count>6) + parsertools.AddErrorFromResource("TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7",@$); + $$ = new tuple_pattern($2 as List, @$); + } + ; + +tuple_pattern_item + : tkUnderscore + { + $$ = new tuple_pattern_wild_card(@$); + } + | literal_or_number + { + $$ = new const_pattern_parameter($1, @$); + } + | tkVar identifier + { + $$ = new tuple_pattern_var_parameter($2, null, @$); + } + | pattern_optional_var + { + $$ = new recursive_deconstructor_parameter($1 as pattern_node, @$); + } + | collection_pattern + { + $$ = new recursive_collection_parameter($1 as pattern_node, @$); + } + | tuple_pattern + { + $$ = new recursive_tuple_parameter($1 as pattern_node, @$); + } + ; + +tuple_pattern_item_list + : tuple_pattern_item + { + $$ = new List(); + ($$ as List).Add($1 as pattern_parameter); + } + | tuple_pattern_item_list tkComma tuple_pattern_item + { + var list = $1 as List; + list.Add($3 as pattern_parameter); + $$ = list; + } + ; + pattern_out_param_list_optional_var : pattern_out_param_optional_var { - $$ = new List(); - ($$ as List).Add($1 as pattern_deconstructor_parameter); + $$ = new List(); + ($$ as List).Add($1 as pattern_parameter); } | pattern_out_param_list_optional_var tkSemiColon pattern_out_param_optional_var { - var list = $1 as List; - list.Add($3 as pattern_deconstructor_parameter); + var list = $1 as List; + list.Add($3 as pattern_parameter); $$ = list; } | pattern_out_param_list_optional_var tkComma pattern_out_param_optional_var { - var list = $1 as List; - list.Add($3 as pattern_deconstructor_parameter); + var list = $1 as List; + list.Add($3 as pattern_parameter); $$ = list; } ; @@ -3327,59 +3489,91 @@ pattern_out_param_list_optional_var pattern_out_param_list : pattern_out_param { - $$ = new List(); - ($$ as List).Add($1 as pattern_deconstructor_parameter); + $$ = new List(); + ($$ as List).Add($1 as pattern_parameter); } | pattern_out_param_list tkSemiColon pattern_out_param { - var list = $1 as List; - list.Add($3 as pattern_deconstructor_parameter); + var list = $1 as List; + list.Add($3 as pattern_parameter); $$ = list; } | pattern_out_param_list tkComma pattern_out_param { - var list = $1 as List; - list.Add($3 as pattern_deconstructor_parameter); + var list = $1 as List; + list.Add($3 as pattern_parameter); $$ = list; } ; pattern_out_param - : tkVar identifier tkColon type_ref + : tkUnderscore + { + $$ = new wild_card_deconstructor_parameter(@$); + } + | literal_or_number + { + $$ = new const_pattern_parameter($1, @$); + } + | tkVar identifier tkColon type_ref { - $$ = new var_deconstructor_parameter($2, $4, @$); + $$ = new var_deconstructor_parameter($2, $4, true, @$); } | tkVar identifier { - $$ = new var_deconstructor_parameter($2, null, @$); + $$ = new var_deconstructor_parameter($2, null, true, @$); } | pattern { $$ = new recursive_deconstructor_parameter($1 as pattern_node, @$); } + | collection_pattern + { + $$ = new recursive_collection_parameter($1 as pattern_node, @$); + } + | tuple_pattern + { + $$ = new recursive_tuple_parameter($1 as pattern_node, @$); + } ; pattern_out_param_optional_var - : identifier tkColon type_ref + : tkUnderscore + { + $$ = new wild_card_deconstructor_parameter(@$); + } + | literal_or_number + { + $$ = new const_pattern_parameter($1, @$); + } + | identifier tkColon type_ref { - $$ = new var_deconstructor_parameter($1, $3, @$); + $$ = new var_deconstructor_parameter($1, $3, false, @$); } | identifier { - $$ = new var_deconstructor_parameter($1, null, @$); + $$ = new var_deconstructor_parameter($1, null, false, @$); } | tkVar identifier tkColon type_ref { - $$ = new var_deconstructor_parameter($2, $4, @$); + $$ = new var_deconstructor_parameter($2, $4, true, @$); } | tkVar identifier { - $$ = new var_deconstructor_parameter($2, null, @$); + $$ = new var_deconstructor_parameter($2, null, true, @$); } | pattern_optional_var { $$ = new recursive_deconstructor_parameter($1 as pattern_node, @$); } + | collection_pattern + { + $$ = new recursive_collection_parameter($1 as pattern_node, @$); + } + | tuple_pattern + { + $$ = new recursive_tuple_parameter($1 as pattern_node, @$); + } ; simple_expr_or_nothing @@ -3494,7 +3688,7 @@ typecast_op ; as_is_expr - : is_expr + : is_type_expr { $$ = $1; } | as_expr { $$ = $1; } @@ -3507,7 +3701,7 @@ as_expr } ; -is_expr +is_type_expr : term tkIs simple_or_template_type_reference { $$ = NewAsIsExpr($1, op_typecast.is_op, $3, @$); diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 21722e329..c687a9143 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -1,9 +1,9 @@ // (see accompanying GPPGcopyright.rtf) // GPPG version 1.3.6 -// Machine: IVAN-PC -// DateTime: 22.03.2019 13:45:37 -// UserName: Ivan +// Machine: DESKTOP-IF20NRO +// DateTime: 5/23/2019 12:28:25 PM +// UserName: FatCow // Input file // options: no-lines gplex @@ -25,29 +25,29 @@ namespace GPPGParserScanner public enum Tokens { error=1,EOF=2,tkDirectiveName=3,tkAmpersend=4,tkColon=5,tkDotDot=6, tkPoint=7,tkRoundOpen=8,tkRoundClose=9,tkSemiColon=10,tkSquareOpen=11,tkSquareClose=12, - tkQuestion=13,tkQuestionPoint=14,tkDoubleQuestion=15,tkQuestionSquareOpen=16,tkSizeOf=17,tkTypeOf=18, - tkWhere=19,tkArray=20,tkCase=21,tkClass=22,tkAuto=23,tkStatic=24, - tkConst=25,tkConstructor=26,tkDestructor=27,tkElse=28,tkExcept=29,tkFile=30, - tkFor=31,tkForeach=32,tkFunction=33,tkMatch=34,tkWhen=35,tkIf=36, - tkImplementation=37,tkInherited=38,tkInterface=39,tkProcedure=40,tkOperator=41,tkProperty=42, - tkRaise=43,tkRecord=44,tkSet=45,tkType=46,tkThen=47,tkUses=48, - tkVar=49,tkWhile=50,tkWith=51,tkNil=52,tkGoto=53,tkOf=54, - tkLabel=55,tkLock=56,tkProgram=57,tkEvent=58,tkDefault=59,tkTemplate=60, - tkPacked=61,tkExports=62,tkResourceString=63,tkThreadvar=64,tkSealed=65,tkPartial=66, - tkTo=67,tkDownto=68,tkLoop=69,tkSequence=70,tkYield=71,tkNew=72, - tkOn=73,tkName=74,tkPrivate=75,tkProtected=76,tkPublic=77,tkInternal=78, - tkRead=79,tkWrite=80,tkParseModeExpression=81,tkParseModeStatement=82,tkParseModeType=83,tkBegin=84, - tkEnd=85,tkAsmBody=86,tkILCode=87,tkError=88,INVISIBLE=89,tkRepeat=90, - tkUntil=91,tkDo=92,tkComma=93,tkFinally=94,tkTry=95,tkInitialization=96, - tkFinalization=97,tkUnit=98,tkLibrary=99,tkExternal=100,tkParams=101,tkNamespace=102, - tkAssign=103,tkPlusEqual=104,tkMinusEqual=105,tkMultEqual=106,tkDivEqual=107,tkMinus=108, - tkPlus=109,tkSlash=110,tkStar=111,tkStarStar=112,tkEqual=113,tkGreater=114, - tkGreaterEqual=115,tkLower=116,tkLowerEqual=117,tkNotEqual=118,tkCSharpStyleOr=119,tkArrow=120, - tkOr=121,tkXor=122,tkAnd=123,tkDiv=124,tkMod=125,tkShl=126, - tkShr=127,tkNot=128,tkAs=129,tkIn=130,tkIs=131,tkImplicit=132, - tkExplicit=133,tkAddressOf=134,tkDeref=135,tkIdentifier=136,tkStringLiteral=137,tkFormatStringLiteral=138, - tkAsciiChar=139,tkAbstract=140,tkForward=141,tkOverload=142,tkReintroduce=143,tkOverride=144, - tkVirtual=145,tkExtensionMethod=146,tkInteger=147,tkFloat=148,tkHex=149}; + tkQuestion=13,tkUnderscore=14,tkQuestionPoint=15,tkDoubleQuestion=16,tkQuestionSquareOpen=17,tkSizeOf=18, + tkTypeOf=19,tkWhere=20,tkArray=21,tkCase=22,tkClass=23,tkAuto=24, + tkStatic=25,tkConst=26,tkConstructor=27,tkDestructor=28,tkElse=29,tkExcept=30, + tkFile=31,tkFor=32,tkForeach=33,tkFunction=34,tkMatch=35,tkWhen=36, + tkIf=37,tkImplementation=38,tkInherited=39,tkInterface=40,tkProcedure=41,tkOperator=42, + tkProperty=43,tkRaise=44,tkRecord=45,tkSet=46,tkType=47,tkThen=48, + tkUses=49,tkVar=50,tkWhile=51,tkWith=52,tkNil=53,tkGoto=54, + tkOf=55,tkLabel=56,tkLock=57,tkProgram=58,tkEvent=59,tkDefault=60, + tkTemplate=61,tkPacked=62,tkExports=63,tkResourceString=64,tkThreadvar=65,tkSealed=66, + tkPartial=67,tkTo=68,tkDownto=69,tkLoop=70,tkSequence=71,tkYield=72, + tkNew=73,tkOn=74,tkName=75,tkPrivate=76,tkProtected=77,tkPublic=78, + tkInternal=79,tkRead=80,tkWrite=81,tkParseModeExpression=82,tkParseModeStatement=83,tkParseModeType=84, + tkBegin=85,tkEnd=86,tkAsmBody=87,tkILCode=88,tkError=89,INVISIBLE=90, + tkRepeat=91,tkUntil=92,tkDo=93,tkComma=94,tkFinally=95,tkTry=96, + tkInitialization=97,tkFinalization=98,tkUnit=99,tkLibrary=100,tkExternal=101,tkParams=102, + tkNamespace=103,tkAssign=104,tkPlusEqual=105,tkMinusEqual=106,tkMultEqual=107,tkDivEqual=108, + tkMinus=109,tkPlus=110,tkSlash=111,tkStar=112,tkStarStar=113,tkEqual=114, + tkGreater=115,tkGreaterEqual=116,tkLower=117,tkLowerEqual=118,tkNotEqual=119,tkCSharpStyleOr=120, + tkArrow=121,tkOr=122,tkXor=123,tkAnd=124,tkDiv=125,tkMod=126, + tkShl=127,tkShr=128,tkNot=129,tkAs=130,tkIn=131,tkIs=132, + tkImplicit=133,tkExplicit=134,tkAddressOf=135,tkDeref=136,tkIdentifier=137,tkStringLiteral=138, + tkFormatStringLiteral=139,tkAsciiChar=140,tkAbstract=141,tkForward=142,tkOverload=143,tkReintroduce=144, + tkOverride=145,tkVirtual=146,tkExtensionMethod=147,tkInteger=148,tkFloat=149,tkHex=150}; // Abstract base class for GPLEX scanners public abstract class ScanBase : AbstractScanner { @@ -75,8 +75,8 @@ public partial class GPPGParser: ShiftReduceParser aliasses; #pragma warning restore 649 - private static Rule[] rules = new Rule[900]; - private static State[] states = new State[1492]; + private static Rule[] rules = new Rule[938]; + private static State[] states = new State[1550]; private static string[] nonTerms = new string[] { "parse_goal", "unit_key_word", "class_or_static", "assignment", "optional_array_initializer", "attribute_declarations", "ot_visibility_specifier", "one_attribute", "attribute_variable", @@ -138,248 +138,252 @@ public partial class GPPGParser: ShiftReduceParser tkCase, expr_l1, tkOf, case_list, else_case, tkEnd + case 523: // pattern_case -> const_pattern, tkWhen, expr_l1, tkColon, unlabelled_stmt +{ + CurrentSemanticValue.stn = new pattern_case(ValueStack[ValueStack.Depth-5].stn as pattern_node, ValueStack[ValueStack.Depth-1].stn as statement, ValueStack[ValueStack.Depth-3].ex, CurrentLocationSpan); + } + break; + case 524: // pattern_case -> const_pattern, tkColon, unlabelled_stmt +{ + CurrentSemanticValue.stn = new pattern_case(ValueStack[ValueStack.Depth-3].stn as pattern_node, ValueStack[ValueStack.Depth-1].stn as statement, null, CurrentLocationSpan); + } + break; + case 525: // pattern_case -> collection_pattern, tkColon, unlabelled_stmt +{ + CurrentSemanticValue.stn = new pattern_case(ValueStack[ValueStack.Depth-3].stn as pattern_node, ValueStack[ValueStack.Depth-1].stn as statement, null, CurrentLocationSpan); + } + break; + case 526: // pattern_case -> tuple_pattern, tkColon, unlabelled_stmt +{ + CurrentSemanticValue.stn = new pattern_case(ValueStack[ValueStack.Depth-3].stn as pattern_node, ValueStack[ValueStack.Depth-1].stn as statement, null, CurrentLocationSpan); + } + break; + case 527: // case_stmt -> tkCase, expr_l1, tkOf, case_list, else_case, tkEnd { CurrentSemanticValue.stn = new case_node(ValueStack[ValueStack.Depth-5].ex, ValueStack[ValueStack.Depth-3].stn as case_variants, ValueStack[ValueStack.Depth-2].stn as statement, CurrentLocationSpan); } break; - case 524: // case_stmt -> tkCase, expr_l1, tkOf, case_list, tkSemiColon, else_case, tkEnd + case 528: // case_stmt -> tkCase, expr_l1, tkOf, case_list, tkSemiColon, else_case, tkEnd { CurrentSemanticValue.stn = new case_node(ValueStack[ValueStack.Depth-6].ex, ValueStack[ValueStack.Depth-4].stn as case_variants, ValueStack[ValueStack.Depth-2].stn as statement, CurrentLocationSpan); } break; - case 525: // case_stmt -> tkCase, expr_l1, tkOf, else_case, tkEnd + case 529: // case_stmt -> tkCase, expr_l1, tkOf, else_case, tkEnd { CurrentSemanticValue.stn = new case_node(ValueStack[ValueStack.Depth-4].ex, NewCaseItem(new empty_statement(), null), ValueStack[ValueStack.Depth-2].stn as statement, CurrentLocationSpan); } break; - case 526: // case_list -> case_item + case 530: // case_list -> case_item { if (ValueStack[ValueStack.Depth-1].stn is empty_statement) CurrentSemanticValue.stn = NewCaseItem(ValueStack[ValueStack.Depth-1].stn, null); else CurrentSemanticValue.stn = NewCaseItem(ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 527: // case_list -> case_list, tkSemiColon, case_item + case 531: // case_list -> case_list, tkSemiColon, case_item { CurrentSemanticValue.stn = AddCaseItem(ValueStack[ValueStack.Depth-3].stn as case_variants, ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 528: // case_item -> case_label_list, tkColon, unlabelled_stmt + case 532: // case_item -> case_label_list, tkColon, unlabelled_stmt { CurrentSemanticValue.stn = new case_variant(ValueStack[ValueStack.Depth-3].stn as expression_list, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 529: // case_label_list -> case_label + case 533: // case_label_list -> case_label { CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 530: // case_label_list -> case_label_list, tkComma, case_label + case 534: // case_label_list -> case_label_list, tkComma, case_label { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 531: // case_label -> const_elem + case 535: // case_label -> const_elem { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 532: // else_case -> /* empty */ + case 536: // else_case -> /* empty */ { CurrentSemanticValue.stn = null;} break; - case 533: // else_case -> tkElse, stmt_list + case 537: // else_case -> tkElse, stmt_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 534: // repeat_stmt -> tkRepeat, stmt_list, tkUntil, expr + case 538: // repeat_stmt -> tkRepeat, stmt_list, tkUntil, expr { CurrentSemanticValue.stn = new repeat_node(ValueStack[ValueStack.Depth-3].stn as statement_list, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); (ValueStack[ValueStack.Depth-3].stn as statement_list).left_logical_bracket = ValueStack[ValueStack.Depth-4].ti; @@ -5113,23 +5233,23 @@ public partial class GPPGParser: ShiftReduceParser tkWhile, expr_l1, optional_tk_do, unlabelled_stmt + case 539: // while_stmt -> tkWhile, expr_l1, optional_tk_do, unlabelled_stmt { CurrentSemanticValue.stn = NewWhileStmt(ValueStack[ValueStack.Depth-4].ti, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-2].ti, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 536: // optional_tk_do -> tkDo + case 540: // optional_tk_do -> tkDo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 537: // optional_tk_do -> /* empty */ + case 541: // optional_tk_do -> /* empty */ { CurrentSemanticValue.ti = null; } break; - case 538: // lock_stmt -> tkLock, expr_l1, tkDo, unlabelled_stmt + case 542: // lock_stmt -> tkLock, expr_l1, tkDo, unlabelled_stmt { CurrentSemanticValue.stn = new lock_stmt(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 539: // foreach_stmt -> tkForeach, identifier, foreach_stmt_ident_dype_opt, tkIn, + case 543: // foreach_stmt -> tkForeach, identifier, foreach_stmt_ident_dype_opt, tkIn, // expr_l1, tkDo, unlabelled_stmt { CurrentSemanticValue.stn = new foreach_stmt(ValueStack[ValueStack.Depth-6].id, ValueStack[ValueStack.Depth-5].td, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); @@ -5137,68 +5257,68 @@ public partial class GPPGParser: ShiftReduceParser tkForeach, tkVar, identifier, tkColon, type_ref, tkIn, expr_l1, + case 544: // foreach_stmt -> tkForeach, tkVar, identifier, tkColon, type_ref, tkIn, expr_l1, // tkDo, unlabelled_stmt { CurrentSemanticValue.stn = new foreach_stmt(ValueStack[ValueStack.Depth-7].id, ValueStack[ValueStack.Depth-5].td, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 541: // foreach_stmt -> tkForeach, tkVar, identifier, tkIn, expr_l1, tkDo, + case 545: // foreach_stmt -> tkForeach, tkVar, identifier, tkIn, expr_l1, tkDo, // unlabelled_stmt { CurrentSemanticValue.stn = new foreach_stmt(ValueStack[ValueStack.Depth-5].id, new no_type_foreach(), ValueStack[ValueStack.Depth-3].ex, (statement)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 542: // foreach_stmt_ident_dype_opt -> tkColon, type_ref + case 546: // foreach_stmt_ident_dype_opt -> tkColon, type_ref { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 544: // for_stmt -> tkFor, optional_var, identifier, for_stmt_decl_or_assign, expr_l1, + case 548: // for_stmt -> tkFor, optional_var, identifier, for_stmt_decl_or_assign, expr_l1, // for_cycle_type, expr_l1, optional_tk_do, unlabelled_stmt { CurrentSemanticValue.stn = NewForStmt((bool)ValueStack[ValueStack.Depth-8].ob, ValueStack[ValueStack.Depth-7].id, ValueStack[ValueStack.Depth-6].td, ValueStack[ValueStack.Depth-5].ex, (for_cycle_type)ValueStack[ValueStack.Depth-4].ob, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-2].ti, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 545: // optional_var -> tkVar + case 549: // optional_var -> tkVar { CurrentSemanticValue.ob = true; } break; - case 546: // optional_var -> /* empty */ + case 550: // optional_var -> /* empty */ { CurrentSemanticValue.ob = false; } break; - case 548: // for_stmt_decl_or_assign -> tkColon, simple_type_identifier, tkAssign + case 552: // for_stmt_decl_or_assign -> tkColon, simple_type_identifier, tkAssign { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-2].td; } break; - case 549: // for_cycle_type -> tkTo + case 553: // for_cycle_type -> tkTo { CurrentSemanticValue.ob = for_cycle_type.to; } break; - case 550: // for_cycle_type -> tkDownto + case 554: // for_cycle_type -> tkDownto { CurrentSemanticValue.ob = for_cycle_type.downto; } break; - case 551: // with_stmt -> tkWith, expr_list, tkDo, unlabelled_stmt + case 555: // with_stmt -> tkWith, expr_list, tkDo, unlabelled_stmt { CurrentSemanticValue.stn = new with_statement(ValueStack[ValueStack.Depth-1].stn as statement, ValueStack[ValueStack.Depth-3].stn as expression_list, CurrentLocationSpan); } break; - case 552: // inherited_message -> tkInherited + case 556: // inherited_message -> tkInherited { CurrentSemanticValue.stn = new inherited_message(); CurrentSemanticValue.stn.source_context = CurrentLocationSpan; } break; - case 553: // try_stmt -> tkTry, stmt_list, try_handler + case 557: // try_stmt -> tkTry, stmt_list, try_handler { CurrentSemanticValue.stn = new try_stmt(ValueStack[ValueStack.Depth-2].stn as statement_list, ValueStack[ValueStack.Depth-1].stn as try_handler, CurrentLocationSpan); (ValueStack[ValueStack.Depth-2].stn as statement_list).left_logical_bracket = ValueStack[ValueStack.Depth-3].ti; ValueStack[ValueStack.Depth-2].stn.source_context = LocationStack[LocationStack.Depth-3].Merge(LocationStack[LocationStack.Depth-2]); } break; - case 554: // try_handler -> tkFinally, stmt_list, tkEnd + case 558: // try_handler -> tkFinally, stmt_list, tkEnd { CurrentSemanticValue.stn = new try_handler_finally(ValueStack[ValueStack.Depth-2].stn as statement_list, CurrentLocationSpan); (ValueStack[ValueStack.Depth-2].stn as statement_list).left_logical_bracket = ValueStack[ValueStack.Depth-3].ti; (ValueStack[ValueStack.Depth-2].stn as statement_list).right_logical_bracket = ValueStack[ValueStack.Depth-1].ti; } break; - case 555: // try_handler -> tkExcept, exception_block, tkEnd + case 559: // try_handler -> tkExcept, exception_block, tkEnd { CurrentSemanticValue.stn = new try_handler_except((exception_block)ValueStack[ValueStack.Depth-2].stn, CurrentLocationSpan); if ((ValueStack[ValueStack.Depth-2].stn as exception_block).stmt_list != null) @@ -5208,186 +5328,186 @@ public partial class GPPGParser: ShiftReduceParser exception_handler_list, exception_block_else_branch + case 560: // exception_block -> exception_handler_list, exception_block_else_branch { CurrentSemanticValue.stn = new exception_block(null, (exception_handler_list)ValueStack[ValueStack.Depth-2].stn, (statement_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 557: // exception_block -> exception_handler_list, tkSemiColon, + case 561: // exception_block -> exception_handler_list, tkSemiColon, // exception_block_else_branch { CurrentSemanticValue.stn = new exception_block(null, (exception_handler_list)ValueStack[ValueStack.Depth-3].stn, (statement_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 558: // exception_block -> stmt_list + case 562: // exception_block -> stmt_list { CurrentSemanticValue.stn = new exception_block(ValueStack[ValueStack.Depth-1].stn as statement_list, null, null, LocationStack[LocationStack.Depth-1]); } break; - case 559: // exception_handler_list -> exception_handler + case 563: // exception_handler_list -> exception_handler { CurrentSemanticValue.stn = new exception_handler_list(ValueStack[ValueStack.Depth-1].stn as exception_handler, CurrentLocationSpan); } break; - case 560: // exception_handler_list -> exception_handler_list, tkSemiColon, + case 564: // exception_handler_list -> exception_handler_list, tkSemiColon, // exception_handler { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as exception_handler_list).Add(ValueStack[ValueStack.Depth-1].stn as exception_handler, CurrentLocationSpan); } break; - case 561: // exception_block_else_branch -> /* empty */ + case 565: // exception_block_else_branch -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 562: // exception_block_else_branch -> tkElse, stmt_list + case 566: // exception_block_else_branch -> tkElse, stmt_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 563: // exception_handler -> tkOn, exception_identifier, tkDo, unlabelled_stmt + case 567: // exception_handler -> tkOn, exception_identifier, tkDo, unlabelled_stmt { CurrentSemanticValue.stn = new exception_handler((ValueStack[ValueStack.Depth-3].stn as exception_ident).variable, (ValueStack[ValueStack.Depth-3].stn as exception_ident).type_name, ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 564: // exception_identifier -> exception_class_type_identifier + case 568: // exception_identifier -> exception_class_type_identifier { CurrentSemanticValue.stn = new exception_ident(null, (named_type_reference)ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); } break; - case 565: // exception_identifier -> exception_variable, tkColon, + case 569: // exception_identifier -> exception_variable, tkColon, // exception_class_type_identifier { CurrentSemanticValue.stn = new exception_ident(ValueStack[ValueStack.Depth-3].id, (named_type_reference)ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); } break; - case 566: // exception_class_type_identifier -> simple_type_identifier + case 570: // exception_class_type_identifier -> simple_type_identifier { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 567: // exception_variable -> identifier + case 571: // exception_variable -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 568: // raise_stmt -> tkRaise + case 572: // raise_stmt -> tkRaise { CurrentSemanticValue.stn = new raise_stmt(); CurrentSemanticValue.stn.source_context = CurrentLocationSpan; } break; - case 569: // raise_stmt -> tkRaise, expr + case 573: // raise_stmt -> tkRaise, expr { CurrentSemanticValue.stn = new raise_stmt(ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 570: // expr_list -> expr_with_func_decl_lambda + case 574: // expr_list -> expr_with_func_decl_lambda { CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 571: // expr_list -> expr_list, tkComma, expr_with_func_decl_lambda + case 575: // expr_list -> expr_list, tkComma, expr_with_func_decl_lambda { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 572: // expr_as_stmt -> allowable_expr_as_stmt + case 576: // expr_as_stmt -> allowable_expr_as_stmt { CurrentSemanticValue.stn = new expression_as_statement(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 573: // allowable_expr_as_stmt -> new_expr + case 577: // allowable_expr_as_stmt -> new_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 574: // expr_with_func_decl_lambda -> expr + case 578: // expr_with_func_decl_lambda -> expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 575: // expr_with_func_decl_lambda -> func_decl_lambda + case 579: // expr_with_func_decl_lambda -> func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 576: // expr -> expr_l1 + case 580: // expr -> expr_l1 { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 577: // expr -> format_expr + case 581: // expr -> format_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 578: // expr_l1 -> expr_dq + case 582: // expr_l1 -> expr_dq { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 579: // expr_l1 -> question_expr + case 583: // expr_l1 -> question_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 580: // expr_l1_func_decl_lambda -> expr_l1 + case 584: // expr_l1_func_decl_lambda -> expr_l1 { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 581: // expr_l1_func_decl_lambda -> func_decl_lambda + case 585: // expr_l1_func_decl_lambda -> func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 582: // expr_dq -> relop_expr + case 586: // expr_dq -> relop_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 583: // expr_dq -> expr_dq, tkDoubleQuestion, relop_expr + case 587: // expr_dq -> expr_dq, tkDoubleQuestion, relop_expr { CurrentSemanticValue.ex = new double_question_node(ValueStack[ValueStack.Depth-3].ex as expression, ValueStack[ValueStack.Depth-1].ex as expression, CurrentLocationSpan);} break; - case 584: // sizeof_expr -> tkSizeOf, tkRoundOpen, simple_or_template_type_reference, + case 588: // sizeof_expr -> tkSizeOf, tkRoundOpen, simple_or_template_type_reference, // tkRoundClose { CurrentSemanticValue.ex = new sizeof_operator((named_type_reference)ValueStack[ValueStack.Depth-2].td, null, CurrentLocationSpan); } break; - case 585: // typeof_expr -> tkTypeOf, tkRoundOpen, simple_or_template_type_reference, + case 589: // typeof_expr -> tkTypeOf, tkRoundOpen, simple_or_template_type_reference, // tkRoundClose { CurrentSemanticValue.ex = new typeof_operator((named_type_reference)ValueStack[ValueStack.Depth-2].td, CurrentLocationSpan); } break; - case 586: // typeof_expr -> tkTypeOf, tkRoundOpen, empty_template_type_reference, + case 590: // typeof_expr -> tkTypeOf, tkRoundOpen, empty_template_type_reference, // tkRoundClose { CurrentSemanticValue.ex = new typeof_operator((named_type_reference)ValueStack[ValueStack.Depth-2].td, CurrentLocationSpan); } break; - case 587: // question_expr -> expr_l1, tkQuestion, expr_l1, tkColon, expr_l1 + case 591: // question_expr -> expr_l1, tkQuestion, expr_l1, tkColon, expr_l1 { if (ValueStack[ValueStack.Depth-3].ex is nil_const && ValueStack[ValueStack.Depth-1].ex is nil_const) parsertools.AddErrorFromResource("TWO_NILS_IN_QUESTION_EXPR",LocationStack[LocationStack.Depth-3]); CurrentSemanticValue.ex = new question_colon_expression(ValueStack[ValueStack.Depth-5].ex, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 588: // empty_template_type_reference -> simple_type_identifier, + case 592: // empty_template_type_reference -> simple_type_identifier, // template_type_empty_params { CurrentSemanticValue.td = new template_type_reference((named_type_reference)ValueStack[ValueStack.Depth-2].td, (template_param_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 589: // empty_template_type_reference -> simple_type_identifier, tkAmpersend, + case 593: // empty_template_type_reference -> simple_type_identifier, tkAmpersend, // template_type_empty_params { CurrentSemanticValue.td = new template_type_reference((named_type_reference)ValueStack[ValueStack.Depth-3].td, (template_param_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 590: // simple_or_template_type_reference -> simple_type_identifier + case 594: // simple_or_template_type_reference -> simple_type_identifier { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 591: // simple_or_template_type_reference -> simple_type_identifier, + case 595: // simple_or_template_type_reference -> simple_type_identifier, // template_type_params { CurrentSemanticValue.td = new template_type_reference((named_type_reference)ValueStack[ValueStack.Depth-2].td, (template_param_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 592: // simple_or_template_type_reference -> simple_type_identifier, tkAmpersend, + case 596: // simple_or_template_type_reference -> simple_type_identifier, tkAmpersend, // template_type_params { CurrentSemanticValue.td = new template_type_reference((named_type_reference)ValueStack[ValueStack.Depth-3].td, (template_param_list)ValueStack[ValueStack.Depth-1].stn, CurrentLocationSpan); } break; - case 593: // optional_array_initializer -> tkRoundOpen, typed_const_list, tkRoundClose + case 597: // optional_array_initializer -> tkRoundOpen, typed_const_list, tkRoundClose { CurrentSemanticValue.stn = new array_const((expression_list)ValueStack[ValueStack.Depth-2].stn, CurrentLocationSpan); } break; - case 595: // new_expr -> tkNew, simple_or_template_type_reference, + case 599: // new_expr -> tkNew, simple_or_template_type_reference, // optional_expr_list_with_bracket { CurrentSemanticValue.ex = new new_expr(ValueStack[ValueStack.Depth-2].td, ValueStack[ValueStack.Depth-1].stn as expression_list, false, null, CurrentLocationSpan); } break; - case 596: // new_expr -> tkNew, simple_or_template_type_reference, tkSquareOpen, + case 600: // new_expr -> tkNew, simple_or_template_type_reference, tkSquareOpen, // optional_expr_list, tkSquareClose, optional_array_initializer { var el = ValueStack[ValueStack.Depth-3].stn as expression_list; @@ -5403,7 +5523,7 @@ public partial class GPPGParser: ShiftReduceParser tkNew, tkClass, tkRoundOpen, list_fields_in_unnamed_object, + case 601: // new_expr -> tkNew, tkClass, tkRoundOpen, list_fields_in_unnamed_object, // tkRoundClose { // sugared node @@ -5418,14 +5538,14 @@ public partial class GPPGParser: ShiftReduceParser identifier, tkAssign, relop_expr + case 602: // field_in_unnamed_object -> identifier, tkAssign, relop_expr { if (ValueStack[ValueStack.Depth-1].ex is nil_const) parsertools.AddErrorFromResource("NIL_IN_UNNAMED_OBJECT",CurrentLocationSpan); CurrentSemanticValue.ob = new name_assign_expr(ValueStack[ValueStack.Depth-3].id,ValueStack[ValueStack.Depth-1].ex,CurrentLocationSpan); } break; - case 599: // field_in_unnamed_object -> relop_expr + case 603: // field_in_unnamed_object -> relop_expr { ident name = null; var id = ValueStack[ValueStack.Depth-1].ex as ident; @@ -5445,13 +5565,13 @@ public partial class GPPGParser: ShiftReduceParser field_in_unnamed_object + case 604: // list_fields_in_unnamed_object -> field_in_unnamed_object { var l = new name_assign_expr_list(); CurrentSemanticValue.ob = l.Add(ValueStack[ValueStack.Depth-1].ob as name_assign_expr); } break; - case 601: // list_fields_in_unnamed_object -> list_fields_in_unnamed_object, tkComma, + case 605: // list_fields_in_unnamed_object -> list_fields_in_unnamed_object, tkComma, // field_in_unnamed_object { var nel = ValueStack[ValueStack.Depth-3].ob as name_assign_expr_list; @@ -5462,309 +5582,487 @@ public partial class GPPGParser: ShiftReduceParser /* empty */ + case 606: // optional_expr_list_with_bracket -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 603: // optional_expr_list_with_bracket -> tkRoundOpen, optional_expr_list, + case 607: // optional_expr_list_with_bracket -> tkRoundOpen, optional_expr_list, // tkRoundClose { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-2].stn; } break; - case 604: // relop_expr -> simple_expr + case 608: // relop_expr -> simple_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 605: // relop_expr -> relop_expr, relop, simple_expr + case 609: // relop_expr -> relop_expr, relop, simple_expr { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 606: // relop_expr -> is_expr, tkRoundOpen, pattern_out_param_list, tkRoundClose + case 610: // relop_expr -> is_type_expr, tkRoundOpen, pattern_out_param_list, tkRoundClose { var isTypeCheck = ValueStack[ValueStack.Depth-4].ex as typecast_node; - var deconstructorPattern = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, isTypeCheck.type_def, CurrentLocationSpan); + var deconstructorPattern = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, isTypeCheck.type_def, null, CurrentLocationSpan); CurrentSemanticValue.ex = new is_pattern_expr(isTypeCheck.expr, deconstructorPattern, CurrentLocationSpan); } break; - case 607: // pattern -> simple_or_template_type_reference, tkRoundOpen, + case 611: // relop_expr -> term, tkIs, collection_pattern +{ + CurrentSemanticValue.ex = new is_pattern_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 612: // relop_expr -> term, tkIs, tuple_pattern +{ + CurrentSemanticValue.ex = new is_pattern_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 613: // pattern -> simple_or_template_type_reference, tkRoundOpen, // pattern_out_param_list, tkRoundClose { - CurrentSemanticValue.stn = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, ValueStack[ValueStack.Depth-4].td, CurrentLocationSpan); + CurrentSemanticValue.stn = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, ValueStack[ValueStack.Depth-4].td, null, CurrentLocationSpan); } break; - case 608: // pattern_optional_var -> simple_or_template_type_reference, tkRoundOpen, + case 614: // pattern_optional_var -> simple_or_template_type_reference, tkRoundOpen, // pattern_out_param_list_optional_var, tkRoundClose { - CurrentSemanticValue.stn = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, ValueStack[ValueStack.Depth-4].td, CurrentLocationSpan); + CurrentSemanticValue.stn = new deconstructor_pattern(ValueStack[ValueStack.Depth-2].ob as List, ValueStack[ValueStack.Depth-4].td, null, CurrentLocationSpan); } break; - case 609: // pattern_out_param_list_optional_var -> pattern_out_param_optional_var + case 615: // collection_pattern -> tkSquareOpen, collection_pattern_expr_list, tkSquareClose { - CurrentSemanticValue.ob = new List(); - (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + CurrentSemanticValue.stn = new collection_pattern(ValueStack[ValueStack.Depth-2].ob as List, CurrentLocationSpan); + } + break; + case 616: // collection_pattern_expr_list -> collection_pattern_list_item +{ + CurrentSemanticValue.ob = new List(); + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); + } + break; + case 617: // collection_pattern_expr_list -> collection_pattern_expr_list, tkComma, + // collection_pattern_list_item +{ + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); + CurrentSemanticValue.ob = list; + } + break; + case 618: // collection_pattern_list_item -> literal_or_number +{ + CurrentSemanticValue.stn = new const_pattern_parameter(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 619: // collection_pattern_list_item -> collection_pattern_var_item +{ + CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; + } + break; + case 620: // collection_pattern_list_item -> tkUnderscore +{ + CurrentSemanticValue.stn = new collection_pattern_wild_card(CurrentLocationSpan); + } + break; + case 621: // collection_pattern_list_item -> pattern_optional_var +{ + CurrentSemanticValue.stn = new recursive_deconstructor_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); } break; - case 610: // pattern_out_param_list_optional_var -> pattern_out_param_list_optional_var, + case 622: // collection_pattern_list_item -> collection_pattern +{ + CurrentSemanticValue.stn = new recursive_collection_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 623: // collection_pattern_list_item -> tuple_pattern +{ + CurrentSemanticValue.stn = new recursive_tuple_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 624: // collection_pattern_list_item -> tkDotDot +{ + CurrentSemanticValue.stn = new collection_pattern_gap_parameter(CurrentLocationSpan); + } + break; + case 625: // collection_pattern_var_item -> tkVar, identifier +{ + CurrentSemanticValue.stn = new collection_pattern_var_parameter(ValueStack[ValueStack.Depth-1].id, null, CurrentLocationSpan); + } + break; + case 626: // const_pattern -> const_pattern_expr_list +{ + CurrentSemanticValue.stn = new const_pattern(ValueStack[ValueStack.Depth-1].stn as expression_list, CurrentLocationSpan); + } + break; + case 627: // const_pattern_expr_list -> const_pattern_expression +{ + CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 628: // const_pattern_expr_list -> const_pattern_expr_list, tkComma, + // const_pattern_expression +{ + CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 629: // const_pattern_expression -> literal_or_number +{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } + break; + case 630: // tuple_pattern -> tkRoundOpen, tuple_pattern_item_list, tkRoundClose +{ + if ((ValueStack[ValueStack.Depth-2].ob as List).Count>6) + parsertools.AddErrorFromResource("TUPLE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7",CurrentLocationSpan); + CurrentSemanticValue.stn = new tuple_pattern(ValueStack[ValueStack.Depth-2].ob as List, CurrentLocationSpan); + } + break; + case 631: // tuple_pattern_item -> tkUnderscore +{ + CurrentSemanticValue.stn = new tuple_pattern_wild_card(CurrentLocationSpan); + } + break; + case 632: // tuple_pattern_item -> literal_or_number +{ + CurrentSemanticValue.stn = new const_pattern_parameter(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 633: // tuple_pattern_item -> tkVar, identifier +{ + CurrentSemanticValue.stn = new tuple_pattern_var_parameter(ValueStack[ValueStack.Depth-1].id, null, CurrentLocationSpan); + } + break; + case 634: // tuple_pattern_item -> pattern_optional_var +{ + CurrentSemanticValue.stn = new recursive_deconstructor_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 635: // tuple_pattern_item -> collection_pattern +{ + CurrentSemanticValue.stn = new recursive_collection_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 636: // tuple_pattern_item -> tuple_pattern +{ + CurrentSemanticValue.stn = new recursive_tuple_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 637: // tuple_pattern_item_list -> tuple_pattern_item +{ + CurrentSemanticValue.ob = new List(); + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); + } + break; + case 638: // tuple_pattern_item_list -> tuple_pattern_item_list, tkComma, tuple_pattern_item +{ + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); + CurrentSemanticValue.ob = list; + } + break; + case 639: // pattern_out_param_list_optional_var -> pattern_out_param_optional_var +{ + CurrentSemanticValue.ob = new List(); + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); + } + break; + case 640: // pattern_out_param_list_optional_var -> pattern_out_param_list_optional_var, // tkSemiColon, // pattern_out_param_optional_var { - var list = ValueStack[ValueStack.Depth-3].ob as List; - list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); CurrentSemanticValue.ob = list; } break; - case 611: // pattern_out_param_list_optional_var -> pattern_out_param_list_optional_var, + case 641: // pattern_out_param_list_optional_var -> pattern_out_param_list_optional_var, // tkComma, // pattern_out_param_optional_var { - var list = ValueStack[ValueStack.Depth-3].ob as List; - list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); CurrentSemanticValue.ob = list; } break; - case 612: // pattern_out_param_list -> pattern_out_param + case 642: // pattern_out_param_list -> pattern_out_param { - CurrentSemanticValue.ob = new List(); - (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + CurrentSemanticValue.ob = new List(); + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); } break; - case 613: // pattern_out_param_list -> pattern_out_param_list, tkSemiColon, + case 643: // pattern_out_param_list -> pattern_out_param_list, tkSemiColon, // pattern_out_param { - var list = ValueStack[ValueStack.Depth-3].ob as List; - list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); CurrentSemanticValue.ob = list; } break; - case 614: // pattern_out_param_list -> pattern_out_param_list, tkComma, pattern_out_param + case 644: // pattern_out_param_list -> pattern_out_param_list, tkComma, pattern_out_param { - var list = ValueStack[ValueStack.Depth-3].ob as List; - list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_deconstructor_parameter); + var list = ValueStack[ValueStack.Depth-3].ob as List; + list.Add(ValueStack[ValueStack.Depth-1].stn as pattern_parameter); CurrentSemanticValue.ob = list; } break; - case 615: // pattern_out_param -> tkVar, identifier, tkColon, type_ref + case 645: // pattern_out_param -> tkUnderscore { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); + CurrentSemanticValue.stn = new wild_card_deconstructor_parameter(CurrentLocationSpan); + } + break; + case 646: // pattern_out_param -> literal_or_number +{ + CurrentSemanticValue.stn = new const_pattern_parameter(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 647: // pattern_out_param -> tkVar, identifier, tkColon, type_ref +{ + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, true, CurrentLocationSpan); } break; - case 616: // pattern_out_param -> tkVar, identifier + case 648: // pattern_out_param -> tkVar, identifier { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, CurrentLocationSpan); + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, true, CurrentLocationSpan); } break; - case 617: // pattern_out_param -> pattern + case 649: // pattern_out_param -> pattern { CurrentSemanticValue.stn = new recursive_deconstructor_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); } break; - case 618: // pattern_out_param_optional_var -> identifier, tkColon, type_ref + case 650: // pattern_out_param -> collection_pattern { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); + CurrentSemanticValue.stn = new recursive_collection_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 651: // pattern_out_param -> tuple_pattern +{ + CurrentSemanticValue.stn = new recursive_tuple_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 652: // pattern_out_param_optional_var -> tkUnderscore +{ + CurrentSemanticValue.stn = new wild_card_deconstructor_parameter(CurrentLocationSpan); + } + break; + case 653: // pattern_out_param_optional_var -> literal_or_number +{ + CurrentSemanticValue.stn = new const_pattern_parameter(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); + } + break; + case 654: // pattern_out_param_optional_var -> identifier, tkColon, type_ref +{ + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, false, CurrentLocationSpan); } break; - case 619: // pattern_out_param_optional_var -> identifier + case 655: // pattern_out_param_optional_var -> identifier { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, CurrentLocationSpan); + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, false, CurrentLocationSpan); } break; - case 620: // pattern_out_param_optional_var -> tkVar, identifier, tkColon, type_ref + case 656: // pattern_out_param_optional_var -> tkVar, identifier, tkColon, type_ref { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td, true, CurrentLocationSpan); } break; - case 621: // pattern_out_param_optional_var -> tkVar, identifier + case 657: // pattern_out_param_optional_var -> tkVar, identifier { - CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, CurrentLocationSpan); + CurrentSemanticValue.stn = new var_deconstructor_parameter(ValueStack[ValueStack.Depth-1].id, null, true, CurrentLocationSpan); } break; - case 622: // pattern_out_param_optional_var -> pattern_optional_var + case 658: // pattern_out_param_optional_var -> pattern_optional_var { CurrentSemanticValue.stn = new recursive_deconstructor_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); } break; - case 623: // simple_expr_or_nothing -> simple_expr + case 659: // pattern_out_param_optional_var -> collection_pattern +{ + CurrentSemanticValue.stn = new recursive_collection_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 660: // pattern_out_param_optional_var -> tuple_pattern +{ + CurrentSemanticValue.stn = new recursive_tuple_parameter(ValueStack[ValueStack.Depth-1].stn as pattern_node, CurrentLocationSpan); + } + break; + case 661: // simple_expr_or_nothing -> simple_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 624: // simple_expr_or_nothing -> /* empty */ + case 662: // simple_expr_or_nothing -> /* empty */ { CurrentSemanticValue.ex = null; } break; - case 625: // const_expr_or_nothing -> const_expr + case 663: // const_expr_or_nothing -> const_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 626: // const_expr_or_nothing -> /* empty */ + case 664: // const_expr_or_nothing -> /* empty */ { CurrentSemanticValue.ex = null; } break; - case 627: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing + case 665: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 628: // format_expr -> tkColon, simple_expr_or_nothing + case 666: // format_expr -> tkColon, simple_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(null, ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 629: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing, tkColon, + case 667: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing, tkColon, // simple_expr { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-5].ex, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 630: // format_expr -> tkColon, simple_expr_or_nothing, tkColon, simple_expr + case 668: // format_expr -> tkColon, simple_expr_or_nothing, tkColon, simple_expr { CurrentSemanticValue.ex = new format_expr(null, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 631: // format_const_expr -> const_expr, tkColon, const_expr_or_nothing + case 669: // format_const_expr -> const_expr, tkColon, const_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 632: // format_const_expr -> tkColon, const_expr_or_nothing + case 670: // format_const_expr -> tkColon, const_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(null, ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 633: // format_const_expr -> const_expr, tkColon, const_expr_or_nothing, tkColon, + case 671: // format_const_expr -> const_expr, tkColon, const_expr_or_nothing, tkColon, // const_expr { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-5].ex, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 634: // format_const_expr -> tkColon, const_expr_or_nothing, tkColon, const_expr + case 672: // format_const_expr -> tkColon, const_expr_or_nothing, tkColon, const_expr { CurrentSemanticValue.ex = new format_expr(null, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 635: // relop -> tkEqual + case 673: // relop -> tkEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 636: // relop -> tkNotEqual + case 674: // relop -> tkNotEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 637: // relop -> tkLower + case 675: // relop -> tkLower { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 638: // relop -> tkGreater + case 676: // relop -> tkGreater { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 639: // relop -> tkLowerEqual + case 677: // relop -> tkLowerEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 640: // relop -> tkGreaterEqual + case 678: // relop -> tkGreaterEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 641: // relop -> tkIn + case 679: // relop -> tkIn { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 642: // simple_expr -> term + case 680: // simple_expr -> term { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 643: // simple_expr -> simple_expr, addop, term + case 681: // simple_expr -> simple_expr, addop, term { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 644: // addop -> tkPlus + case 682: // addop -> tkPlus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 645: // addop -> tkMinus + case 683: // addop -> tkMinus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 646: // addop -> tkOr + case 684: // addop -> tkOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 647: // addop -> tkXor + case 685: // addop -> tkXor { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 648: // addop -> tkCSharpStyleOr + case 686: // addop -> tkCSharpStyleOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 649: // typecast_op -> tkAs + case 687: // typecast_op -> tkAs { CurrentSemanticValue.ob = op_typecast.as_op; } break; - case 650: // typecast_op -> tkIs + case 688: // typecast_op -> tkIs { CurrentSemanticValue.ob = op_typecast.is_op; } break; - case 651: // as_is_expr -> is_expr + case 689: // as_is_expr -> is_type_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 652: // as_is_expr -> as_expr + case 690: // as_is_expr -> as_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 653: // as_expr -> term, tkAs, simple_or_template_type_reference + case 691: // as_expr -> term, tkAs, simple_or_template_type_reference { CurrentSemanticValue.ex = NewAsIsExpr(ValueStack[ValueStack.Depth-3].ex, op_typecast.as_op, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); } break; - case 654: // is_expr -> term, tkIs, simple_or_template_type_reference + case 692: // is_type_expr -> term, tkIs, simple_or_template_type_reference { CurrentSemanticValue.ex = NewAsIsExpr(ValueStack[ValueStack.Depth-3].ex, op_typecast.is_op, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); } break; - case 655: // simple_term -> factor + case 693: // simple_term -> factor { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 656: // power_expr -> simple_term, tkStarStar, factor + case 694: // power_expr -> simple_term, tkStarStar, factor { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex,ValueStack[ValueStack.Depth-1].ex,(ValueStack[ValueStack.Depth-2].op).type, CurrentLocationSpan); } break; - case 657: // term -> factor + case 695: // term -> factor { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 658: // term -> new_expr + case 696: // term -> new_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 659: // term -> power_expr + case 697: // term -> power_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 660: // term -> term, mulop, factor + case 698: // term -> term, mulop, factor { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex,ValueStack[ValueStack.Depth-1].ex,(ValueStack[ValueStack.Depth-2].op).type, CurrentLocationSpan); } break; - case 661: // term -> term, mulop, power_expr + case 699: // term -> term, mulop, power_expr { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex,ValueStack[ValueStack.Depth-1].ex,(ValueStack[ValueStack.Depth-2].op).type, CurrentLocationSpan); } break; - case 662: // term -> as_is_expr + case 700: // term -> as_is_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 663: // mulop -> tkStar + case 701: // mulop -> tkStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 664: // mulop -> tkSlash + case 702: // mulop -> tkSlash { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 665: // mulop -> tkDiv + case 703: // mulop -> tkDiv { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 666: // mulop -> tkMod + case 704: // mulop -> tkMod { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 667: // mulop -> tkShl + case 705: // mulop -> tkShl { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 668: // mulop -> tkShr + case 706: // mulop -> tkShr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 669: // mulop -> tkAnd + case 707: // mulop -> tkAnd { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 670: // default_expr -> tkDefault, tkRoundOpen, simple_or_template_type_reference, + case 708: // default_expr -> tkDefault, tkRoundOpen, simple_or_template_type_reference, // tkRoundClose { CurrentSemanticValue.ex = new default_operator(ValueStack[ValueStack.Depth-2].td as named_type_reference, CurrentLocationSpan); } break; - case 671: // tuple -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, lambda_type_ref, + case 709: // tuple -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, lambda_type_ref, // optional_full_lambda_fp_list, tkRoundClose { /*if ($5 != null) @@ -5778,29 +6076,29 @@ public partial class GPPGParser: ShiftReduceParser tkNil + case 710: // factor -> tkNil { CurrentSemanticValue.ex = new nil_const(); CurrentSemanticValue.ex.source_context = CurrentLocationSpan; } break; - case 673: // factor -> literal_or_number + case 711: // factor -> literal_or_number { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 674: // factor -> default_expr + case 712: // factor -> default_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 675: // factor -> tkSquareOpen, elem_list, tkSquareClose + case 713: // factor -> tkSquareOpen, elem_list, tkSquareClose { CurrentSemanticValue.ex = new pascal_set_constant(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan); } break; - case 676: // factor -> tkNot, factor + case 714: // factor -> tkNot, factor { CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 677: // factor -> sign, factor + case 715: // factor -> sign, factor { if (ValueStack[ValueStack.Depth-2].op.type == Operators.Minus) { @@ -5827,91 +6125,91 @@ public partial class GPPGParser: ShiftReduceParser var_reference + case 716: // factor -> var_reference { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 679: // factor -> tuple + case 717: // factor -> tuple { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 680: // literal_or_number -> literal + case 718: // literal_or_number -> literal { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 681: // literal_or_number -> unsigned_number + case 719: // literal_or_number -> unsigned_number { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 682: // var_question_point -> variable, tkQuestionPoint, variable + case 720: // var_question_point -> variable, tkQuestionPoint, variable { CurrentSemanticValue.ex = new dot_question_node(ValueStack[ValueStack.Depth-3].ex as addressed_value,ValueStack[ValueStack.Depth-1].ex as addressed_value,CurrentLocationSpan); } break; - case 683: // var_question_point -> variable, tkQuestionPoint, var_question_point + case 721: // var_question_point -> variable, tkQuestionPoint, var_question_point { CurrentSemanticValue.ex = new dot_question_node(ValueStack[ValueStack.Depth-3].ex as addressed_value,ValueStack[ValueStack.Depth-1].ex as addressed_value,CurrentLocationSpan); } break; - case 684: // var_reference -> var_address, variable + case 722: // var_reference -> var_address, variable { CurrentSemanticValue.ex = NewVarReference(ValueStack[ValueStack.Depth-2].stn as get_address, ValueStack[ValueStack.Depth-1].ex as addressed_value, CurrentLocationSpan); } break; - case 685: // var_reference -> variable + case 723: // var_reference -> variable { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 686: // var_reference -> var_question_point + case 724: // var_reference -> var_question_point { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 687: // var_address -> tkAddressOf + case 725: // var_address -> tkAddressOf { CurrentSemanticValue.stn = NewVarAddress(CurrentLocationSpan); } break; - case 688: // var_address -> var_address, tkAddressOf + case 726: // var_address -> var_address, tkAddressOf { CurrentSemanticValue.stn = NewVarAddress(ValueStack[ValueStack.Depth-2].stn as get_address, CurrentLocationSpan); } break; - case 689: // attribute_variable -> simple_type_identifier, optional_expr_list_with_bracket + case 727: // attribute_variable -> simple_type_identifier, optional_expr_list_with_bracket { CurrentSemanticValue.stn = new attribute(null, ValueStack[ValueStack.Depth-2].td as named_type_reference, ValueStack[ValueStack.Depth-1].stn as expression_list, CurrentLocationSpan); } break; - case 690: // attribute_variable -> template_type, optional_expr_list_with_bracket + case 728: // attribute_variable -> template_type, optional_expr_list_with_bracket { CurrentSemanticValue.stn = new attribute(null, ValueStack[ValueStack.Depth-2].td as named_type_reference, ValueStack[ValueStack.Depth-1].stn as expression_list, CurrentLocationSpan); } break; - case 691: // dotted_identifier -> identifier + case 729: // dotted_identifier -> identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; } break; - case 692: // dotted_identifier -> dotted_identifier, tkPoint, identifier_or_keyword + case 730: // dotted_identifier -> dotted_identifier, tkPoint, identifier_or_keyword { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 693: // variable_as_type -> dotted_identifier + case 731: // variable_as_type -> dotted_identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex;} break; - case 694: // variable_as_type -> dotted_identifier, template_type_params + case 732: // variable_as_type -> dotted_identifier, template_type_params { CurrentSemanticValue.ex = new ident_with_templateparams(ValueStack[ValueStack.Depth-2].ex as addressed_value, ValueStack[ValueStack.Depth-1].stn as template_param_list, CurrentLocationSpan); } break; - case 695: // variable_or_literal_or_number -> variable + case 733: // variable_or_literal_or_number -> variable { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 696: // variable_or_literal_or_number -> literal_or_number + case 734: // variable_or_literal_or_number -> literal_or_number { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 697: // variable -> identifier + case 735: // variable -> identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; } break; - case 698: // variable -> operator_name_ident + case 736: // variable -> operator_name_ident { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 699: // variable -> tkInherited, identifier + case 737: // variable -> tkInherited, identifier { CurrentSemanticValue.ex = new inherited_ident(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan); } break; - case 700: // variable -> tkRoundOpen, expr, tkRoundClose + case 738: // variable -> tkRoundOpen, expr, tkRoundClose { if (!parsertools.build_tree_for_formatter) { @@ -5921,18 +6219,18 @@ public partial class GPPGParser: ShiftReduceParser sizeof_expr + case 739: // variable -> sizeof_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 702: // variable -> typeof_expr + case 740: // variable -> typeof_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 703: // variable -> literal_or_number, tkPoint, identifier_or_keyword + case 741: // variable -> literal_or_number, tkPoint, identifier_or_keyword { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 704: // variable -> variable_or_literal_or_number, tkSquareOpen, expr_list, + case 742: // variable -> variable_or_literal_or_number, tkSquareOpen, expr_list, // tkSquareClose { var el = ValueStack[ValueStack.Depth-2].stn as expression_list; // SSM 10/03/16 @@ -5951,7 +6249,7 @@ public partial class GPPGParser: ShiftReduceParser variable, tkQuestionSquareOpen, format_expr, tkSquareClose + case 743: // variable -> variable, tkQuestionSquareOpen, format_expr, tkSquareClose { var fe = ValueStack[ValueStack.Depth-2].ex as format_expr; // SSM 9/01/17 if (!parsertools.build_tree_for_formatter) @@ -5964,71 +6262,71 @@ public partial class GPPGParser: ShiftReduceParser variable, tkRoundOpen, optional_expr_list, tkRoundClose + case 744: // variable -> variable, tkRoundOpen, optional_expr_list, tkRoundClose { CurrentSemanticValue.ex = new method_call(ValueStack[ValueStack.Depth-4].ex as addressed_value,ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan); } break; - case 707: // variable -> variable, tkPoint, identifier_keyword_operatorname + case 745: // variable -> variable, tkPoint, identifier_keyword_operatorname { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 708: // variable -> tuple, tkPoint, identifier_keyword_operatorname + case 746: // variable -> tuple, tkPoint, identifier_keyword_operatorname { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 709: // variable -> variable, tkDeref + case 747: // variable -> variable, tkDeref { CurrentSemanticValue.ex = new roof_dereference(ValueStack[ValueStack.Depth-2].ex as addressed_value,CurrentLocationSpan); } break; - case 710: // variable -> variable, tkAmpersend, template_type_params + case 748: // variable -> variable, tkAmpersend, template_type_params { CurrentSemanticValue.ex = new ident_with_templateparams(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].stn as template_param_list, CurrentLocationSpan); } break; - case 711: // optional_expr_list -> expr_list + case 749: // optional_expr_list -> expr_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 712: // optional_expr_list -> /* empty */ + case 750: // optional_expr_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 713: // elem_list -> elem_list1 + case 751: // elem_list -> elem_list1 { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 714: // elem_list -> /* empty */ + case 752: // elem_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 715: // elem_list1 -> elem + case 753: // elem_list1 -> elem { CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 716: // elem_list1 -> elem_list1, tkComma, elem + case 754: // elem_list1 -> elem_list1, tkComma, elem { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 717: // elem -> expr + case 755: // elem -> expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 718: // elem -> expr, tkDotDot, expr + case 756: // elem -> expr, tkDotDot, expr { CurrentSemanticValue.ex = new diapason_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 719: // one_literal -> tkStringLiteral + case 757: // one_literal -> tkStringLiteral { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 720: // one_literal -> tkAsciiChar + case 758: // one_literal -> tkAsciiChar { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 721: // literal -> literal_list + case 759: // literal -> literal_list { CurrentSemanticValue.ex = NewLiteral(ValueStack[ValueStack.Depth-1].stn as literal_const_line); } break; - case 722: // literal -> tkFormatStringLiteral + case 760: // literal -> tkFormatStringLiteral { if (parsertools.build_tree_for_formatter) { @@ -6040,12 +6338,12 @@ public partial class GPPGParser: ShiftReduceParser one_literal + case 761: // literal_list -> one_literal { CurrentSemanticValue.stn = new literal_const_line(ValueStack[ValueStack.Depth-1].ex as literal, CurrentLocationSpan); } break; - case 724: // literal_list -> literal_list, one_literal + case 762: // literal_list -> literal_list, one_literal { var line = ValueStack[ValueStack.Depth-2].stn as literal_const_line; if (line.literals.Last() is string_const && ValueStack[ValueStack.Depth-1].ex is string_const) @@ -6053,446 +6351,446 @@ public partial class GPPGParser: ShiftReduceParser tkOperator, overload_operator + case 763: // operator_name_ident -> tkOperator, overload_operator { CurrentSemanticValue.ex = new operator_name_ident((ValueStack[ValueStack.Depth-1].op as op_type_node).text, (ValueStack[ValueStack.Depth-1].op as op_type_node).type, CurrentLocationSpan); } break; - case 726: // optional_method_modificators -> tkSemiColon + case 764: // optional_method_modificators -> tkSemiColon { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 727: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon + case 765: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-2].stn; } break; - case 728: // optional_method_modificators1 -> /* empty */ + case 766: // optional_method_modificators1 -> /* empty */ { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 729: // optional_method_modificators1 -> tkSemiColon, meth_modificators + case 767: // optional_method_modificators1 -> tkSemiColon, meth_modificators { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 730: // meth_modificators -> meth_modificator + case 768: // meth_modificators -> meth_modificator { CurrentSemanticValue.stn = new procedure_attributes_list(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 731: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator + case 769: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as procedure_attributes_list).Add(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 732: // identifier -> tkIdentifier + case 770: // identifier -> tkIdentifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 733: // identifier -> property_specifier_directives + case 771: // identifier -> property_specifier_directives { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 734: // identifier -> non_reserved + case 772: // identifier -> non_reserved { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 735: // identifier_or_keyword -> identifier + case 773: // identifier_or_keyword -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 736: // identifier_or_keyword -> keyword + case 774: // identifier_or_keyword -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 737: // identifier_or_keyword -> reserved_keyword + case 775: // identifier_or_keyword -> reserved_keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 738: // identifier_keyword_operatorname -> identifier + case 776: // identifier_keyword_operatorname -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 739: // identifier_keyword_operatorname -> keyword + case 777: // identifier_keyword_operatorname -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 740: // identifier_keyword_operatorname -> operator_name_ident + case 778: // identifier_keyword_operatorname -> operator_name_ident { CurrentSemanticValue.id = (ident)ValueStack[ValueStack.Depth-1].ex; } break; - case 741: // meth_modificator -> tkAbstract + case 779: // meth_modificator -> tkAbstract { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 742: // meth_modificator -> tkOverload + case 780: // meth_modificator -> tkOverload { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; parsertools.AddWarningFromResource("OVERLOAD_IS_NOT_USED", ValueStack[ValueStack.Depth-1].id.source_context); } break; - case 743: // meth_modificator -> tkReintroduce + case 781: // meth_modificator -> tkReintroduce { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 744: // meth_modificator -> tkOverride + case 782: // meth_modificator -> tkOverride { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 745: // meth_modificator -> tkExtensionMethod + case 783: // meth_modificator -> tkExtensionMethod { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 746: // meth_modificator -> tkVirtual + case 784: // meth_modificator -> tkVirtual { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 747: // property_modificator -> tkVirtual + case 785: // property_modificator -> tkVirtual { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 748: // property_modificator -> tkOverride + case 786: // property_modificator -> tkOverride { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 749: // property_modificator -> tkAbstract + case 787: // property_modificator -> tkAbstract { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 750: // property_specifier_directives -> tkRead + case 788: // property_specifier_directives -> tkRead { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 751: // property_specifier_directives -> tkWrite + case 789: // property_specifier_directives -> tkWrite { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 752: // non_reserved -> tkName + case 790: // non_reserved -> tkName { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 753: // non_reserved -> tkNew + case 791: // non_reserved -> tkNew { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 754: // visibility_specifier -> tkInternal + case 792: // visibility_specifier -> tkInternal { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 755: // visibility_specifier -> tkPublic + case 793: // visibility_specifier -> tkPublic { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 756: // visibility_specifier -> tkProtected + case 794: // visibility_specifier -> tkProtected { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 757: // visibility_specifier -> tkPrivate + case 795: // visibility_specifier -> tkPrivate { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 758: // keyword -> visibility_specifier + case 796: // keyword -> visibility_specifier { CurrentSemanticValue.ti = new token_info(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan); } break; - case 759: // keyword -> tkSealed + case 797: // keyword -> tkSealed { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 760: // keyword -> tkTemplate + case 798: // keyword -> tkTemplate { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 761: // keyword -> tkOr + case 799: // keyword -> tkOr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 762: // keyword -> tkTypeOf + case 800: // keyword -> tkTypeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 763: // keyword -> tkSizeOf + case 801: // keyword -> tkSizeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 764: // keyword -> tkDefault + case 802: // keyword -> tkDefault { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 765: // keyword -> tkWhere + case 803: // keyword -> tkWhere { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 766: // keyword -> tkXor + case 804: // keyword -> tkXor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 767: // keyword -> tkAnd + case 805: // keyword -> tkAnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 768: // keyword -> tkDiv + case 806: // keyword -> tkDiv { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 769: // keyword -> tkMod + case 807: // keyword -> tkMod { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 770: // keyword -> tkShl + case 808: // keyword -> tkShl { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 771: // keyword -> tkShr + case 809: // keyword -> tkShr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 772: // keyword -> tkNot + case 810: // keyword -> tkNot { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 773: // keyword -> tkAs + case 811: // keyword -> tkAs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 774: // keyword -> tkIn + case 812: // keyword -> tkIn { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 775: // keyword -> tkIs + case 813: // keyword -> tkIs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 776: // keyword -> tkArray + case 814: // keyword -> tkArray { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 777: // keyword -> tkSequence + case 815: // keyword -> tkSequence { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 778: // keyword -> tkBegin + case 816: // keyword -> tkBegin { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 779: // keyword -> tkCase + case 817: // keyword -> tkCase { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 780: // keyword -> tkClass + case 818: // keyword -> tkClass { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 781: // keyword -> tkConst + case 819: // keyword -> tkConst { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 782: // keyword -> tkConstructor + case 820: // keyword -> tkConstructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 783: // keyword -> tkDestructor + case 821: // keyword -> tkDestructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 784: // keyword -> tkDownto + case 822: // keyword -> tkDownto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 785: // keyword -> tkDo + case 823: // keyword -> tkDo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 786: // keyword -> tkElse + case 824: // keyword -> tkElse { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 787: // keyword -> tkExcept + case 825: // keyword -> tkExcept { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 788: // keyword -> tkFile + case 826: // keyword -> tkFile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 789: // keyword -> tkAuto + case 827: // keyword -> tkAuto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 790: // keyword -> tkFinalization + case 828: // keyword -> tkFinalization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 791: // keyword -> tkFinally + case 829: // keyword -> tkFinally { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 792: // keyword -> tkFor + case 830: // keyword -> tkFor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 793: // keyword -> tkForeach + case 831: // keyword -> tkForeach { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 794: // keyword -> tkFunction + case 832: // keyword -> tkFunction { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 795: // keyword -> tkIf + case 833: // keyword -> tkIf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 796: // keyword -> tkImplementation + case 834: // keyword -> tkImplementation { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 797: // keyword -> tkInherited + case 835: // keyword -> tkInherited { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 798: // keyword -> tkInitialization + case 836: // keyword -> tkInitialization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 799: // keyword -> tkInterface + case 837: // keyword -> tkInterface { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 800: // keyword -> tkProcedure + case 838: // keyword -> tkProcedure { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 801: // keyword -> tkProperty + case 839: // keyword -> tkProperty { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 802: // keyword -> tkRaise + case 840: // keyword -> tkRaise { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 803: // keyword -> tkRecord + case 841: // keyword -> tkRecord { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 804: // keyword -> tkRepeat + case 842: // keyword -> tkRepeat { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 805: // keyword -> tkSet + case 843: // keyword -> tkSet { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 806: // keyword -> tkTry + case 844: // keyword -> tkTry { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 807: // keyword -> tkType + case 845: // keyword -> tkType { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 808: // keyword -> tkStatic + case 846: // keyword -> tkStatic { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 809: // keyword -> tkThen + case 847: // keyword -> tkThen { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 810: // keyword -> tkTo + case 848: // keyword -> tkTo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 811: // keyword -> tkUntil + case 849: // keyword -> tkUntil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 812: // keyword -> tkUses + case 850: // keyword -> tkUses { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 813: // keyword -> tkVar + case 851: // keyword -> tkVar { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 814: // keyword -> tkWhile + case 852: // keyword -> tkWhile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 815: // keyword -> tkWith + case 853: // keyword -> tkWith { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 816: // keyword -> tkNil + case 854: // keyword -> tkNil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 817: // keyword -> tkGoto + case 855: // keyword -> tkGoto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 818: // keyword -> tkOf + case 856: // keyword -> tkOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 819: // keyword -> tkLabel + case 857: // keyword -> tkLabel { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 820: // keyword -> tkProgram + case 858: // keyword -> tkProgram { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 821: // keyword -> tkUnit + case 859: // keyword -> tkUnit { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 822: // keyword -> tkLibrary + case 860: // keyword -> tkLibrary { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 823: // keyword -> tkNamespace + case 861: // keyword -> tkNamespace { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 824: // keyword -> tkExternal + case 862: // keyword -> tkExternal { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 825: // keyword -> tkParams + case 863: // keyword -> tkParams { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 826: // keyword -> tkEvent + case 864: // keyword -> tkEvent { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 827: // keyword -> tkYield + case 865: // keyword -> tkYield { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 828: // keyword -> tkMatch + case 866: // keyword -> tkMatch { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 829: // keyword -> tkWhen + case 867: // keyword -> tkWhen { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 830: // reserved_keyword -> tkOperator + case 868: // reserved_keyword -> tkOperator { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 831: // reserved_keyword -> tkEnd + case 869: // reserved_keyword -> tkEnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 832: // overload_operator -> tkMinus + case 870: // overload_operator -> tkMinus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 833: // overload_operator -> tkPlus + case 871: // overload_operator -> tkPlus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 834: // overload_operator -> tkSlash + case 872: // overload_operator -> tkSlash { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 835: // overload_operator -> tkStar + case 873: // overload_operator -> tkStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 836: // overload_operator -> tkEqual + case 874: // overload_operator -> tkEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 837: // overload_operator -> tkGreater + case 875: // overload_operator -> tkGreater { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 838: // overload_operator -> tkGreaterEqual + case 876: // overload_operator -> tkGreaterEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 839: // overload_operator -> tkLower + case 877: // overload_operator -> tkLower { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 840: // overload_operator -> tkLowerEqual + case 878: // overload_operator -> tkLowerEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 841: // overload_operator -> tkNotEqual + case 879: // overload_operator -> tkNotEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 842: // overload_operator -> tkOr + case 880: // overload_operator -> tkOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 843: // overload_operator -> tkXor + case 881: // overload_operator -> tkXor { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 844: // overload_operator -> tkAnd + case 882: // overload_operator -> tkAnd { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 845: // overload_operator -> tkDiv + case 883: // overload_operator -> tkDiv { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 846: // overload_operator -> tkMod + case 884: // overload_operator -> tkMod { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 847: // overload_operator -> tkShl + case 885: // overload_operator -> tkShl { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 848: // overload_operator -> tkShr + case 886: // overload_operator -> tkShr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 849: // overload_operator -> tkNot + case 887: // overload_operator -> tkNot { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 850: // overload_operator -> tkIn + case 888: // overload_operator -> tkIn { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 851: // overload_operator -> tkImplicit + case 889: // overload_operator -> tkImplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 852: // overload_operator -> tkExplicit + case 890: // overload_operator -> tkExplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 853: // overload_operator -> assign_operator + case 891: // overload_operator -> assign_operator { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 854: // overload_operator -> tkStarStar + case 892: // overload_operator -> tkStarStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 855: // assign_operator -> tkAssign + case 893: // assign_operator -> tkAssign { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 856: // assign_operator -> tkPlusEqual + case 894: // assign_operator -> tkPlusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 857: // assign_operator -> tkMinusEqual + case 895: // assign_operator -> tkMinusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 858: // assign_operator -> tkMultEqual + case 896: // assign_operator -> tkMultEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 859: // assign_operator -> tkDivEqual + case 897: // assign_operator -> tkDivEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 860: // func_decl_lambda -> identifier, tkArrow, lambda_function_body + case 898: // func_decl_lambda -> identifier, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-3].id, LocationStack[LocationStack.Depth-3]); var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), LocationStack[LocationStack.Depth-3]), parametr_kind.none, null, LocationStack[LocationStack.Depth-3]), LocationStack[LocationStack.Depth-3]); CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), LocationStack[LocationStack.Depth-3]), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 861: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, + case 899: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 862: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, + case 900: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-7].id, LocationStack[LocationStack.Depth-7]); @@ -6501,7 +6799,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, + case 901: // func_decl_lambda -> tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, // tkRoundClose, lambda_type_ref_noproctype, tkArrow, // lambda_function_body { @@ -6512,7 +6810,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, + case 902: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, // full_lambda_fp_list, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { @@ -6524,7 +6822,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, expr_l1, tkComma, expr_l1_list, + case 903: // func_decl_lambda -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, // lambda_type_ref, optional_full_lambda_fp_list, // tkRoundClose, rem_lambda { @@ -6586,61 +6884,61 @@ public partial class GPPGParser: ShiftReduceParser expl_func_decl_lambda + case 904: // func_decl_lambda -> expl_func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 867: // optional_full_lambda_fp_list -> /* empty */ + case 905: // optional_full_lambda_fp_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 868: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list + case 906: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 869: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body + case 907: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body { CurrentSemanticValue.ob = new pair_type_stlist(ValueStack[ValueStack.Depth-3].td,ValueStack[ValueStack.Depth-1].stn as statement_list); } break; - case 870: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, + case 908: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 871: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, + case 909: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 872: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, + case 910: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-5].stn as formal_parameters, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 873: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body + case 911: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 874: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, + case 912: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, // lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 875: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, + case 913: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-4].stn as formal_parameters, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 876: // full_lambda_fp_list -> lambda_simple_fp_sect + case 914: // full_lambda_fp_list -> lambda_simple_fp_sect { var typed_pars = ValueStack[ValueStack.Depth-1].stn as typed_parameters; if (typed_pars.vars_type is lambda_inferred_type) @@ -6660,97 +6958,97 @@ public partial class GPPGParser: ShiftReduceParser full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect + case 915: // full_lambda_fp_list -> full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect { CurrentSemanticValue.stn =(ValueStack[ValueStack.Depth-3].stn as formal_parameters).Add(ValueStack[ValueStack.Depth-1].stn as typed_parameters, CurrentLocationSpan); } break; - case 878: // lambda_simple_fp_sect -> ident_list, lambda_type_ref + case 916: // lambda_simple_fp_sect -> ident_list, lambda_type_ref { CurrentSemanticValue.stn = new typed_parameters(ValueStack[ValueStack.Depth-2].stn as ident_list, ValueStack[ValueStack.Depth-1].td, parametr_kind.none, null, CurrentLocationSpan); } break; - case 879: // lambda_type_ref -> /* empty */ + case 917: // lambda_type_ref -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 880: // lambda_type_ref -> tkColon, fptype + case 918: // lambda_type_ref -> tkColon, fptype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 881: // lambda_type_ref_noproctype -> /* empty */ + case 919: // lambda_type_ref_noproctype -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 882: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype + case 920: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 883: // common_lambda_body -> compound_stmt + case 921: // common_lambda_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 884: // common_lambda_body -> if_stmt + case 922: // common_lambda_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 885: // common_lambda_body -> while_stmt + case 923: // common_lambda_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 886: // common_lambda_body -> repeat_stmt + case 924: // common_lambda_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 887: // common_lambda_body -> for_stmt + case 925: // common_lambda_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 888: // common_lambda_body -> foreach_stmt + case 926: // common_lambda_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 889: // common_lambda_body -> loop_stmt + case 927: // common_lambda_body -> loop_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 890: // common_lambda_body -> case_stmt + case 928: // common_lambda_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 891: // common_lambda_body -> try_stmt + case 929: // common_lambda_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 892: // common_lambda_body -> lock_stmt + case 930: // common_lambda_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 893: // common_lambda_body -> yield_stmt + case 931: // common_lambda_body -> yield_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 894: // common_lambda_body -> raise_stmt + case 932: // common_lambda_body -> raise_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 895: // lambda_function_body -> expr_l1 + case 933: // lambda_function_body -> expr_l1 { var id = SyntaxVisitors.ExprHasNameVisitor.HasName(ValueStack[ValueStack.Depth-1].ex, "Result"); if (id != null) @@ -6762,22 +7060,22 @@ public partial class GPPGParser: ShiftReduceParser common_lambda_body + case 934: // lambda_function_body -> common_lambda_body { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 897: // lambda_procedure_body -> proc_call + case 935: // lambda_procedure_body -> proc_call { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 898: // lambda_procedure_body -> assignment + case 936: // lambda_procedure_body -> assignment { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 899: // lambda_procedure_body -> common_lambda_body + case 937: // lambda_procedure_body -> common_lambda_body { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } diff --git a/SyntaxTree/tree/AbstractVisitor.cs b/SyntaxTree/tree/AbstractVisitor.cs index 894e33e30..ca9fb52cb 100644 --- a/SyntaxTree/tree/AbstractVisitor.cs +++ b/SyntaxTree/tree/AbstractVisitor.cs @@ -1153,9 +1153,9 @@ namespace PascalABCCompiler.SyntaxTree DefaultVisit(_deconstructor_pattern); } - public virtual void visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public virtual void visit(pattern_parameter _pattern_parameter) { - DefaultVisit(_pattern_deconstructor_parameter); + DefaultVisit(_pattern_parameter); } public virtual void visit(desugared_deconstruction _desugared_deconstruction) @@ -1187,6 +1187,71 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_semantic_check_sugared_var_def_statement_node); } + + public virtual void visit(const_pattern _const_pattern) + { + DefaultVisit(_const_pattern); + } + + public virtual void visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + DefaultVisit(_tuple_pattern_wild_card); + } + + public virtual void visit(const_pattern_parameter _const_pattern_parameter) + { + DefaultVisit(_const_pattern_parameter); + } + + public virtual void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + DefaultVisit(_wild_card_deconstructor_parameter); + } + + public virtual void visit(collection_pattern _collection_pattern) + { + DefaultVisit(_collection_pattern); + } + + public virtual void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + DefaultVisit(_collection_pattern_gap_parameter); + } + + public virtual void visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + DefaultVisit(_collection_pattern_wild_card); + } + + public virtual void visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + DefaultVisit(_collection_pattern_var_parameter); + } + + public virtual void visit(recursive_collection_parameter _recursive_collection_parameter) + { + DefaultVisit(_recursive_collection_parameter); + } + + public virtual void visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + DefaultVisit(_recursive_pattern_parameter); + } + + public virtual void visit(tuple_pattern _tuple_pattern) + { + DefaultVisit(_tuple_pattern); + } + + public virtual void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + DefaultVisit(_tuple_pattern_var_parameter); + } + + public virtual void visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + DefaultVisit(_recursive_tuple_parameter); + } } diff --git a/SyntaxTree/tree/HierarchyVisitor.cs b/SyntaxTree/tree/HierarchyVisitor.cs index 7596a4a23..79a0c8489 100644 --- a/SyntaxTree/tree/HierarchyVisitor.cs +++ b/SyntaxTree/tree/HierarchyVisitor.cs @@ -1837,11 +1837,11 @@ namespace PascalABCCompiler.SyntaxTree { } - public virtual void pre_do_visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public virtual void pre_do_visit(pattern_parameter _pattern_parameter) { } - public virtual void post_do_visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public virtual void post_do_visit(pattern_parameter _pattern_parameter) { } @@ -1893,6 +1893,110 @@ namespace PascalABCCompiler.SyntaxTree { } + public virtual void pre_do_visit(const_pattern _const_pattern) + { + } + + public virtual void post_do_visit(const_pattern _const_pattern) + { + } + + public virtual void pre_do_visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + } + + public virtual void post_do_visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + } + + public virtual void pre_do_visit(const_pattern_parameter _const_pattern_parameter) + { + } + + public virtual void post_do_visit(const_pattern_parameter _const_pattern_parameter) + { + } + + public virtual void pre_do_visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + } + + public virtual void post_do_visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + } + + public virtual void pre_do_visit(collection_pattern _collection_pattern) + { + } + + public virtual void post_do_visit(collection_pattern _collection_pattern) + { + } + + public virtual void pre_do_visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + } + + public virtual void post_do_visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + } + + public virtual void pre_do_visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + } + + public virtual void post_do_visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + } + + public virtual void pre_do_visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + } + + public virtual void post_do_visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + } + + public virtual void pre_do_visit(recursive_collection_parameter _recursive_collection_parameter) + { + } + + public virtual void post_do_visit(recursive_collection_parameter _recursive_collection_parameter) + { + } + + public virtual void pre_do_visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + } + + public virtual void post_do_visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + } + + public virtual void pre_do_visit(tuple_pattern _tuple_pattern) + { + } + + public virtual void post_do_visit(tuple_pattern _tuple_pattern) + { + } + + public virtual void pre_do_visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + } + + public virtual void post_do_visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + } + + public virtual void pre_do_visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + } + + public virtual void post_do_visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + } + public override void visit(expression _expression) { DefaultVisit(_expression); @@ -3804,6 +3908,8 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_pattern_node); pre_do_visit(_pattern_node); + for (int i = 0; i < parameters.Count; i++) + visit(pattern_node.parameters[i]); post_do_visit(_pattern_node); } @@ -3858,17 +3964,16 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_deconstructor_pattern); pre_do_visit(_deconstructor_pattern); - for (int i = 0; i < parameters.Count; i++) - visit(deconstructor_pattern.parameters[i]); visit(deconstructor_pattern.type); + visit(deconstructor_pattern.const_params_check); post_do_visit(_deconstructor_pattern); } - public override void visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public override void visit(pattern_parameter _pattern_parameter) { - DefaultVisit(_pattern_deconstructor_parameter); - pre_do_visit(_pattern_deconstructor_parameter); - post_do_visit(_pattern_deconstructor_parameter); + DefaultVisit(_pattern_parameter); + pre_do_visit(_pattern_parameter); + post_do_visit(_pattern_parameter); } public override void visit(desugared_deconstruction _desugared_deconstruction) @@ -3893,7 +3998,6 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_recursive_deconstructor_parameter); pre_do_visit(_recursive_deconstructor_parameter); - visit(recursive_deconstructor_parameter.pattern); post_do_visit(_recursive_deconstructor_parameter); } @@ -3921,6 +4025,104 @@ namespace PascalABCCompiler.SyntaxTree visit(semantic_check_sugared_var_def_statement_node.lst[i]); post_do_visit(_semantic_check_sugared_var_def_statement_node); } + + public override void visit(const_pattern _const_pattern) + { + DefaultVisit(_const_pattern); + pre_do_visit(_const_pattern); + visit(const_pattern.pattern_expressions); + post_do_visit(_const_pattern); + } + + public override void visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + DefaultVisit(_tuple_pattern_wild_card); + pre_do_visit(_tuple_pattern_wild_card); + post_do_visit(_tuple_pattern_wild_card); + } + + public override void visit(const_pattern_parameter _const_pattern_parameter) + { + DefaultVisit(_const_pattern_parameter); + pre_do_visit(_const_pattern_parameter); + visit(const_pattern_parameter.const_param); + post_do_visit(_const_pattern_parameter); + } + + public override void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + DefaultVisit(_wild_card_deconstructor_parameter); + pre_do_visit(_wild_card_deconstructor_parameter); + post_do_visit(_wild_card_deconstructor_parameter); + } + + public override void visit(collection_pattern _collection_pattern) + { + DefaultVisit(_collection_pattern); + pre_do_visit(_collection_pattern); + post_do_visit(_collection_pattern); + } + + public override void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + DefaultVisit(_collection_pattern_gap_parameter); + pre_do_visit(_collection_pattern_gap_parameter); + post_do_visit(_collection_pattern_gap_parameter); + } + + public override void visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + DefaultVisit(_collection_pattern_wild_card); + pre_do_visit(_collection_pattern_wild_card); + post_do_visit(_collection_pattern_wild_card); + } + + public override void visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + DefaultVisit(_collection_pattern_var_parameter); + pre_do_visit(_collection_pattern_var_parameter); + visit(collection_pattern_var_parameter.identifier); + visit(collection_pattern_var_parameter.type); + post_do_visit(_collection_pattern_var_parameter); + } + + public override void visit(recursive_collection_parameter _recursive_collection_parameter) + { + DefaultVisit(_recursive_collection_parameter); + pre_do_visit(_recursive_collection_parameter); + post_do_visit(_recursive_collection_parameter); + } + + public override void visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + DefaultVisit(_recursive_pattern_parameter); + pre_do_visit(_recursive_pattern_parameter); + visit(recursive_pattern_parameter.pattern); + post_do_visit(_recursive_pattern_parameter); + } + + public override void visit(tuple_pattern _tuple_pattern) + { + DefaultVisit(_tuple_pattern); + pre_do_visit(_tuple_pattern); + post_do_visit(_tuple_pattern); + } + + public override void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + DefaultVisit(_tuple_pattern_var_parameter); + pre_do_visit(_tuple_pattern_var_parameter); + visit(tuple_pattern_var_parameter.identifier); + visit(tuple_pattern_var_parameter.type); + post_do_visit(_tuple_pattern_var_parameter); + } + + public override void visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + DefaultVisit(_recursive_tuple_parameter); + pre_do_visit(_recursive_tuple_parameter); + post_do_visit(_recursive_tuple_parameter); + } } diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index 46cfe36cd..54d17c778 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -479,7 +479,7 @@ namespace PascalABCCompiler.SyntaxTree case 228: return new deconstructor_pattern(); case 229: - return new pattern_deconstructor_parameter(); + return new pattern_parameter(); case 230: return new desugared_deconstruction(); case 231: @@ -492,6 +492,32 @@ namespace PascalABCCompiler.SyntaxTree return new var_tuple_def_statement(); case 235: return new semantic_check_sugared_var_def_statement_node(); + case 236: + return new const_pattern(); + case 237: + return new tuple_pattern_wild_card(); + case 238: + return new const_pattern_parameter(); + case 239: + return new wild_card_deconstructor_parameter(); + case 240: + return new collection_pattern(); + case 241: + return new collection_pattern_gap_parameter(); + case 242: + return new collection_pattern_wild_card(); + case 243: + return new collection_pattern_var_parameter(); + case 244: + return new recursive_collection_parameter(); + case 245: + return new recursive_pattern_parameter(); + case 246: + return new tuple_pattern(); + case 247: + return new tuple_pattern_var_parameter(); + case 248: + return new recursive_tuple_parameter(); } return null; } @@ -3964,6 +3990,19 @@ namespace PascalABCCompiler.SyntaxTree public void read_pattern_node(pattern_node _pattern_node) { read_syntax_tree_node(_pattern_node); + if (br.ReadByte() == 0) + { + _pattern_node.parameters = null; + } + else + { + _pattern_node.parameters = new List(); + Int32 ssyy_count = br.ReadInt32(); + for(Int32 ssyy_i = 0; ssyy_i < ssyy_count; ssyy_i++) + { + _pattern_node.parameters.Add(_read_node() as pattern_parameter); + } + } } @@ -4053,31 +4092,19 @@ namespace PascalABCCompiler.SyntaxTree public void read_deconstructor_pattern(deconstructor_pattern _deconstructor_pattern) { read_pattern_node(_deconstructor_pattern); - if (br.ReadByte() == 0) - { - _deconstructor_pattern.parameters = null; - } - else - { - _deconstructor_pattern.parameters = new List(); - Int32 ssyy_count = br.ReadInt32(); - for(Int32 ssyy_i = 0; ssyy_i < ssyy_count; ssyy_i++) - { - _deconstructor_pattern.parameters.Add(_read_node() as pattern_deconstructor_parameter); - } - } _deconstructor_pattern.type = _read_node() as type_definition; + _deconstructor_pattern.const_params_check = _read_node() as expression; } - public void visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public void visit(pattern_parameter _pattern_parameter) { - read_pattern_deconstructor_parameter(_pattern_deconstructor_parameter); + read_pattern_parameter(_pattern_parameter); } - public void read_pattern_deconstructor_parameter(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public void read_pattern_parameter(pattern_parameter _pattern_parameter) { - read_syntax_tree_node(_pattern_deconstructor_parameter); + read_syntax_tree_node(_pattern_parameter); } @@ -4101,9 +4128,10 @@ namespace PascalABCCompiler.SyntaxTree public void read_var_deconstructor_parameter(var_deconstructor_parameter _var_deconstructor_parameter) { - read_pattern_deconstructor_parameter(_var_deconstructor_parameter); + read_pattern_parameter(_var_deconstructor_parameter); _var_deconstructor_parameter.identifier = _read_node() as ident; _var_deconstructor_parameter.type = _read_node() as type_definition; + _var_deconstructor_parameter.var_keyword_used = br.ReadBoolean(); } @@ -4114,8 +4142,7 @@ namespace PascalABCCompiler.SyntaxTree public void read_recursive_deconstructor_parameter(recursive_deconstructor_parameter _recursive_deconstructor_parameter) { - read_pattern_deconstructor_parameter(_recursive_deconstructor_parameter); - _recursive_deconstructor_parameter.pattern = _read_node() as pattern_node; + read_recursive_pattern_parameter(_recursive_deconstructor_parameter); } @@ -4178,6 +4205,156 @@ namespace PascalABCCompiler.SyntaxTree } } + + public void visit(const_pattern _const_pattern) + { + read_const_pattern(_const_pattern); + } + + public void read_const_pattern(const_pattern _const_pattern) + { + read_pattern_node(_const_pattern); + _const_pattern.pattern_expressions = _read_node() as expression_list; + } + + + public void visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + read_tuple_pattern_wild_card(_tuple_pattern_wild_card); + } + + public void read_tuple_pattern_wild_card(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + read_pattern_parameter(_tuple_pattern_wild_card); + } + + + public void visit(const_pattern_parameter _const_pattern_parameter) + { + read_const_pattern_parameter(_const_pattern_parameter); + } + + public void read_const_pattern_parameter(const_pattern_parameter _const_pattern_parameter) + { + read_pattern_parameter(_const_pattern_parameter); + _const_pattern_parameter.const_param = _read_node() as expression; + } + + + public void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + read_wild_card_deconstructor_parameter(_wild_card_deconstructor_parameter); + } + + public void read_wild_card_deconstructor_parameter(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + read_pattern_parameter(_wild_card_deconstructor_parameter); + } + + + public void visit(collection_pattern _collection_pattern) + { + read_collection_pattern(_collection_pattern); + } + + public void read_collection_pattern(collection_pattern _collection_pattern) + { + read_pattern_node(_collection_pattern); + } + + + public void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + read_collection_pattern_gap_parameter(_collection_pattern_gap_parameter); + } + + public void read_collection_pattern_gap_parameter(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + read_pattern_parameter(_collection_pattern_gap_parameter); + } + + + public void visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + read_collection_pattern_wild_card(_collection_pattern_wild_card); + } + + public void read_collection_pattern_wild_card(collection_pattern_wild_card _collection_pattern_wild_card) + { + read_pattern_parameter(_collection_pattern_wild_card); + } + + + public void visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + read_collection_pattern_var_parameter(_collection_pattern_var_parameter); + } + + public void read_collection_pattern_var_parameter(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + read_pattern_parameter(_collection_pattern_var_parameter); + _collection_pattern_var_parameter.identifier = _read_node() as ident; + _collection_pattern_var_parameter.type = _read_node() as type_definition; + } + + + public void visit(recursive_collection_parameter _recursive_collection_parameter) + { + read_recursive_collection_parameter(_recursive_collection_parameter); + } + + public void read_recursive_collection_parameter(recursive_collection_parameter _recursive_collection_parameter) + { + read_recursive_pattern_parameter(_recursive_collection_parameter); + } + + + public void visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + read_recursive_pattern_parameter(_recursive_pattern_parameter); + } + + public void read_recursive_pattern_parameter(recursive_pattern_parameter _recursive_pattern_parameter) + { + read_pattern_parameter(_recursive_pattern_parameter); + _recursive_pattern_parameter.pattern = _read_node() as pattern_node; + } + + + public void visit(tuple_pattern _tuple_pattern) + { + read_tuple_pattern(_tuple_pattern); + } + + public void read_tuple_pattern(tuple_pattern _tuple_pattern) + { + read_pattern_node(_tuple_pattern); + } + + + public void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + read_tuple_pattern_var_parameter(_tuple_pattern_var_parameter); + } + + public void read_tuple_pattern_var_parameter(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + read_pattern_parameter(_tuple_pattern_var_parameter); + _tuple_pattern_var_parameter.identifier = _read_node() as ident; + _tuple_pattern_var_parameter.type = _read_node() as type_definition; + } + + + public void visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + read_recursive_tuple_parameter(_recursive_tuple_parameter); + } + + public void read_recursive_tuple_parameter(recursive_tuple_parameter _recursive_tuple_parameter) + { + read_recursive_pattern_parameter(_recursive_tuple_parameter); + } + } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index 38743722d..be781428c 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -6188,6 +6188,27 @@ namespace PascalABCCompiler.SyntaxTree public void write_pattern_node(pattern_node _pattern_node) { write_syntax_tree_node(_pattern_node); + if (_pattern_node.parameters == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + bw.Write(_pattern_node.parameters.Count); + for(Int32 ssyy_i = 0; ssyy_i < _pattern_node.parameters.Count; ssyy_i++) + { + if (_pattern_node.parameters[ssyy_i] == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _pattern_node.parameters[ssyy_i].visit(this); + } + } + } } @@ -6371,27 +6392,6 @@ namespace PascalABCCompiler.SyntaxTree public void write_deconstructor_pattern(deconstructor_pattern _deconstructor_pattern) { write_pattern_node(_deconstructor_pattern); - if (_deconstructor_pattern.parameters == null) - { - bw.Write((byte)0); - } - else - { - bw.Write((byte)1); - bw.Write(_deconstructor_pattern.parameters.Count); - for(Int32 ssyy_i = 0; ssyy_i < _deconstructor_pattern.parameters.Count; ssyy_i++) - { - if (_deconstructor_pattern.parameters[ssyy_i] == null) - { - bw.Write((byte)0); - } - else - { - bw.Write((byte)1); - _deconstructor_pattern.parameters[ssyy_i].visit(this); - } - } - } if (_deconstructor_pattern.type == null) { bw.Write((byte)0); @@ -6401,18 +6401,27 @@ namespace PascalABCCompiler.SyntaxTree bw.Write((byte)1); _deconstructor_pattern.type.visit(this); } + if (_deconstructor_pattern.const_params_check == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _deconstructor_pattern.const_params_check.visit(this); + } } - public void visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public void visit(pattern_parameter _pattern_parameter) { bw.Write((Int16)229); - write_pattern_deconstructor_parameter(_pattern_deconstructor_parameter); + write_pattern_parameter(_pattern_parameter); } - public void write_pattern_deconstructor_parameter(pattern_deconstructor_parameter _pattern_deconstructor_parameter) + public void write_pattern_parameter(pattern_parameter _pattern_parameter) { - write_syntax_tree_node(_pattern_deconstructor_parameter); + write_syntax_tree_node(_pattern_parameter); } @@ -6454,7 +6463,7 @@ namespace PascalABCCompiler.SyntaxTree public void write_var_deconstructor_parameter(var_deconstructor_parameter _var_deconstructor_parameter) { - write_pattern_deconstructor_parameter(_var_deconstructor_parameter); + write_pattern_parameter(_var_deconstructor_parameter); if (_var_deconstructor_parameter.identifier == null) { bw.Write((byte)0); @@ -6473,6 +6482,7 @@ namespace PascalABCCompiler.SyntaxTree bw.Write((byte)1); _var_deconstructor_parameter.type.visit(this); } + bw.Write(_var_deconstructor_parameter.var_keyword_used); } @@ -6484,16 +6494,7 @@ namespace PascalABCCompiler.SyntaxTree public void write_recursive_deconstructor_parameter(recursive_deconstructor_parameter _recursive_deconstructor_parameter) { - write_pattern_deconstructor_parameter(_recursive_deconstructor_parameter); - if (_recursive_deconstructor_parameter.pattern == null) - { - bw.Write((byte)0); - } - else - { - bw.Write((byte)1); - _recursive_deconstructor_parameter.pattern.visit(this); - } + write_recursive_pattern_parameter(_recursive_deconstructor_parameter); } @@ -6575,6 +6576,225 @@ namespace PascalABCCompiler.SyntaxTree } } + + public void visit(const_pattern _const_pattern) + { + bw.Write((Int16)236); + write_const_pattern(_const_pattern); + } + + public void write_const_pattern(const_pattern _const_pattern) + { + write_pattern_node(_const_pattern); + if (_const_pattern.pattern_expressions == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _const_pattern.pattern_expressions.visit(this); + } + } + + + public void visit(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + bw.Write((Int16)237); + write_tuple_pattern_wild_card(_tuple_pattern_wild_card); + } + + public void write_tuple_pattern_wild_card(tuple_pattern_wild_card _tuple_pattern_wild_card) + { + write_pattern_parameter(_tuple_pattern_wild_card); + } + + + public void visit(const_pattern_parameter _const_pattern_parameter) + { + bw.Write((Int16)238); + write_const_pattern_parameter(_const_pattern_parameter); + } + + public void write_const_pattern_parameter(const_pattern_parameter _const_pattern_parameter) + { + write_pattern_parameter(_const_pattern_parameter); + if (_const_pattern_parameter.const_param == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _const_pattern_parameter.const_param.visit(this); + } + } + + + public void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + bw.Write((Int16)239); + write_wild_card_deconstructor_parameter(_wild_card_deconstructor_parameter); + } + + public void write_wild_card_deconstructor_parameter(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter) + { + write_pattern_parameter(_wild_card_deconstructor_parameter); + } + + + public void visit(collection_pattern _collection_pattern) + { + bw.Write((Int16)240); + write_collection_pattern(_collection_pattern); + } + + public void write_collection_pattern(collection_pattern _collection_pattern) + { + write_pattern_node(_collection_pattern); + } + + + public void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + bw.Write((Int16)241); + write_collection_pattern_gap_parameter(_collection_pattern_gap_parameter); + } + + public void write_collection_pattern_gap_parameter(collection_pattern_gap_parameter _collection_pattern_gap_parameter) + { + write_pattern_parameter(_collection_pattern_gap_parameter); + } + + + public void visit(collection_pattern_wild_card _collection_pattern_wild_card) + { + bw.Write((Int16)242); + write_collection_pattern_wild_card(_collection_pattern_wild_card); + } + + public void write_collection_pattern_wild_card(collection_pattern_wild_card _collection_pattern_wild_card) + { + write_pattern_parameter(_collection_pattern_wild_card); + } + + + public void visit(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + bw.Write((Int16)243); + write_collection_pattern_var_parameter(_collection_pattern_var_parameter); + } + + public void write_collection_pattern_var_parameter(collection_pattern_var_parameter _collection_pattern_var_parameter) + { + write_pattern_parameter(_collection_pattern_var_parameter); + if (_collection_pattern_var_parameter.identifier == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _collection_pattern_var_parameter.identifier.visit(this); + } + if (_collection_pattern_var_parameter.type == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _collection_pattern_var_parameter.type.visit(this); + } + } + + + public void visit(recursive_collection_parameter _recursive_collection_parameter) + { + bw.Write((Int16)244); + write_recursive_collection_parameter(_recursive_collection_parameter); + } + + public void write_recursive_collection_parameter(recursive_collection_parameter _recursive_collection_parameter) + { + write_recursive_pattern_parameter(_recursive_collection_parameter); + } + + + public void visit(recursive_pattern_parameter _recursive_pattern_parameter) + { + bw.Write((Int16)245); + write_recursive_pattern_parameter(_recursive_pattern_parameter); + } + + public void write_recursive_pattern_parameter(recursive_pattern_parameter _recursive_pattern_parameter) + { + write_pattern_parameter(_recursive_pattern_parameter); + if (_recursive_pattern_parameter.pattern == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _recursive_pattern_parameter.pattern.visit(this); + } + } + + + public void visit(tuple_pattern _tuple_pattern) + { + bw.Write((Int16)246); + write_tuple_pattern(_tuple_pattern); + } + + public void write_tuple_pattern(tuple_pattern _tuple_pattern) + { + write_pattern_node(_tuple_pattern); + } + + + public void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + bw.Write((Int16)247); + write_tuple_pattern_var_parameter(_tuple_pattern_var_parameter); + } + + public void write_tuple_pattern_var_parameter(tuple_pattern_var_parameter _tuple_pattern_var_parameter) + { + write_pattern_parameter(_tuple_pattern_var_parameter); + if (_tuple_pattern_var_parameter.identifier == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _tuple_pattern_var_parameter.identifier.visit(this); + } + if (_tuple_pattern_var_parameter.type == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _tuple_pattern_var_parameter.type.visit(this); + } + } + + + public void visit(recursive_tuple_parameter _recursive_tuple_parameter) + { + bw.Write((Int16)248); + write_recursive_tuple_parameter(_recursive_tuple_parameter); + } + + public void write_recursive_tuple_parameter(recursive_tuple_parameter _recursive_tuple_parameter) + { + write_recursive_pattern_parameter(_recursive_tuple_parameter); + } + } diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index f2e0a4cd5..439748d51 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -48150,6 +48150,196 @@ namespace PascalABCCompiler.SyntaxTree } + /// + ///Конструктор с параметрами. + /// + public pattern_node(List _parameters) + { + this._parameters=_parameters; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public pattern_node(List _parameters,SourceContext sc) + { + this._parameters=_parameters; + source_context = sc; + FillParentsInDirectChilds(); + } + public pattern_node(pattern_parameter elem, SourceContext sc = null) + { + Add(elem, sc); + FillParentsInDirectChilds(); + } + + protected List _parameters=new List(); + + /// + /// + /// + public List parameters + { + get + { + return _parameters; + } + set + { + _parameters=value; + } + } + + + public pattern_node Add(pattern_parameter elem, SourceContext sc = null) + { + parameters.Add(elem); + if (elem != null) + elem.Parent = this; + if (sc != null) + source_context = sc; + return this; + } + + public void AddFirst(pattern_parameter el) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + parameters.Insert(0, el); + FillParentsInDirectChilds(); + } + + public void AddFirst(IEnumerable els) + { + if (els == null) + throw new ArgumentNullException(nameof(els)); + parameters.InsertRange(0, els); + foreach (var el in els) + if (el != null) + el.Parent = this; + } + + public void AddMany(params pattern_parameter[] els) + { + if (els == null) + throw new ArgumentNullException(nameof(els)); + parameters.AddRange(els); + foreach (var el in els) + if (el != null) + el.Parent = this; + } + + private int FindIndexInList(pattern_parameter el) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + var ind = parameters.FindIndex(x => x == el); + if (ind == -1) + throw new Exception(string.Format("У списка {0} не найден элемент {1} среди дочерних\n", this, el)); + return ind; + } + + public void InsertAfter(pattern_parameter el, pattern_parameter newel) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newel == null) + throw new ArgumentNullException(nameof(newel)); + parameters.Insert(FindIndexInList(el) + 1, newel); + newel.Parent = this; + } + + public void InsertAfter(pattern_parameter el, IEnumerable newels) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newels == null) + throw new ArgumentNullException(nameof(newels)); + parameters.InsertRange(FindIndexInList(el) + 1, newels); + foreach (var newel in newels) + if (newel != null) + newel.Parent = this; + } + + public void InsertBefore(pattern_parameter el, pattern_parameter newel) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newel == null) + throw new ArgumentNullException(nameof(newel)); + parameters.Insert(FindIndexInList(el), newel); + newel.Parent = this; + } + + public void InsertBefore(pattern_parameter el, IEnumerable newels) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newels == null) + throw new ArgumentNullException(nameof(newels)); + parameters.InsertRange(FindIndexInList(el), newels); + foreach (var newel in newels) + if (newel != null) + newel.Parent = this; + } + + public bool Remove(pattern_parameter el) + { + return parameters.Remove(el); + } + + public void ReplaceInList(pattern_parameter el, pattern_parameter newel) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newel == null) + throw new ArgumentNullException(nameof(newel)); + parameters[FindIndexInList(el)] = newel; + newel.Parent = this; + } + + public void ReplaceInList(pattern_parameter el, IEnumerable newels) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + if (newels == null) + throw new ArgumentNullException(nameof(newels)); + var ind = FindIndexInList(el); + parameters.RemoveAt(ind); + parameters.InsertRange(ind, newels); + foreach (var newel in newels) + if (newel != null) + newel.Parent = this; + } + + public int RemoveAll(Predicate match) + { + return parameters.RemoveAll(match); + } + + public pattern_parameter Last() + { + if (parameters.Count > 0) + return parameters[parameters.Count - 1]; + throw new InvalidOperationException("Список пуст"); + } + + public int Count + { + get { return parameters.Count; } + } + + public void Insert(int pos, pattern_parameter el) + { + if (el == null) + throw new ArgumentNullException(nameof(el)); + parameters.Insert(pos,el); + if (el != null) + el.Parent = this; + } + + /// Создает копию узла public override syntax_tree_node Clone() { @@ -48157,6 +48347,19 @@ namespace PascalABCCompiler.SyntaxTree copy.Parent = this.Parent; if (source_context != null) copy.source_context = new SourceContext(source_context); + if (parameters != null) + { + foreach (pattern_parameter elem in parameters) + { + if (elem != null) + { + copy.Add((pattern_parameter)elem.Clone()); + copy.Last().Parent = copy; + } + else + copy.Add(null); + } + } return copy; } @@ -48169,12 +48372,23 @@ namespace PascalABCCompiler.SyntaxTree /// Заполняет поля Parent в непосредственных дочерних узлах public override void FillParentsInDirectChilds() { + if (parameters != null) + { + foreach (var child in parameters) + if (child != null) + child.Parent = this; + } } /// Заполняет поля Parent во всем поддереве public override void FillParentsInAllChilds() { FillParentsInDirectChilds(); + if (parameters != null) + { + foreach (var child in parameters) + child?.FillParentsInAllChilds(); + } } /// @@ -48194,7 +48408,7 @@ namespace PascalABCCompiler.SyntaxTree { get { - return 0; + return 0 + (parameters == null ? 0 : parameters.Count); } } /// @@ -48206,12 +48420,29 @@ namespace PascalABCCompiler.SyntaxTree { if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + return parameters[index_counter]; + } + } return null; } set { if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + parameters[index_counter]= (pattern_parameter)value; + return; + } + } } } /// @@ -48262,6 +48493,29 @@ namespace PascalABCCompiler.SyntaxTree source_context = sc; FillParentsInDirectChilds(); } + + /// + ///Конструктор с параметрами. + /// + public type_pattern(List _parameters,ident _identifier,type_definition _type) + { + this._parameters=_parameters; + this._identifier=_identifier; + this._type=_type; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public type_pattern(List _parameters,ident _identifier,type_definition _type,SourceContext sc) + { + this._parameters=_parameters; + this._identifier=_identifier; + this._type=_type; + source_context = sc; + FillParentsInDirectChilds(); + } protected ident _identifier; protected type_definition _type; @@ -48307,6 +48561,19 @@ namespace PascalABCCompiler.SyntaxTree copy.Parent = this.Parent; if (source_context != null) copy.source_context = new SourceContext(source_context); + if (parameters != null) + { + foreach (pattern_parameter elem in parameters) + { + if (elem != null) + { + copy.Add((pattern_parameter)elem.Clone()); + copy.Last().Parent = copy; + } + else + copy.Add(null); + } + } if (identifier != null) { copy.identifier = (ident)identifier.Clone(); @@ -48329,6 +48596,12 @@ namespace PascalABCCompiler.SyntaxTree /// Заполняет поля Parent в непосредственных дочерних узлах public override void FillParentsInDirectChilds() { + if (parameters != null) + { + foreach (var child in parameters) + if (child != null) + child.Parent = this; + } if (identifier != null) identifier.Parent = this; if (type != null) @@ -48339,6 +48612,11 @@ namespace PascalABCCompiler.SyntaxTree public override void FillParentsInAllChilds() { FillParentsInDirectChilds(); + if (parameters != null) + { + foreach (var child in parameters) + child?.FillParentsInAllChilds(); + } identifier?.FillParentsInAllChilds(); type?.FillParentsInAllChilds(); } @@ -48360,7 +48638,7 @@ namespace PascalABCCompiler.SyntaxTree { get { - return 2; + return 2 + (parameters == null ? 0 : parameters.Count); } } /// @@ -48379,6 +48657,14 @@ namespace PascalABCCompiler.SyntaxTree case 1: return type; } + Int32 index_counter=ind - 2; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + return parameters[index_counter]; + } + } return null; } set @@ -48394,6 +48680,15 @@ namespace PascalABCCompiler.SyntaxTree type = (type_definition)value; break; } + Int32 index_counter=ind - 2; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + parameters[index_counter]= (pattern_parameter)value; + return; + } + } } } /// @@ -49394,47 +49689,49 @@ namespace PascalABCCompiler.SyntaxTree /// ///Конструктор с параметрами. /// - public deconstructor_pattern(List _parameters,type_definition _type) + public deconstructor_pattern(type_definition _type,expression _const_params_check) { - this._parameters=_parameters; this._type=_type; + this._const_params_check=_const_params_check; FillParentsInDirectChilds(); } /// ///Конструктор с параметрами. /// - public deconstructor_pattern(List _parameters,type_definition _type,SourceContext sc) + public deconstructor_pattern(type_definition _type,expression _const_params_check,SourceContext sc) { - this._parameters=_parameters; this._type=_type; + this._const_params_check=_const_params_check; source_context = sc; FillParentsInDirectChilds(); } - public deconstructor_pattern(pattern_deconstructor_parameter elem, SourceContext sc = null) - { - Add(elem, sc); - FillParentsInDirectChilds(); - } - - protected List _parameters=new List(); - protected type_definition _type; /// - ///Результат деконструирования + ///Конструктор с параметрами. /// - public List parameters + public deconstructor_pattern(List _parameters,type_definition _type,expression _const_params_check) { - get - { - return _parameters; - } - set - { - _parameters=value; - } + this._parameters=_parameters; + this._type=_type; + this._const_params_check=_const_params_check; + FillParentsInDirectChilds(); } + /// + ///Конструктор с параметрами. + /// + public deconstructor_pattern(List _parameters,type_definition _type,expression _const_params_check,SourceContext sc) + { + this._parameters=_parameters; + this._type=_type; + this._const_params_check=_const_params_check; + source_context = sc; + FillParentsInDirectChilds(); + } + protected type_definition _type; + protected expression _const_params_check; + /// ///Деконструируемый тип /// @@ -49452,155 +49749,24 @@ namespace PascalABCCompiler.SyntaxTree } } + /// + ///Проверка соответствия для константных параметрах деконструирования + /// + public expression const_params_check + { + get + { + return _const_params_check; + } + set + { + _const_params_check=value; + if (_const_params_check != null) + _const_params_check.Parent = this; + } + } + - public deconstructor_pattern Add(pattern_deconstructor_parameter elem, SourceContext sc = null) - { - parameters.Add(elem); - if (elem != null) - elem.Parent = this; - if (sc != null) - source_context = sc; - return this; - } - - public void AddFirst(pattern_deconstructor_parameter el) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - parameters.Insert(0, el); - FillParentsInDirectChilds(); - } - - public void AddFirst(IEnumerable els) - { - if (els == null) - throw new ArgumentNullException(nameof(els)); - parameters.InsertRange(0, els); - foreach (var el in els) - if (el != null) - el.Parent = this; - } - - public void AddMany(params pattern_deconstructor_parameter[] els) - { - if (els == null) - throw new ArgumentNullException(nameof(els)); - parameters.AddRange(els); - foreach (var el in els) - if (el != null) - el.Parent = this; - } - - private int FindIndexInList(pattern_deconstructor_parameter el) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - var ind = parameters.FindIndex(x => x == el); - if (ind == -1) - throw new Exception(string.Format("У списка {0} не найден элемент {1} среди дочерних\n", this, el)); - return ind; - } - - public void InsertAfter(pattern_deconstructor_parameter el, pattern_deconstructor_parameter newel) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newel == null) - throw new ArgumentNullException(nameof(newel)); - parameters.Insert(FindIndexInList(el) + 1, newel); - newel.Parent = this; - } - - public void InsertAfter(pattern_deconstructor_parameter el, IEnumerable newels) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newels == null) - throw new ArgumentNullException(nameof(newels)); - parameters.InsertRange(FindIndexInList(el) + 1, newels); - foreach (var newel in newels) - if (newel != null) - newel.Parent = this; - } - - public void InsertBefore(pattern_deconstructor_parameter el, pattern_deconstructor_parameter newel) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newel == null) - throw new ArgumentNullException(nameof(newel)); - parameters.Insert(FindIndexInList(el), newel); - newel.Parent = this; - } - - public void InsertBefore(pattern_deconstructor_parameter el, IEnumerable newels) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newels == null) - throw new ArgumentNullException(nameof(newels)); - parameters.InsertRange(FindIndexInList(el), newels); - foreach (var newel in newels) - if (newel != null) - newel.Parent = this; - } - - public bool Remove(pattern_deconstructor_parameter el) - { - return parameters.Remove(el); - } - - public void ReplaceInList(pattern_deconstructor_parameter el, pattern_deconstructor_parameter newel) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newel == null) - throw new ArgumentNullException(nameof(newel)); - parameters[FindIndexInList(el)] = newel; - newel.Parent = this; - } - - public void ReplaceInList(pattern_deconstructor_parameter el, IEnumerable newels) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - if (newels == null) - throw new ArgumentNullException(nameof(newels)); - var ind = FindIndexInList(el); - parameters.RemoveAt(ind); - parameters.InsertRange(ind, newels); - foreach (var newel in newels) - if (newel != null) - newel.Parent = this; - } - - public int RemoveAll(Predicate match) - { - return parameters.RemoveAll(match); - } - - public pattern_deconstructor_parameter Last() - { - if (parameters.Count > 0) - return parameters[parameters.Count - 1]; - throw new InvalidOperationException("Список пуст"); - } - - public int Count - { - get { return parameters.Count; } - } - - public void Insert(int pos, pattern_deconstructor_parameter el) - { - if (el == null) - throw new ArgumentNullException(nameof(el)); - parameters.Insert(pos,el); - if (el != null) - el.Parent = this; - } - - /// Создает копию узла public override syntax_tree_node Clone() { @@ -49610,11 +49776,11 @@ namespace PascalABCCompiler.SyntaxTree copy.source_context = new SourceContext(source_context); if (parameters != null) { - foreach (pattern_deconstructor_parameter elem in parameters) + foreach (pattern_parameter elem in parameters) { if (elem != null) { - copy.Add((pattern_deconstructor_parameter)elem.Clone()); + copy.Add((pattern_parameter)elem.Clone()); copy.Last().Parent = copy; } else @@ -49626,6 +49792,11 @@ namespace PascalABCCompiler.SyntaxTree copy.type = (type_definition)type.Clone(); copy.type.Parent = copy; } + if (const_params_check != null) + { + copy.const_params_check = (expression)const_params_check.Clone(); + copy.const_params_check.Parent = copy; + } return copy; } @@ -49646,6 +49817,8 @@ namespace PascalABCCompiler.SyntaxTree } if (type != null) type.Parent = this; + if (const_params_check != null) + const_params_check.Parent = this; } /// Заполняет поля Parent во всем поддереве @@ -49658,6 +49831,7 @@ namespace PascalABCCompiler.SyntaxTree child?.FillParentsInAllChilds(); } type?.FillParentsInAllChilds(); + const_params_check?.FillParentsInAllChilds(); } /// @@ -49667,7 +49841,7 @@ namespace PascalABCCompiler.SyntaxTree { get { - return 1; + return 2; } } /// @@ -49677,7 +49851,7 @@ namespace PascalABCCompiler.SyntaxTree { get { - return 1 + (parameters == null ? 0 : parameters.Count); + return 2 + (parameters == null ? 0 : parameters.Count); } } /// @@ -49693,8 +49867,10 @@ namespace PascalABCCompiler.SyntaxTree { case 0: return type; + case 1: + return const_params_check; } - Int32 index_counter=ind - 1; + Int32 index_counter=ind - 2; if(parameters != null) { if(index_counter < parameters.Count) @@ -49713,13 +49889,16 @@ namespace PascalABCCompiler.SyntaxTree case 0: type = (type_definition)value; break; + case 1: + const_params_check = (expression)value; + break; } - Int32 index_counter=ind - 1; + Int32 index_counter=ind - 2; if(parameters != null) { if(index_counter < parameters.Count) { - parameters[index_counter]= (pattern_deconstructor_parameter)value; + parameters[index_counter]= (pattern_parameter)value; return; } } @@ -49739,16 +49918,16 @@ namespace PascalABCCompiler.SyntaxTree /// - ///Базовый класс параметра deconstruct + ///Базовый класс параметра для pattern_node /// [Serializable] - public partial class pattern_deconstructor_parameter : syntax_tree_node + public partial class pattern_parameter : syntax_tree_node { /// ///Конструктор без параметров. /// - public pattern_deconstructor_parameter() + public pattern_parameter() { } @@ -49756,7 +49935,7 @@ namespace PascalABCCompiler.SyntaxTree /// Создает копию узла public override syntax_tree_node Clone() { - pattern_deconstructor_parameter copy = new pattern_deconstructor_parameter(); + pattern_parameter copy = new pattern_parameter(); copy.Parent = this.Parent; if (source_context != null) copy.source_context = new SourceContext(source_context); @@ -49764,9 +49943,9 @@ namespace PascalABCCompiler.SyntaxTree } /// Получает копию данного узла корректного типа - public new pattern_deconstructor_parameter TypedClone() + public new pattern_parameter TypedClone() { - return Clone() as pattern_deconstructor_parameter; + return Clone() as pattern_parameter; } /// Заполняет поля Parent в непосредственных дочерних узлах @@ -50024,7 +50203,7 @@ namespace PascalABCCompiler.SyntaxTree ///Параметр-объявление переменной (возможно без типа) /// [Serializable] - public partial class var_deconstructor_parameter : pattern_deconstructor_parameter + public partial class var_deconstructor_parameter : pattern_parameter { /// @@ -50038,25 +50217,28 @@ namespace PascalABCCompiler.SyntaxTree /// ///Конструктор с параметрами. /// - public var_deconstructor_parameter(ident _identifier,type_definition _type) + public var_deconstructor_parameter(ident _identifier,type_definition _type,bool _var_keyword_used) { this._identifier=_identifier; this._type=_type; + this._var_keyword_used=_var_keyword_used; FillParentsInDirectChilds(); } /// ///Конструктор с параметрами. /// - public var_deconstructor_parameter(ident _identifier,type_definition _type,SourceContext sc) + public var_deconstructor_parameter(ident _identifier,type_definition _type,bool _var_keyword_used,SourceContext sc) { this._identifier=_identifier; this._type=_type; + this._var_keyword_used=_var_keyword_used; source_context = sc; FillParentsInDirectChilds(); } protected ident _identifier; protected type_definition _type; + protected bool _var_keyword_used; /// /// @@ -50092,6 +50274,21 @@ namespace PascalABCCompiler.SyntaxTree } } + /// + /// + /// + public bool var_keyword_used + { + get + { + return _var_keyword_used; + } + set + { + _var_keyword_used=value; + } + } + /// Создает копию узла public override syntax_tree_node Clone() @@ -50110,6 +50307,7 @@ namespace PascalABCCompiler.SyntaxTree copy.type = (type_definition)type.Clone(); copy.type.Parent = copy; } + copy.var_keyword_used = var_keyword_used; return copy; } @@ -50206,7 +50404,7 @@ namespace PascalABCCompiler.SyntaxTree ///Параметр-паттерн. Часть рекурсивного паттерна. /// [Serializable] - public partial class recursive_deconstructor_parameter : pattern_deconstructor_parameter + public partial class recursive_deconstructor_parameter : recursive_pattern_parameter { /// @@ -50217,6 +50415,7 @@ namespace PascalABCCompiler.SyntaxTree } + /// ///Конструктор с параметрами. /// @@ -50235,26 +50434,6 @@ namespace PascalABCCompiler.SyntaxTree source_context = sc; FillParentsInDirectChilds(); } - protected pattern_node _pattern; - - /// - /// - /// - public pattern_node pattern - { - get - { - return _pattern; - } - set - { - _pattern=value; - if (_pattern != null) - _pattern.Parent = this; - } - } - - /// Создает копию узла public override syntax_tree_node Clone() { @@ -51284,6 +51463,1811 @@ namespace PascalABCCompiler.SyntaxTree } + /// + ///паттерн для константного матчинга + /// + [Serializable] + public partial class const_pattern : pattern_node + { + + /// + ///Конструктор без параметров. + /// + public const_pattern() + { + + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern(expression_list _pattern_expressions) + { + this._pattern_expressions=_pattern_expressions; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern(expression_list _pattern_expressions,SourceContext sc) + { + this._pattern_expressions=_pattern_expressions; + source_context = sc; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern(List _parameters,expression_list _pattern_expressions) + { + this._parameters=_parameters; + this._pattern_expressions=_pattern_expressions; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern(List _parameters,expression_list _pattern_expressions,SourceContext sc) + { + this._parameters=_parameters; + this._pattern_expressions=_pattern_expressions; + source_context = sc; + FillParentsInDirectChilds(); + } + protected expression_list _pattern_expressions; + + /// + /// + /// + public expression_list pattern_expressions + { + get + { + return _pattern_expressions; + } + set + { + _pattern_expressions=value; + if (_pattern_expressions != null) + _pattern_expressions.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + const_pattern copy = new const_pattern(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (parameters != null) + { + foreach (pattern_parameter elem in parameters) + { + if (elem != null) + { + copy.Add((pattern_parameter)elem.Clone()); + copy.Last().Parent = copy; + } + else + copy.Add(null); + } + } + if (pattern_expressions != null) + { + copy.pattern_expressions = (expression_list)pattern_expressions.Clone(); + copy.pattern_expressions.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new const_pattern TypedClone() + { + return Clone() as const_pattern; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (parameters != null) + { + foreach (var child in parameters) + if (child != null) + child.Parent = this; + } + if (pattern_expressions != null) + pattern_expressions.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + if (parameters != null) + { + foreach (var child in parameters) + child?.FillParentsInAllChilds(); + } + pattern_expressions?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 1; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 1 + (parameters == null ? 0 : parameters.Count); + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return pattern_expressions; + } + Int32 index_counter=ind - 1; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + return parameters[index_counter]; + } + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + pattern_expressions = (expression_list)value; + break; + } + Int32 index_counter=ind - 1; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + parameters[index_counter]= (pattern_parameter)value; + return; + } + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class tuple_pattern_wild_card : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public tuple_pattern_wild_card() + { + + } + + /// Создает копию узла + public override syntax_tree_node Clone() + { + tuple_pattern_wild_card copy = new tuple_pattern_wild_card(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + return copy; + } + + /// Получает копию данного узла корректного типа + public new tuple_pattern_wild_card TypedClone() + { + return Clone() as tuple_pattern_wild_card; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class const_pattern_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public const_pattern_parameter() + { + + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern_parameter(expression _const_param) + { + this._const_param=_const_param; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public const_pattern_parameter(expression _const_param,SourceContext sc) + { + this._const_param=_const_param; + source_context = sc; + FillParentsInDirectChilds(); + } + protected expression _const_param; + + /// + /// + /// + public expression const_param + { + get + { + return _const_param; + } + set + { + _const_param=value; + if (_const_param != null) + _const_param.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + const_pattern_parameter copy = new const_pattern_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (const_param != null) + { + copy.const_param = (expression)const_param.Clone(); + copy.const_param.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new const_pattern_parameter TypedClone() + { + return Clone() as const_pattern_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (const_param != null) + const_param.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + const_param?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 1; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 1; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return const_param; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + const_param = (expression)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class wild_card_deconstructor_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public wild_card_deconstructor_parameter() + { + + } + + /// Создает копию узла + public override syntax_tree_node Clone() + { + wild_card_deconstructor_parameter copy = new wild_card_deconstructor_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + return copy; + } + + /// Получает копию данного узла корректного типа + public new wild_card_deconstructor_parameter TypedClone() + { + return Clone() as wild_card_deconstructor_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class collection_pattern : pattern_node + { + + /// + ///Конструктор без параметров. + /// + public collection_pattern() + { + + } + + + /// + ///Конструктор с параметрами. + /// + public collection_pattern(List _parameters) + { + this._parameters=_parameters; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public collection_pattern(List _parameters,SourceContext sc) + { + this._parameters=_parameters; + source_context = sc; + FillParentsInDirectChilds(); + } + /// Создает копию узла + public override syntax_tree_node Clone() + { + collection_pattern copy = new collection_pattern(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (parameters != null) + { + foreach (pattern_parameter elem in parameters) + { + if (elem != null) + { + copy.Add((pattern_parameter)elem.Clone()); + copy.Last().Parent = copy; + } + else + copy.Add(null); + } + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new collection_pattern TypedClone() + { + return Clone() as collection_pattern; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (parameters != null) + { + foreach (var child in parameters) + if (child != null) + child.Parent = this; + } + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + if (parameters != null) + { + foreach (var child in parameters) + child?.FillParentsInAllChilds(); + } + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0 + (parameters == null ? 0 : parameters.Count); + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + return parameters[index_counter]; + } + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + parameters[index_counter]= (pattern_parameter)value; + return; + } + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class collection_pattern_gap_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public collection_pattern_gap_parameter() + { + + } + + /// Создает копию узла + public override syntax_tree_node Clone() + { + collection_pattern_gap_parameter copy = new collection_pattern_gap_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + return copy; + } + + /// Получает копию данного узла корректного типа + public new collection_pattern_gap_parameter TypedClone() + { + return Clone() as collection_pattern_gap_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class collection_pattern_wild_card : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public collection_pattern_wild_card() + { + + } + + /// Создает копию узла + public override syntax_tree_node Clone() + { + collection_pattern_wild_card copy = new collection_pattern_wild_card(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + return copy; + } + + /// Получает копию данного узла корректного типа + public new collection_pattern_wild_card TypedClone() + { + return Clone() as collection_pattern_wild_card; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + ///Возможно без типа + /// + [Serializable] + public partial class collection_pattern_var_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public collection_pattern_var_parameter() + { + + } + + /// + ///Конструктор с параметрами. + /// + public collection_pattern_var_parameter(ident _identifier,type_definition _type) + { + this._identifier=_identifier; + this._type=_type; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public collection_pattern_var_parameter(ident _identifier,type_definition _type,SourceContext sc) + { + this._identifier=_identifier; + this._type=_type; + source_context = sc; + FillParentsInDirectChilds(); + } + protected ident _identifier; + protected type_definition _type; + + /// + /// + /// + public ident identifier + { + get + { + return _identifier; + } + set + { + _identifier=value; + if (_identifier != null) + _identifier.Parent = this; + } + } + + /// + /// + /// + public type_definition type + { + get + { + return _type; + } + set + { + _type=value; + if (_type != null) + _type.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + collection_pattern_var_parameter copy = new collection_pattern_var_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (identifier != null) + { + copy.identifier = (ident)identifier.Clone(); + copy.identifier.Parent = copy; + } + if (type != null) + { + copy.type = (type_definition)type.Clone(); + copy.type.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new collection_pattern_var_parameter TypedClone() + { + return Clone() as collection_pattern_var_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (identifier != null) + identifier.Parent = this; + if (type != null) + type.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + identifier?.FillParentsInAllChilds(); + type?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 2; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 2; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return identifier; + case 1: + return type; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + identifier = (ident)value; + break; + case 1: + type = (type_definition)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + ///Рекурсивный паттерн-параметр. + /// + [Serializable] + public partial class recursive_collection_parameter : recursive_pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public recursive_collection_parameter() + { + + } + + + /// + ///Конструктор с параметрами. + /// + public recursive_collection_parameter(pattern_node _pattern) + { + this._pattern=_pattern; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public recursive_collection_parameter(pattern_node _pattern,SourceContext sc) + { + this._pattern=_pattern; + source_context = sc; + FillParentsInDirectChilds(); + } + /// Создает копию узла + public override syntax_tree_node Clone() + { + recursive_collection_parameter copy = new recursive_collection_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (pattern != null) + { + copy.pattern = (pattern_node)pattern.Clone(); + copy.pattern.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new recursive_collection_parameter TypedClone() + { + return Clone() as recursive_collection_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (pattern != null) + pattern.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + pattern?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 1; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 1; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return pattern; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + pattern = (pattern_node)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + ///Рекурсивный паттерн-параметр. + /// + [Serializable] + public partial class recursive_pattern_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public recursive_pattern_parameter() + { + + } + + /// + ///Конструктор с параметрами. + /// + public recursive_pattern_parameter(pattern_node _pattern) + { + this._pattern=_pattern; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public recursive_pattern_parameter(pattern_node _pattern,SourceContext sc) + { + this._pattern=_pattern; + source_context = sc; + FillParentsInDirectChilds(); + } + protected pattern_node _pattern; + + /// + /// + /// + public pattern_node pattern + { + get + { + return _pattern; + } + set + { + _pattern=value; + if (_pattern != null) + _pattern.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + recursive_pattern_parameter copy = new recursive_pattern_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (pattern != null) + { + copy.pattern = (pattern_node)pattern.Clone(); + copy.pattern.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new recursive_pattern_parameter TypedClone() + { + return Clone() as recursive_pattern_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (pattern != null) + pattern.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + pattern?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 1; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 1; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return pattern; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + pattern = (pattern_node)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class tuple_pattern : pattern_node + { + + /// + ///Конструктор без параметров. + /// + public tuple_pattern() + { + + } + + + /// + ///Конструктор с параметрами. + /// + public tuple_pattern(List _parameters) + { + this._parameters=_parameters; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public tuple_pattern(List _parameters,SourceContext sc) + { + this._parameters=_parameters; + source_context = sc; + FillParentsInDirectChilds(); + } + /// Создает копию узла + public override syntax_tree_node Clone() + { + tuple_pattern copy = new tuple_pattern(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (parameters != null) + { + foreach (pattern_parameter elem in parameters) + { + if (elem != null) + { + copy.Add((pattern_parameter)elem.Clone()); + copy.Last().Parent = copy; + } + else + copy.Add(null); + } + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new tuple_pattern TypedClone() + { + return Clone() as tuple_pattern; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (parameters != null) + { + foreach (var child in parameters) + if (child != null) + child.Parent = this; + } + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + if (parameters != null) + { + foreach (var child in parameters) + child?.FillParentsInAllChilds(); + } + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0 + (parameters == null ? 0 : parameters.Count); + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + return parameters[index_counter]; + } + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + Int32 index_counter=ind - 0; + if(parameters != null) + { + if(index_counter < parameters.Count) + { + parameters[index_counter]= (pattern_parameter)value; + return; + } + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class tuple_pattern_var_parameter : pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public tuple_pattern_var_parameter() + { + + } + + /// + ///Конструктор с параметрами. + /// + public tuple_pattern_var_parameter(ident _identifier,type_definition _type) + { + this._identifier=_identifier; + this._type=_type; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public tuple_pattern_var_parameter(ident _identifier,type_definition _type,SourceContext sc) + { + this._identifier=_identifier; + this._type=_type; + source_context = sc; + FillParentsInDirectChilds(); + } + protected ident _identifier; + protected type_definition _type; + + /// + /// + /// + public ident identifier + { + get + { + return _identifier; + } + set + { + _identifier=value; + if (_identifier != null) + _identifier.Parent = this; + } + } + + /// + /// + /// + public type_definition type + { + get + { + return _type; + } + set + { + _type=value; + if (_type != null) + _type.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + tuple_pattern_var_parameter copy = new tuple_pattern_var_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (identifier != null) + { + copy.identifier = (ident)identifier.Clone(); + copy.identifier.Parent = copy; + } + if (type != null) + { + copy.type = (type_definition)type.Clone(); + copy.type.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new tuple_pattern_var_parameter TypedClone() + { + return Clone() as tuple_pattern_var_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (identifier != null) + identifier.Parent = this; + if (type != null) + type.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + identifier?.FillParentsInAllChilds(); + type?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 2; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 2; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return identifier; + case 1: + return type; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + identifier = (ident)value; + break; + case 1: + type = (type_definition)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + ///Рекурсивный паттерн-параметр. + /// + [Serializable] + public partial class recursive_tuple_parameter : recursive_pattern_parameter + { + + /// + ///Конструктор без параметров. + /// + public recursive_tuple_parameter() + { + + } + + + /// + ///Конструктор с параметрами. + /// + public recursive_tuple_parameter(pattern_node _pattern) + { + this._pattern=_pattern; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public recursive_tuple_parameter(pattern_node _pattern,SourceContext sc) + { + this._pattern=_pattern; + source_context = sc; + FillParentsInDirectChilds(); + } + /// Создает копию узла + public override syntax_tree_node Clone() + { + recursive_tuple_parameter copy = new recursive_tuple_parameter(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (pattern != null) + { + copy.pattern = (pattern_node)pattern.Clone(); + copy.pattern.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new recursive_tuple_parameter TypedClone() + { + return Clone() as recursive_tuple_parameter; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (pattern != null) + pattern.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + pattern?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 1; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 1; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return pattern; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + pattern = (pattern_node)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + } diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index a7540812a..010204bd7 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -33,7 +33,7 @@ namespace PascalABCCompiler.SyntaxTree DirectDescendants } - public enum SemanticCheckType { MatchedExpression, MatchedExpressionAndType } + public enum SemanticCheckType { MatchedExpression, MatchedExpressionAndType, MatchedExpressionAndExpression, MatchedTuple } public partial class syntax_tree_node { @@ -393,6 +393,11 @@ namespace PascalABCCompiler.SyntaxTree return new bin_expr(left, right, Operators.LogicalAND); } + public static bin_expr LogicalOr(expression left, expression right) + { + return new bin_expr(left, right, Operators.LogicalOR); + } + public override string ToString() { return string.Format("{0} {2} {1}", left, right, OperatorServices.ToString(operation_type, LanguageId.PascalABCNET)); @@ -1093,8 +1098,8 @@ namespace PascalABCCompiler.SyntaxTree public partial class simple_property { - public simple_property(ident name, type_definition type, property_accessors accessors, SourceContext sc = null) - : this(name, type, null, accessors, null, null, definition_attribute.None,proc_attribute.attr_none,false, null, sc) + public simple_property(ident name, type_definition type, property_accessors accessors, SourceContext sc = null) + : this(name, type, null, accessors, null, null, definition_attribute.None, proc_attribute.attr_none, false, null, sc) { } } @@ -1709,7 +1714,7 @@ namespace PascalABCCompiler.SyntaxTree public partial class expression { - //public object semantic_ex; + //public object semantic_ex; public expression Plus(expression e) { return new bin_expr(this, e, Operators.Plus); @@ -1814,19 +1819,12 @@ namespace PascalABCCompiler.SyntaxTree public partial class deconstructor_pattern { - public bool IsRecursive => parameters.Any(x => x is recursive_deconstructor_parameter); - public override string ToString() => $"{type}({string.Join(", ", parameters.Select(x => x.ToString()))})"; } - public partial class var_deconstructor_parameter + public partial class pattern_node { - public override string ToString() => identifier.ToString() + (type == null ? "" : $": {type}"); - } - - public partial class recursive_deconstructor_parameter - { - public override string ToString() => pattern.ToString(); + public bool IsRecursive => parameters.Any(x => x is recursive_pattern_parameter); } public partial class typecast_node @@ -1842,5 +1840,58 @@ namespace PascalABCCompiler.SyntaxTree public bool visited = false; } + public partial class var_deconstructor_parameter + { + public override string ToString() => identifier.ToString() + (type == null ? "" : $": {type}"); } + public partial class recursive_deconstructor_parameter + { + public override string ToString() => pattern.ToString(); + } + + public partial class tuple_pattern_wild_card + { + /// + ///Конструктор c параметрами + /// + public tuple_pattern_wild_card(SourceContext sc) + { + this.source_context = sc; + } + } + + public partial class collection_pattern_wild_card + { + /// + ///Конструктор c параметрами + /// + public collection_pattern_wild_card(SourceContext sc) + { + this.source_context = sc; + } + } + + public partial class collection_pattern_gap_parameter + { + /// + ///Конструктор c параметрами + /// + public collection_pattern_gap_parameter(SourceContext sc) + { + this.source_context = sc; + } + } + + public partial class wild_card_deconstructor_parameter + { + /// + ///Конструктор c параметрами + /// + public wild_card_deconstructor_parameter(SourceContext sc) + { + this.source_context = sc; + } + } +} + diff --git a/SyntaxTree/tree/Visitor.cs b/SyntaxTree/tree/Visitor.cs index d1feebca8..e8d5dfe2c 100644 --- a/SyntaxTree/tree/Visitor.cs +++ b/SyntaxTree/tree/Visitor.cs @@ -1379,11 +1379,11 @@ namespace PascalABCCompiler.SyntaxTree /// Return value is void void visit(deconstructor_pattern _deconstructor_pattern); /// - ///Method to visit pattern_deconstructor_parameter. + ///Method to visit pattern_parameter. /// - ///Node to visit + ///Node to visit /// Return value is void - void visit(pattern_deconstructor_parameter _pattern_deconstructor_parameter); + void visit(pattern_parameter _pattern_parameter); /// ///Method to visit desugared_deconstruction. /// @@ -1420,6 +1420,84 @@ namespace PascalABCCompiler.SyntaxTree ///Node to visit /// Return value is void void visit(semantic_check_sugared_var_def_statement_node _semantic_check_sugared_var_def_statement_node); + /// + ///Method to visit const_pattern. + /// + ///Node to visit + /// Return value is void + void visit(const_pattern _const_pattern); + /// + ///Method to visit tuple_pattern_wild_card. + /// + ///Node to visit + /// Return value is void + void visit(tuple_pattern_wild_card _tuple_pattern_wild_card); + /// + ///Method to visit const_pattern_parameter. + /// + ///Node to visit + /// Return value is void + void visit(const_pattern_parameter _const_pattern_parameter); + /// + ///Method to visit wild_card_deconstructor_parameter. + /// + ///Node to visit + /// Return value is void + void visit(wild_card_deconstructor_parameter _wild_card_deconstructor_parameter); + /// + ///Method to visit collection_pattern. + /// + ///Node to visit + /// Return value is void + void visit(collection_pattern _collection_pattern); + /// + ///Method to visit collection_pattern_gap_parameter. + /// + ///Node to visit + /// Return value is void + void visit(collection_pattern_gap_parameter _collection_pattern_gap_parameter); + /// + ///Method to visit collection_pattern_wild_card. + /// + ///Node to visit + /// Return value is void + void visit(collection_pattern_wild_card _collection_pattern_wild_card); + /// + ///Method to visit collection_pattern_var_parameter. + /// + ///Node to visit + /// Return value is void + void visit(collection_pattern_var_parameter _collection_pattern_var_parameter); + /// + ///Method to visit recursive_collection_parameter. + /// + ///Node to visit + /// Return value is void + void visit(recursive_collection_parameter _recursive_collection_parameter); + /// + ///Method to visit recursive_pattern_parameter. + /// + ///Node to visit + /// Return value is void + void visit(recursive_pattern_parameter _recursive_pattern_parameter); + /// + ///Method to visit tuple_pattern. + /// + ///Node to visit + /// Return value is void + void visit(tuple_pattern _tuple_pattern); + /// + ///Method to visit tuple_pattern_var_parameter. + /// + ///Node to visit + /// Return value is void + void visit(tuple_pattern_var_parameter _tuple_pattern_var_parameter); + /// + ///Method to visit recursive_tuple_parameter. + /// + ///Node to visit + /// Return value is void + void visit(recursive_tuple_parameter _recursive_tuple_parameter); } diff --git a/SyntaxTree/tree/tree.xml b/SyntaxTree/tree/tree.xml index dbf843a02..ab6e1431f 100644 --- a/SyntaxTree/tree/tree.xml +++ b/SyntaxTree/tree/tree.xml @@ -2865,7 +2865,9 @@ - + + + @@ -2954,8 +2956,8 @@ - + @@ -2967,7 +2969,7 @@ - + @@ -2994,10 +2996,11 @@ - + + @@ -3009,10 +3012,8 @@ - - - - + + @@ -3056,6 +3057,174 @@ + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + + + + + + + + + + 0 + + + 9 + + + + + + + + + 0 + + + 9 + + + Tree.cs @@ -3081,7 +3250,7 @@ - + @@ -3118,6 +3287,8 @@ + + @@ -3132,6 +3303,7 @@ + @@ -3328,6 +3500,17 @@ + + + + + + + + + + + @@ -3346,6 +3529,10 @@ + + + + @@ -3356,6 +3543,11 @@ + + + + + @@ -3393,6 +3585,7 @@ + @@ -3512,6 +3705,8 @@ + + @@ -3706,6 +3901,7 @@ + @@ -3936,6 +4132,8 @@ + + @@ -4078,8 +4276,15 @@ + + + + + + + @@ -4280,6 +4485,12 @@ + + + + + + @@ -4444,6 +4655,7 @@ + @@ -4537,6 +4749,9 @@ + + + diff --git a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs index d99df9810..68faacbe8 100644 --- a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs @@ -46,7 +46,7 @@ namespace SyntaxVisitors.SugarVisitors { var result = new List(); result.Add(CastVariableDefinition); - result.Add(new desugared_deconstruction(DeconstructionVariables, CastVariable, patternContext)); + result.Add(new desugared_deconstruction(DeconstructionVariables, CastVariable, patternContext)); result.Add(SuccessVariableDefinition); return result; @@ -60,23 +60,52 @@ namespace SyntaxVisitors.SugarVisitors } } + public class CollectionDesugaringResult + { + public List VarParametersDeclarations { get; set; } = new List(); + + public expression SuccessMatchingCheck { get; set; } + + public expression CollectionLengthCheck { get; set; } + + public List ElemTypeChecks { get; set; } = new List(); + } + + public class TupleDesugaringResult + { + public List VarParametersDeclarations { get; set; } = new List(); + + public expression SuccessMatchingCheck { get; set; } + + public statement TupleLengthCheck { get; set; } + + public List ElemTypeChecks { get; set; } = new List(); + } + public class PatternsDesugaringVisitor : BaseChangeVisitor { private enum PatternLocation { Unknown, IfCondition, Assign } private const string DeconstructMethodName = compiler_string_consts.deconstruct_method_name; private const string IsTestMethodName = compiler_string_consts.is_test_function_name; + private const string WildCardsTupleEqualFunctionName = compiler_string_consts.wild_cards_tuple_equal_function_name; + private const string SeqFunctionName = compiler_string_consts.seq_function_name; + private const string CountPropertyName = compiler_string_consts.count_property_name; private const string GeneratedPatternNamePrefix = "<>pattern"; + private const string GeneratedDeconstructParamPrefix = "<>deconstructParam"; private int generalVariableCounter = 0; private int successVariableCounter = 0; private int labelVariableCounter = 0; + private int deconstructParamVariableCounter = 0; private if_node _previousIf; private statement desugaredMatchWith; - private List processedIfNodes = new List(); + //const matching + private List typeChecks = new List(); + public static PatternsDesugaringVisitor New => new PatternsDesugaringVisitor(); public override void visit(match_with matchWith) @@ -95,26 +124,45 @@ namespace SyntaxVisitors.SugarVisitors if (patternCase == null) continue; - if (patternCase.pattern is deconstructor_pattern) + switch (patternCase.pattern) { - // Проверяем встречался ли уже такой тип при деконструкции - // SSM 02.01.19 пока закомментировал этот кусок т.к. при этом коде падает стандартный пример ArithmSimplify.cs. #1408 снова открыл - /*var deconstructionType = (patternCase.pattern as deconstructor_pattern). - type as named_type_reference; - if (deconstructionType != null && - deconstructionType.names != null && - deconstructionType.names.Count != 0) - { - var deconstructionTypeName = deconstructionType.names[0].name; - if (usedDeconstructionTypes.Contains(deconstructionTypeName)) + case deconstructor_pattern pattern: { - throw new SyntaxVisitorError("REPEATED_DECONSTRUCTION_TYPE", - patternCase.pattern.source_context); - } - usedDeconstructionTypes.Add(deconstructionTypeName); - } */ + // Проверяем встречался ли уже такой тип при деконструкции + // SSM 02.01.19 пока закомментировал этот кусок т.к. при этом коде падает стандартный пример ArithmSimplify.cs. #1408 снова открыл + /*var deconstructionType = (patternCase.pattern as deconstructor_pattern). + type as named_type_reference; + if (deconstructionType != null && + deconstructionType.names != null && + deconstructionType.names.Count != 0) + { + var deconstructionTypeName = deconstructionType.names[0].name; + if (usedDeconstructionTypes.Contains(deconstructionTypeName)) + { + throw new SyntaxVisitorError("REPEATED_DECONSTRUCTION_TYPE", + patternCase.pattern.source_context); + } + usedDeconstructionTypes.Add(deconstructionTypeName); + } */ - DesugarDeconstructorPatternCase(matchWith.expr, patternCase); + DesugarDeconstructorPatternCase(matchWith.expr, patternCase); + break; + } + case const_pattern p: + { + DesugarConstPatternCase(matchWith.expr, patternCase); + break; + } + case collection_pattern p: + { + DesugarDeconstructorPatternCase(matchWith.expr, patternCase); + break; + } + case tuple_pattern p: + { + DesugarDeconstructorPatternCase(matchWith.expr, patternCase); + break; + } } } @@ -124,6 +172,11 @@ namespace SyntaxVisitors.SugarVisitors if (desugaredMatchWith == null) desugaredMatchWith = new empty_statement(); + if (typeChecks.Count != 0) + { + typeChecks.Add(desugaredMatchWith); + desugaredMatchWith = new statement_list(typeChecks); + } // Замена выражения match with на новое несахарное поддерево и его обход ReplaceUsingParent(matchWith, desugaredMatchWith); visit(desugaredMatchWith); @@ -135,21 +188,247 @@ namespace SyntaxVisitors.SugarVisitors throw new SyntaxVisitorError("PATTERN_MATHING_IS_NOT_SUPPORTED_IN_THIS_CONTEXT", isPatternExpr.source_context); Debug.Assert(GetAscendant(isPatternExpr) != null, "Couldn't find statement list in upper nodes"); - + DesugarIsExpression(isPatternExpr); } - void DesugarDeconstructorPatternCase(expression matchingExpression, pattern_case patternCase) + private void DesugarDeconstructorPatternCase(expression matchingExpression, pattern_case patternCase) { - Debug.Assert(patternCase.pattern is deconstructor_pattern); - - var isExpression = new is_pattern_expr(matchingExpression, patternCase.pattern); + //var paramCheckExpr = DesugarDeconstructorPatternParameters(patternCase.pattern as deconstructor_pattern); + + var isExpression = new is_pattern_expr(matchingExpression, patternCase.pattern, patternCase.source_context); var ifCondition = patternCase.condition == null ? (expression)isExpression : bin_expr.LogicalAnd(isExpression, patternCase.condition); var ifCheck = SubtreeCreator.CreateIf(ifCondition, patternCase.case_action); // Добавляем полученные statements в результат AddDesugaredCaseToResult(ifCheck, ifCheck); } + + private type_definition GetTypeDefinitionForConstParam(expression constParamExpr) + { + switch (constParamExpr) + { + case string_const type: + return new named_type_reference("string"); + case char_const type: + return new named_type_reference("char"); + case int32_const type: + return new named_type_reference("integer"); + case int64_const type: + return new named_type_reference("integer"); + case double_const type: + return new named_type_reference("double"); + } + return null; + } + + private expression DesugarDeconstructorPatternParameters(deconstructor_pattern pattern) + { + expression paramCheckExpr = null; + + for (int i = 0; i < pattern.parameters.Count; ++i) + { + if (pattern.parameters[i] is const_pattern_parameter constPattern) + { + var constParamIdent = new ident(NewDeconstructParamId(), pattern.parameters[i].source_context); + + var eqParams = new expression_list( + new List() + { + constPattern.const_param, + constParamIdent + } + ); + + var constParamCheck = new method_call( + new dot_node(new ident("object"), new ident("Equals")), + eqParams, + pattern.source_context + ); + + pattern.parameters[i] = new var_deconstructor_parameter( + constParamIdent, + GetTypeDefinitionForConstParam(constPattern.const_param), + false, + pattern.parameters[i].source_context); + + paramCheckExpr = paramCheckExpr == null ? (expression)constParamCheck : bin_expr.LogicalAnd(paramCheckExpr, constParamCheck); + } + + if (pattern.parameters[i] is wild_card_deconstructor_parameter) + { + var wildCardGeneratedParamIdent = new ident(NewDeconstructParamId(), pattern.parameters[i].source_context); + pattern.parameters[i] = new var_deconstructor_parameter( + wildCardGeneratedParamIdent, + null, + false, + pattern.parameters[i].source_context); + } + + if (pattern.parameters[i] is recursive_deconstructor_parameter deconstructor_param) + { + if (deconstructor_param.pattern is deconstructor_pattern deconstructor_pattern) + { + var recursiveChecks = DesugarDeconstructorPatternParameters(deconstructor_pattern); + paramCheckExpr = paramCheckExpr == null ? + recursiveChecks : + bin_expr.LogicalAnd(paramCheckExpr, recursiveChecks); + } + } + } + return paramCheckExpr; + } + + private void DesugarConstPatternCase(expression matchingExpression, pattern_case patternCase) + { + Debug.Assert(patternCase.pattern is const_pattern); + var patternExpressionNode = patternCase.pattern as const_pattern; + + var statementsToAdd = new List(); + var equalCalls = new List(); + + foreach (var patternExpression in patternExpressionNode.pattern_expressions.expressions) + { + statementsToAdd.Add(GetTypeCompatibilityCheck(matchingExpression, patternExpression)); + + // Matching not tuples + var eqParams = new expression_list( + new List() + { + matchingExpression, + patternExpression + } + ); + equalCalls.Add( + new method_call( + new dot_node(new ident("object"), new ident("Equals")), + eqParams, + patternCase.source_context + ) + ); + } + typeChecks.AddRange(statementsToAdd); + + expression orPatternCases = equalCalls[0]; + for (int i = 1; i < equalCalls.Count; ++i) + { + orPatternCases = bin_expr.LogicalOr(orPatternCases, equalCalls[i]); + } + var ifCondition = patternCase.condition == null ? orPatternCases : bin_expr.LogicalAnd(orPatternCases, patternCase.condition); + var ifCheck = SubtreeCreator.CreateIf(ifCondition, patternCase.case_action); + + // Добавляем полученные statements в результат + AddDesugaredCaseToResult(ifCheck, ifCheck); + } + + private expression GetCollectionItemsEqualCheckBeforeGap(addressed_value matchingExpression, + List toCompare, + CollectionDesugaringResult desugaringResult) + { + var fromIndex = 0; + expression equalChecks = null; + foreach (var param in toCompare) + { + if (param is const_pattern_parameter constParam) + { + var indexerCall = new indexer( + matchingExpression, + new expression_list( + new int32_const(fromIndex, matchingExpression.source_context), + matchingExpression.source_context), + matchingExpression.source_context); + + var eqParams = new expression_list( + new List() + { + indexerCall, + constParam.const_param + } + ); + + var equalCall = new method_call( + new dot_node( + new ident("object"), + new ident("Equals")), + eqParams, + matchingExpression.source_context + ); + + equalChecks = equalChecks == null ? (expression)equalCall : bin_expr.LogicalAnd(equalChecks, equalCall); + desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(constParam.const_param, indexerCall)); + } + + if (param is collection_pattern_var_parameter varParam) + { + desugaringResult.VarParametersDeclarations.Add( + new var_statement(varParam.identifier, + GetIndexerCallForCollectionPattern(matchingExpression as addressed_value, fromIndex))); + } + ++fromIndex; + } + return equalChecks; + } + + private expression GetCollectionItemsEqualCheckAfterGap(addressed_value matchingExpression, + List toCompare, + CollectionDesugaringResult desugaringResult) + { + var elemFromTail = 1; + expression equalChecks = null; + foreach (var param in toCompare) + { + var indexerCall = new indexer( + matchingExpression, + new expression_list( + new bin_expr( + new method_call( + new dot_node( + matchingExpression, + new ident("Count", matchingExpression.source_context)), + new expression_list()), + new int32_const(elemFromTail, matchingExpression.source_context), + Operators.Minus), + matchingExpression.source_context), + matchingExpression.source_context); + + if (param is const_pattern_parameter constParam) + { + var eqParams = new expression_list( + new List() + { + indexerCall, + constParam.const_param + } + ); + + var equalCall = new method_call( + new dot_node( + new ident("object"), + new ident("Equals")), + eqParams, + matchingExpression.source_context + ); + + equalChecks = equalChecks == null ? (expression)equalCall : bin_expr.LogicalAnd(equalChecks, equalCall); + desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(constParam.const_param, indexerCall)); + } + + if (param is collection_pattern_var_parameter varParam) + { + desugaringResult.VarParametersDeclarations.Add( + new var_statement(varParam.identifier, indexerCall)); + } + + ++elemFromTail; + } + return equalChecks; + } + + private expression GetIndexerCallForCollectionPattern(addressed_value matchingExpression, int ind) + { + var indexerCall = new indexer(matchingExpression, new int32_const(ind), matchingExpression.source_context); + return indexerCall; + } private ident NewGeneralName() => new ident(GeneratedPatternNamePrefix + "GenVar" + generalVariableCounter++); @@ -179,7 +458,7 @@ namespace SyntaxVisitors.SugarVisitors _previousIf = newIf; } - private DeconstructionDesugaringResult DesugarPattern(deconstructor_pattern pattern, expression matchingExpression) + private DeconstructionDesugaringResult DesugarDeconstructorPattern(deconstructor_pattern pattern, expression matchingExpression) { Debug.Assert(!pattern.IsRecursive, "All recursive patterns should be desugared into simple patterns at this point"); @@ -207,23 +486,153 @@ namespace SyntaxVisitors.SugarVisitors return desugarResult; } + private CollectionDesugaringResult DesugarCollectionPattern(collection_pattern pattern, expression matchingExpression) + { + Debug.Assert(!pattern.IsRecursive, "All recursive patterns should be desugared into simple patterns at this point"); + + var desugaringResult = new CollectionDesugaringResult(); + var collectionItems = pattern.parameters; + var gapItemMet = false; + var gapIndex = 0; + var exprBeforeGap = new List(); + var exprAfterGap = new List(); + for (int i = 0; i < collectionItems.Count; ++i) + { + if (collectionItems[i] is collection_pattern_gap_parameter) + { + if (gapItemMet) + { + throw new SyntaxVisitorError("REPEATED_DOTDOT_COLLECTION_PATTERN_EXPR", + pattern.source_context); + } + gapItemMet = true; + gapIndex = i; + continue; + } + + if (gapItemMet) + { + exprAfterGap.Insert(0, collectionItems[i]); + } + else + { + exprBeforeGap.Add(collectionItems[i]); + } + } + + var successMatchingCheck = GetCollectionItemsEqualCheckBeforeGap( + matchingExpression as addressed_value, exprBeforeGap, desugaringResult); + + if (gapItemMet && exprAfterGap.Count != 0) + { + var afterGapEqual = GetCollectionItemsEqualCheckAfterGap( + matchingExpression as addressed_value, exprAfterGap, desugaringResult); + + if (afterGapEqual != null) + { + successMatchingCheck = successMatchingCheck == null ? + afterGapEqual : + bin_expr.LogicalAnd(successMatchingCheck, afterGapEqual); + } + } + // если добавлять в and, то все равно ран тайм эррор, будто вычисляет все, даже если первое = false + desugaringResult.CollectionLengthCheck = new bin_expr( + new dot_node(matchingExpression as addressed_value, new ident(CountPropertyName), pattern.source_context), + new int32_const(exprBeforeGap.Count + exprAfterGap.Count), + Operators.GreaterEqual, + pattern.source_context + ); + + if (!gapItemMet) + { + var lengthWithoutGapCheck = new bin_expr( + new dot_node(matchingExpression as addressed_value, new ident(CountPropertyName), pattern.source_context), + new int32_const(exprBeforeGap.Count), + Operators.Equal, + pattern.source_context + ); + successMatchingCheck = successMatchingCheck == null ? + lengthWithoutGapCheck : + bin_expr.LogicalAnd(lengthWithoutGapCheck, successMatchingCheck); + } + + desugaringResult.SuccessMatchingCheck = successMatchingCheck == null ? + new bool_const(true) : + successMatchingCheck; + return desugaringResult; + } + + private TupleDesugaringResult DesugarTuplePattern(tuple_pattern pattern, expression matchingExpression) + { + Debug.Assert(!pattern.IsRecursive, "All recursive patterns should be desugared into simple patterns at this point"); + var desugaringResult = new TupleDesugaringResult(); + var tupleItems = pattern.parameters; + + for (int i = 0; i < tupleItems.Count; ++i) + { + var tupleItemCall = new dot_node( + matchingExpression as addressed_value, + new ident("Item" + (i + 1).ToString()), + matchingExpression.source_context); + if (tupleItems[i] is tuple_pattern_var_parameter varParam) + { + desugaringResult.VarParametersDeclarations.Add( + new var_statement( + varParam.identifier, + tupleItemCall, + matchingExpression.source_context + ) + ); + } + + if (tupleItems[i] is const_pattern_parameter constParam) + { + var eqParams = new expression_list( + new List() + { + tupleItemCall, + constParam.const_param + } + ); + var equalCall = new method_call( + new dot_node(new ident("object"), new ident("Equals")), + eqParams, + pattern.source_context + ); + + desugaringResult.SuccessMatchingCheck = desugaringResult.SuccessMatchingCheck == null ? + (expression)equalCall : + bin_expr.LogicalAnd(desugaringResult.SuccessMatchingCheck, equalCall); + desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(constParam.const_param, tupleItemCall)); + } + } + + desugaringResult.TupleLengthCheck = GetTypeCompatibilityCheck(matchingExpression, new int32_const(tupleItems.Count)); + + if (desugaringResult.SuccessMatchingCheck == null) + { + desugaringResult.SuccessMatchingCheck = new bool_const(true); + } + return desugaringResult; + } + private void DesugarIsExpression(is_pattern_expr isPatternExpr) { - Debug.Assert(isPatternExpr.right is deconstructor_pattern); - - var patternLocation = GetLocation(isPatternExpr); - - var pattern = isPatternExpr.right as deconstructor_pattern; - - //AddDefinitionsInUpperStatementList(isPatternExpr, new[] { GetTypeCompatibilityCheck(isPatternExpr) }); - if (pattern.IsRecursive) + if (isPatternExpr.right.IsRecursive) { - var desugaredRecursiveIs = DesugarRecursiveDeconstructor(isPatternExpr.left, pattern); + var desugaredRecursiveIs = DesugarRecursiveParameters(isPatternExpr.left, isPatternExpr.right); ReplaceUsingParent(isPatternExpr, desugaredRecursiveIs); desugaredRecursiveIs.visit(this); return; } + var patternLocation = GetLocation(isPatternExpr); + if (isPatternExpr.right is deconstructor_pattern pattern) + { + var constParamCheck = DesugarDeconstructorPatternParameters(isPatternExpr.right as deconstructor_pattern); + pattern.const_params_check = constParamCheck; + } + //AddDefinitionsInUpperStatementList(isPatternExpr, new[] { GetTypeCompatibilityCheck(isPatternExpr) }); switch (patternLocation) { case PatternLocation.IfCondition: DesugarIsExpressionInIfCondition(isPatternExpr); break; @@ -231,54 +640,70 @@ namespace SyntaxVisitors.SugarVisitors } } - private expression DesugarRecursiveDeconstructor(expression expression, deconstructor_pattern pattern) + private expression DesugarRecursiveParameters(expression expression, pattern_node pattern) { - List parameters = pattern.parameters; - expression conjunction = new is_pattern_expr(expression, pattern); + List parameters = pattern.parameters; + expression conjunction = new is_pattern_expr(expression, pattern, pattern.source_context); for (int i = 0; i < parameters.Count; i++) { - if (parameters[i] is recursive_deconstructor_parameter parameter) + if (parameters[i] is recursive_pattern_parameter parameter) { //var parameterType = (parameter.pattern as deconstructor_pattern).type; var newName = NewGeneralName(); - var varParameter = new var_deconstructor_parameter(newName, null); + pattern_parameter varParameter = null; + if (pattern is deconstructor_pattern) + { + varParameter = new var_deconstructor_parameter(newName, null, false); + } + else if (pattern is collection_pattern) + { + varParameter = new collection_pattern_var_parameter(newName, null); + } + else if (pattern is tuple_pattern) + { + varParameter = new tuple_pattern_var_parameter(newName, null); + } parameters[i] = varParameter; varParameter.Parent = parameters[i]; - conjunction = bin_expr.LogicalAnd(conjunction, DesugarRecursiveDeconstructor(newName, parameter.pattern as deconstructor_pattern)); + conjunction = bin_expr.LogicalAnd(conjunction, DesugarRecursiveParameters(newName, parameter.pattern)); } } - return conjunction; } private void DesugarIsExpressionInAssignment(is_pattern_expr isExpression) { - var pattern = isExpression.right as deconstructor_pattern; - var desugaringResult = DesugarPattern(pattern, isExpression.left); - ReplaceUsingParent(isExpression, desugaringResult.SuccessVariable); - - var statementsToAdd = desugaringResult.GetDeconstructionDefinitions(pattern.source_context); - statementsToAdd.Add(GetMatchedExpressionCheck(isExpression.left)); - statementsToAdd.Add(GetTypeCompatibilityCheck(isExpression)); - statementsToAdd.Add(desugaringResult.GetPatternCheckWithDeconstrunctorCall()); - + // TODO: Кинуть тут эксепшн + Debug.Assert(isExpression.right is deconstructor_pattern, "Only deconstructor patterns can be used in assignment"); + var statementsToAdd = ProcessDesugaringForDeconstructorPattern(isExpression); AddDefinitionsInUpperStatementList(isExpression, statementsToAdd); } private void DesugarIsExpressionInIfCondition(is_pattern_expr isExpression) { - var pattern = isExpression.right as deconstructor_pattern; - var desugaringResult = DesugarPattern(pattern, isExpression.left); - ReplaceUsingParent(isExpression, desugaringResult.SuccessVariable); + List statementsToAdd = null; - var statementsToAdd = desugaringResult.GetDeconstructionDefinitions(pattern.source_context); - statementsToAdd.Add(GetMatchedExpressionCheck(isExpression.left)); - statementsToAdd.Add(GetTypeCompatibilityCheck(isExpression)); - statementsToAdd.Add(desugaringResult.GetPatternCheckWithDeconstrunctorCall()); + switch (isExpression.right) + { + case deconstructor_pattern dp: + if (dp.const_params_check != null) + { + var ifToAddConstParamsCheckTo = GetAscendant(isExpression); + ifToAddConstParamsCheckTo.condition = bin_expr.LogicalAnd(ifToAddConstParamsCheckTo.condition, dp.const_params_check); + } + statementsToAdd = ProcessDesugaringForDeconstructorPattern(isExpression); + break; + case collection_pattern cp: + statementsToAdd = ProcessDesugaringForCollectionPattern(isExpression); + break; + case tuple_pattern cp: + statementsToAdd = ProcessDesugaringForTuplePattern(isExpression); + break; + } var enclosingIf = GetAscendant(isExpression); // Если уже обрабатывался ранее (второй встретившийся в том же условии is), то не изменяем if - if (processedIfNodes.Contains(enclosingIf)) + if (processedIfNodes.Contains(enclosingIf)) AddDefinitionsInUpperStatementList(isExpression, statementsToAdd); // Иначе помещаем определения и if-then в отдельный блок, а else после этого блока else @@ -294,12 +719,77 @@ namespace SyntaxVisitors.SugarVisitors } } + private List ProcessDesugaringForDeconstructorPattern(is_pattern_expr isExpression) + { + var pattern = isExpression.right as deconstructor_pattern; + var desugaringResult = DesugarDeconstructorPattern(pattern, isExpression.left); + /* + var isParent = isExpression.Parent; + expression isReplacement = isExpression; + + while (!(isParent is if_node)) + { + if (isParent is bin_expr binParent) + { + if (binParent.right == isReplacement) + { + isReplacement = new bin_expr(binParent.left, binParent.right, binParent.operation_type, binParent.source_context); + } + if (binParent.left == isReplacement) + { + isReplacement = binParent.left; + } + } + isParent = isParent.Parent; + }*/ + ReplaceUsingParent(isExpression, desugaringResult.SuccessVariable); + var statementsToAdd = desugaringResult.GetDeconstructionDefinitions(pattern.source_context); + statementsToAdd.Add(GetMatchedExpressionCheck(isExpression.left)); + statementsToAdd.Add(GetTypeCompatibilityCheck(isExpression)); + statementsToAdd.Add(desugaringResult.GetPatternCheckWithDeconstrunctorCall()); + + return statementsToAdd; + } + + private List ProcessDesugaringForCollectionPattern(is_pattern_expr isExpression) + { + var pattern = isExpression.right as collection_pattern; + var desugaringResult = DesugarCollectionPattern(pattern, isExpression.left); + ReplaceUsingParent(isExpression, desugaringResult.SuccessMatchingCheck); + + var statementsToAdd = new List(); + statementsToAdd.AddRange(desugaringResult.VarParametersDeclarations); + statementsToAdd.AddRange(desugaringResult.ElemTypeChecks); + return statementsToAdd; + } + + private List ProcessDesugaringForTuplePattern(is_pattern_expr isExpression) + { + var pattern = isExpression.right as tuple_pattern; + var desugaringResult = DesugarTuplePattern(pattern, isExpression.left); + ReplaceUsingParent(isExpression, desugaringResult.SuccessMatchingCheck); + + var statementsToAdd = new List(); + statementsToAdd.Add(desugaringResult.TupleLengthCheck); + statementsToAdd.AddRange(desugaringResult.VarParametersDeclarations); + statementsToAdd.AddRange(desugaringResult.ElemTypeChecks); + + return statementsToAdd; + } + private semantic_check_sugared_statement_node GetMatchedExpressionCheck(expression matchedExpression) => new semantic_check_sugared_statement_node(SemanticCheckType.MatchedExpression, new List() { matchedExpression }); private semantic_check_sugared_statement_node GetTypeCompatibilityCheck(is_pattern_expr expression) => new semantic_check_sugared_statement_node(SemanticCheckType.MatchedExpressionAndType, new List() { expression.left, (expression.right as deconstructor_pattern).type }); + private semantic_check_sugared_statement_node GetTypeCompatibilityCheck(expression expression1, expression expression2) => + new semantic_check_sugared_statement_node(SemanticCheckType.MatchedExpressionAndExpression, new List() { expression1, expression2 }); + + private semantic_check_sugared_statement_node GetTypeCompatibilityCheck(expression tuple, int32_const length) => + new semantic_check_sugared_statement_node(SemanticCheckType.MatchedTuple, new List() { tuple, length }); + + private statement_list ConvertIfNode(if_node ifNode, List statementsBeforeIf, out statement elseBody) { // if e then else @@ -397,12 +887,12 @@ namespace SyntaxVisitors.SugarVisitors private PatternLocation GetLocation(syntax_tree_node node) { var firstStatement = GetAscendant(node); - + switch (firstStatement) { case if_node _: return PatternLocation.IfCondition; case var_statement _: return PatternLocation.Assign; - case assign _ : return PatternLocation.Assign; + case assign _: return PatternLocation.Assign; default: return PatternLocation.Unknown; } } @@ -421,6 +911,11 @@ namespace SyntaxVisitors.SugarVisitors return null; } + + private string NewDeconstructParamId() + { + return GeneratedPatternNamePrefix + "DeconstructParam" + deconstructParamVariableCounter++.ToString(); + } } } diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 736b2ab80..0cd5b1892 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1971,6 +1971,37 @@ function KV(key: TKey; value: TVal): KeyValuePair; function __TypeCheckAndAssignForIsMatch(obj: object; var res: T): boolean; +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + + // ----------------------------------------------------- // Стандартные классы исключений // ----------------------------------------------------- @@ -4486,6 +4517,112 @@ begin end; end; +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + 5: Result := Result and first.Item6.Equals(second.Item6); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + 5: Result := Result and first.Item6.Equals(second.Item6); + 6: Result := Result and first.Item7.Equals(second.Item7); + end; +end; +end; + + ///-- procedure Deconstruct(self: T; var res: T); extensionmethod; begin diff --git a/TestSuite/patterns/patterns-collection-matching1.pas b/TestSuite/patterns/patterns-collection-matching1.pas new file mode 100644 index 000000000..34e5b59f5 --- /dev/null +++ b/TestSuite/patterns/patterns-collection-matching1.pas @@ -0,0 +1,10 @@ +begin + var a := Arr(1, 9, 8, 7, 2, 3, 4, 5); + var c: procedure := () -> begin + match a with + [.., 4, var x]: assert(x = 5); + end; + end; + + c; +end. \ No newline at end of file diff --git a/TestSuite/patterns/patterns-collection-matching2.pas b/TestSuite/patterns/patterns-collection-matching2.pas new file mode 100644 index 000000000..17c20f571 --- /dev/null +++ b/TestSuite/patterns/patterns-collection-matching2.pas @@ -0,0 +1,46 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + + public + name: string; + age: integer; + card: CardInfo; + + constructor(name: string; age: integer; card: CardInfo); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: CardInfo); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var p1 := new Person('Вася', 11, new CardInfo('12345671', 321)); + var p2 := new Person('Петя', 12, new CardInfo('12345672', 322)); + var p3 := new Person('Маша', 13, new CardInfo('12345673', 323)); + var personArr := Arr(p1, p2, p3); + + // Расширенный is + if personArr is [Person(name1, 11, CardInfo(_, cv)), _, Person(name2, 13, _)] then + assert(name1.Equals('Вася') and (cv = 321) and name2.Equals('Маша')); + + // match .. with + match personArr with + [_, _, Person('Вася', var age, _)]: assert(false); + [var p, .., Person('Маша', _, _)]: assert((p as Person).name.Equals('Вася')); + [..]: assert(false); + end; +end. \ No newline at end of file diff --git a/TestSuite/patterns/patterns-collection-matching3.pas b/TestSuite/patterns/patterns-collection-matching3.pas new file mode 100644 index 000000000..e542f0f32 --- /dev/null +++ b/TestSuite/patterns/patterns-collection-matching3.pas @@ -0,0 +1,43 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + name: string; + age: integer; + card: List := new List(); + + constructor(name: string; age: integer; card: List); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: List); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var cards := new List(); + cards.Add(new CardInfo('12345671', 321)); + cards.Add(new CardInfo('12345672', 322)); + cards.Add(new CardInfo('12345673', 323)); + cards.Add(new CardInfo('12345674', 324)); + + var p := new Person('Вася', 21, cards); + + // match .. with + match p with + Person('Петя', _, _): assert(false); + Person('Вася', _, [_, _, var x]): assert(false); + Person(name, _, [CardInfo(_, 321), .., CardInfo(_, 324)]): assert(name.Equals('Вася')); + end; +end. \ No newline at end of file diff --git a/TestSuite/patterns-deconstruct-default.pas b/TestSuite/patterns/patterns-deconstruct-default.pas similarity index 100% rename from TestSuite/patterns-deconstruct-default.pas rename to TestSuite/patterns/patterns-deconstruct-default.pas diff --git a/TestSuite/patterns-deconstruct-generic-extension.pas b/TestSuite/patterns/patterns-deconstruct-generic-extension.pas similarity index 100% rename from TestSuite/patterns-deconstruct-generic-extension.pas rename to TestSuite/patterns/patterns-deconstruct-generic-extension.pas diff --git a/TestSuite/patterns-is-in-lambda.pas b/TestSuite/patterns/patterns-is-in-lambda.pas similarity index 100% rename from TestSuite/patterns-is-in-lambda.pas rename to TestSuite/patterns/patterns-is-in-lambda.pas diff --git a/TestSuite/patterns-is-nested-if.pas b/TestSuite/patterns/patterns-is-nested-if.pas similarity index 100% rename from TestSuite/patterns-is-nested-if.pas rename to TestSuite/patterns/patterns-is-nested-if.pas diff --git a/TestSuite/patterns-is-recursive.pas b/TestSuite/patterns/patterns-is-recursive.pas similarity index 100% rename from TestSuite/patterns-is-recursive.pas rename to TestSuite/patterns/patterns-is-recursive.pas diff --git a/TestSuite/patterns-is-yield-test.pas b/TestSuite/patterns/patterns-is-yield-test.pas similarity index 100% rename from TestSuite/patterns-is-yield-test.pas rename to TestSuite/patterns/patterns-is-yield-test.pas diff --git a/TestSuite/patterns-lambda-test.pas b/TestSuite/patterns/patterns-lambda-test.pas similarity index 100% rename from TestSuite/patterns-lambda-test.pas rename to TestSuite/patterns/patterns-lambda-test.pas diff --git a/TestSuite/patterns-nil-test.pas b/TestSuite/patterns/patterns-nil-test.pas similarity index 100% rename from TestSuite/patterns-nil-test.pas rename to TestSuite/patterns/patterns-nil-test.pas diff --git a/TestSuite/patterns-overloading-and-ambiguity.pas b/TestSuite/patterns/patterns-overloading-and-ambiguity.pas similarity index 100% rename from TestSuite/patterns-overloading-and-ambiguity.pas rename to TestSuite/patterns/patterns-overloading-and-ambiguity.pas diff --git a/TestSuite/patterns/patterns-simple-const.pas b/TestSuite/patterns/patterns-simple-const.pas new file mode 100644 index 000000000..295c37cd0 --- /dev/null +++ b/TestSuite/patterns/patterns-simple-const.pas @@ -0,0 +1,8 @@ +begin + var a := 3.14; + match a with + 1.0, 2.0, 3.0: assert(false); + 3.13, 3.14, 3.15, 3.16: ; + 123.0: assert(false); + end; +end. \ No newline at end of file diff --git a/TestSuite/patterns/patterns-simple-tuple.pas b/TestSuite/patterns/patterns-simple-tuple.pas new file mode 100644 index 000000000..6a59f2d67 --- /dev/null +++ b/TestSuite/patterns/patterns-simple-tuple.pas @@ -0,0 +1,7 @@ +begin + match (1, 2, 'string') with + (1, _, 'str'): assert(false); + (1, _, 'strin'): assert(false); + (_, _, 'string'): ; + end; +end. \ No newline at end of file diff --git a/TestSuite/patterns/patterns-type-matching1.pas b/TestSuite/patterns/patterns-type-matching1.pas new file mode 100644 index 000000000..ecb2fe5d7 --- /dev/null +++ b/TestSuite/patterns/patterns-type-matching1.pas @@ -0,0 +1,40 @@ +type + CardInfo = auto class + public + cardNumber: string; + cv: integer; + end; + + Person = class + name: string; + age: integer; + card: CardInfo; + + constructor(name: string; age: integer; card: CardInfo); + begin + self.name := name; + self.age := age; + self.card := card; + end; + + procedure Deconstruct(var name: string; var age: integer; var card: CardInfo); + begin + name := self.name; + age := self.age; + card := self.card; + end; + end; + +begin + var a := new Person('Вася', 11, new CardInfo('12345678', 324)); + + // Расширенный is + if a is Person(_, var age, CardInfo(_, var cv)) then assert((age = 11) and (cv = 324)); + + // match .. with + match a with + Person('Петя', 12, CardInfo('12345678', var cv)): assert(false); + Person('Вася', _, CardInfo(cardNum, 324)): assert(cardNum.Equals('12345678')); + Person(_, _, CardInfo(_, x)): assert(false); + end; +end. \ No newline at end of file diff --git a/TestSuite/patterns-types-interfaces-matching.pas b/TestSuite/patterns/patterns-types-interfaces-matching.pas similarity index 100% rename from TestSuite/patterns-types-interfaces-matching.pas rename to TestSuite/patterns/patterns-types-interfaces-matching.pas diff --git a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs index 2326db8be..f88253890 100644 --- a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs +++ b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs @@ -144,9 +144,9 @@ namespace PascalABCCompiler.TreeConverter } } - private bool AreTheSameType(type_node type1, type_node type2) => - type1 != null && - type2 != null && + private bool AreTheSameType(type_node type1, type_node type2) => + type1 != null && + type2 != null && convertion_data_and_alghoritms.possible_equal_types(type1, type2); private bool IsSelfParameter(parameter parameter) => parameter.name.ToLower() == compiler_string_consts.self_word; @@ -209,7 +209,7 @@ namespace PascalABCCompiler.TreeConverter if (node is generic_instance_type_node genericNode) foreach (var index in genericNode.instance_params.Aggregate( - Enumerable.Empty(), + Enumerable.Empty(), (indices, nextNode) => indices.Concat(GenericParameterIndices(nextNode))) .Distinct()) yield return index; @@ -261,5 +261,40 @@ namespace PascalABCCompiler.TreeConverter AddError(get_location(matchedExpression), "EXPRESSION_OF_TYPE_{0}_CANNOT_BE_MATCHED_AGAINST_PATTERN_WITH_TYPE_{1}", expression.name, type.name); } + + private void CheckIfCanBeMatched(expression matchedExpression, expression patternExpression) + { + var patternType = convert_strong(patternExpression).type; + var expressionType = convert_strong(matchedExpression).type; + + var expressionTypeName = expressionType.BaseFullName; + var patternTypeName = patternType.BaseFullName; + + var tupleName = "System.Tuple"; + if (type_table.is_derived(patternType, expressionType) || + type_table.is_derived(expressionType, patternType) || + AreTheSameType(patternType, expressionType) || + (expressionTypeName.StartsWith(tupleName) && + patternTypeName.StartsWith(tupleName) && + int.Parse(expressionTypeName.Substring(tupleName.Length + 1, 1)) == + int.Parse(patternTypeName.Substring(tupleName.Length + 1, 1)))) + return; + + AddError(get_location(matchedExpression), "EXPRESSION_OF_TYPE_{0}_CANNOT_BE_MATCHED_AGAINST_PATTERN_WITH_TYPE_{1}", expressionType.name, patternType.name); + } + + private void CheckIfCanBeMatched(expression tuple, int32_const length) + { + var expressionType = convert_strong(tuple).type; + var expressionTypeName = expressionType.BaseFullName; + + var tupleName = "System.Tuple"; + if (expressionTypeName.StartsWith(tupleName) && + int.Parse(expressionTypeName.Substring(tupleName.Length + 1, 1)) == length.val) + return; + + AddError(get_location(tuple), + "EXPRESSION_OF_TYPE_{0}_CANNOT_BE_MATCHED_AGAINST_PATTERN_WITH_TYPE_{1}", expressionType.name, "Tuple`" + length.val); + } } } diff --git a/TreeConverter/TreeConversion/compiler_string_consts.cs b/TreeConverter/TreeConversion/compiler_string_consts.cs index add3687e0..2dc39ef7a 100644 --- a/TreeConverter/TreeConversion/compiler_string_consts.cs +++ b/TreeConverter/TreeConversion/compiler_string_consts.cs @@ -1,437 +1,439 @@ -// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -//Строковые константы. -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using PascalABCCompiler.TreeRealization; - -namespace PascalABCCompiler.TreeConverter -{ - - public static class compiler_string_consts - { - - public static Dictionary oper_names = new Dictionary(); - - static int tvnc = 0; - public static string GetTempVariableName() - { - return "$TV" + (tvnc++).ToString() + "$"; - } - - static compiler_string_consts() - { - oper_names[plus_name] = "op_Addition"; - oper_names[minus_name] = "op_Subtraction"; - oper_names[mul_name] = "op_Multiply"; - oper_names[div_name] = "op_Division"; - oper_names[idiv_name] = "op_Division"; - oper_names[and_name] = "op_BitwiseAnd"; - oper_names[or_name] = "op_BitwiseOr"; - oper_names[eq_name] = "op_Equality"; - oper_names[gr_name] = "op_GreaterThan"; - oper_names[greq_name] = "op_GreaterThanOrEqual"; - oper_names[sm_name] = "op_LessThan"; - oper_names[smeq_name] = "op_LessThanOrEqual"; - oper_names[mod_name] = "op_Modulus"; - oper_names[not_name] = "op_LogicalNot"; - oper_names[noteq_name] = "op_Inequality"; - } - - public static string GetNETOperName(string name) - { - string oper_name = null; - if (oper_names.TryGetValue(name, out oper_name)) - return oper_name; - return null; - } - - public static string GetConnectedFunctionName(string class_name, string func_name) - { - if (oper_names.ContainsKey(func_name)) - func_name = oper_names[func_name]; - return class_name + "_" + func_name; - } - - public static string GetGenericTypeInformation(string name, out int generic_param_count) - { - generic_param_count = 0; - if (name == null) - { - return null; - } - string rez = name; - int ind = name.IndexOf(compiler_string_consts.generic_params_infix); - if (ind > 0) - { - rez = name.Substring(0, ind); - if (name.Length > ind + 1) - { - try - { - generic_param_count = Convert.ToInt32(name.Substring(ind + 1)); - } - catch - { - generic_param_count = 0; - } - } - } - return rez; - } - - - public static string ImplementationSectionNamespaceName = "_implementation______"; - - public static readonly string bool_type_name = "boolean"; - public static readonly string byte_type_name = "byte"; - public static readonly string sbyte_type_name = "shortint"; - public static readonly string short_type_name = "smallint"; - public static readonly string ushort_type_name = "word"; - public static readonly string integer_type_name = "integer";//longint - public static readonly string uint_type_name = "longword";//cardinal - public static readonly string long_type_name = "int64";//int64 - public static readonly string ulong_type_name = "uint64"; - //public static readonly string decimal_type_name = "decimal"; - public static readonly string real_type_name = "real"; - public static readonly string float_type_name = "single"; - public static readonly string char_type_name = "char"; - public static readonly string string_type_name = "string"; - public static readonly string pointer_type_name = "pointer"; - public static readonly string object_type_name = "object"; - public static readonly string true_const_name = "true"; - public static readonly string false_const_name = "false"; - public static readonly string base_exception_class_name = "Exception"; - public static readonly string combine_method_name = "Combine"; - public static readonly string remove_method_name = "Remove"; - public static readonly string base_enum_class_name = "Enum"; - public static readonly string void_class_name = "void"; - public static string value = "value"; - public static readonly string object_equals_name = "Equals"; - - public static readonly string plus_name = "+"; - public static readonly string minus_name = "-"; - public static readonly string mul_name = "*"; - public static readonly string div_name = "/"; - public static readonly string idiv_name = "div"; - public static readonly string mod_name = "mod"; - public static readonly string explicit_operator_name = "op_Explicit"; - public static readonly string implicit_operator_name = "op_Implicit"; - - //public static string CommandLineArgsVariableName = "CommandLineArgs"; - public static string MainArgsParamName = "args"; - public static string IsConsoleApplicationVariableName = "IsConsoleApplication"; - - public static readonly string plusassign_name = "+="; - public static readonly string minusassign_name = "-="; - public static readonly string multassign_name = "*="; - public static readonly string divassign_name = "/="; - public static readonly string power_name = "**"; - public static readonly string gr_name = ">"; - public static readonly string sm_name = "<"; - public static readonly string greq_name = ">="; - public static readonly string smeq_name = "<="; - public static readonly string eq_name = "="; - public static readonly string noteq_name = "<>"; - - public static readonly string or_name = "or"; - public static readonly string xor_name = "xor"; - public static readonly string not_name = "not"; - public static readonly string and_name = "and"; - - public static readonly string as_name = "as"; - public static readonly string is_name = "is"; - public static readonly string in_name = "in"; - public static readonly string shl_name = "shl"; - public static readonly string shr_name = "shr"; - - public static readonly string assign_name = ":="; - - public static readonly string unary_param_name = "param"; - public static readonly string left_param_name = "left"; - public static readonly string right_param_name = "right"; - - public static readonly string main_function_name = "Main"; - public static readonly string c_main_function_name = "main"; - public static readonly string temp_main_function_name = "$Main"; - public static readonly string initialization_function_name = "$Initialization"; - public static readonly string finalization_function_name = "$Finalization"; - - public static readonly string function_return_value_prefix = "$rv_"; - public static readonly string empty_function_name = "empty_function"; - - public static readonly string break_procedure_name = "break"; - public static readonly string continue_procedure_name = "continue"; - public static readonly string exit_procedure_name = "exit"; - - - public static readonly string temp_for_variable_name = "$tfr_"; - - public static readonly string lower_array_const_name = "LowerIndex"; - public static readonly string upper_array_const_name = "UpperIndex"; - - public static readonly string pascal_array_name = "$pascal_array"; - public static readonly string indexer_name = "[]"; - public static readonly string internal_array_name = "NullBasedArray"; - public static readonly string simple_array_name = "simple_array"; - - public static readonly string get_val_pascal_array_name = "get_val"; - public static readonly string set_val_pascal_array_name = "set_val"; - public static readonly string index_property_pascal_array_name = "index"; - - public static readonly string system_unit_name = "PascalABCSystem"; - - public static readonly string delegate_type_name_template = "$delegate"; - - public static readonly string roof_name = "^"; - - public static readonly string string_concat_method_name = "Concat"; - public static readonly string to_string_method_name = "ToString"; - - public static readonly string base_delegate_type_name = "delegate"; - public static readonly string base_array_type_name = "array"; - public static readonly string net_constructor_name = ".ctor"; - - public static readonly string method_group_type_name = "Method group"; - - public static readonly string invoke_method_name = "Invoke"; - public static readonly string begin_invoke_method_name = "BeginInvoke"; - public static readonly string end_invoke_method_name = "EndInvoke"; - public static readonly string callback_string = "callback"; - public static readonly string result_string = "result"; - public static readonly string object_in_par_string = "'object'"; - - public static readonly string omp_get_nested = "omp_get_nested"; - public static readonly string omp_set_nested = "omp_set_nested"; - public static readonly string OMP_NESTED = "OMP_NESTED"; - - public static readonly string set_length_procedure_name = "SetLength"; - public static readonly string set_length_for_short_string = "SetLengthForShortString"; - public static readonly string self_word = "self"; - public static string get_pointer_type_name_by_type_name(string type_name) - { - return (roof_name + type_name); - } - - public static string format_procedure_name = "FormatValue"; - public static string read_procedure_name = "read"; - public static string write_procedure_name = "write"; - public static string writeln_procedure_name = "writeln"; - public static string readln_procedure_name = "readln"; - public static string text_file_name_type_name = "Text"; - public static string TextFileInitProcedureName = "TextFileInit"; - public static string StringDefaultPropertySetProcedureName = "StringDefaultPropertySet"; - public static string BinaryFileTypeName = "BinaryFile"; - public static string AbstractBinaryFileTypeName = "AbstractBinaryFile"; - public static string BinaryFileInitProcedureName = "BinaryFileInit"; - public static string BinaryFileReadProcedureName = "BinaryFileRead"; - public static string TypedFileTypeName = "TypedFile"; - public static string TypedFileInitProcedureName = "TypedFileInit"; - public static string TypedFileReadProcedureName = "TypedFileRead"; - public static string ShortStringTypeName = "ShortString"; - public static string ShortStringTypeInitProcedure = "InitShortString"; - public static string PointerOutputTypeName = "PointerOutput"; - - public static string PascalReadAccessorName = "read"; - public static string PascalWriteAccessorName = "write"; - public static string AssignSetName = "AssignSetFrom"; - public static string TypedSetInitProcedure = "TypedSetInit"; - public static string TypedSetInitProcedureWithBounds = "TypedSetInitWithBounds"; - public static string TypedSetInitWithShortString = "TypedSetInitWithShortString"; - public static string AssignSetProcedure = "AssignSet"; - public static string AssignSetProcedureWithBounds = "AssignSetWithBounds"; - public static string ClipShortStringInSetFunction = "ClipShortStringInSet"; - public static string ClipShortStringInSetProcedure = "ClipShortStringInSetProcedure"; - public static string union_of_set = "Union"; - public static string intersect_of_set = "Intersect"; - public static string subtract_of_set = "Subtract"; - public static string in_set = "InSet"; - public static string CreateSetProcedure = "CreateSet"; - public static string IncludeProcedure = "Include"; - public static string ExcludeProcedure = "Exclude"; - public static string DiapasonType = "Diapason"; - public static string CreateDiapason = "CreateDiapason"; - public static string CreateObjDiapason = "CreateObjDiapason"; - public static string CompareSetEquals = "CompareSetEquals"; - public static string CompareSetInEquals = "CompareSetInEquals"; - public static string CompareSetLess = "CompareSetLess"; - public static string CompareSetLessEqual = "CompareSetLessEqual"; - public static string CompareSetGreater = "CompareSetGreater"; - public static string CompareSetGreaterEqual = "CompareSetGreaterEqual"; - public static string IncProcedure = "Inc"; - public static string DecProcedure = "Dec"; - public static string SuccFunction = "Succ"; - public static string PredFunction = "Pred"; - public static string OrdFunction = "Ord"; - public static string ClipProcedure = "ClipSet"; - public static string ClipFunction = "ClipSetFunc"; - public static string ClipShortString = "ClipShortString"; - public static string GetCharInShortString = "GetCharInShortString"; - public static string SetCharInShortString = "SetCharInShortString"; - public static string read_short_string = "ReadShortString"; - public static string read_short_string_from_file = "ReadShortStringFromFile"; - public static string Insert = "Insert"; - public static string Delete = "Delete"; - public static string InsertInShortString = "InsertInShortString"; - public static string AssertProcedure = "Assert"; - public static string CopyWithSizeFunction = "CopyWithSize"; - public static string Low = "Low"; - public static string High = "High"; - public static string ArrayCopyFunction = "Copy"; - public static string check_in_range = "check_in_range"; - public static string check_in_range_char = "check_in_range_char"; - public static string ShortStringTypeNameTemplate = string_type_name + "[{0}]"; - public static string GetCurrentLineFunction = "__GetCurrentLine__"; - public static string GetCurrentFileFunction = "__GetCurrentFile__"; - public static string GetShortStringTypeName(int length) - { - if (length < 256) - return string.Format(ShortStringTypeNameTemplate, length); - else return string.Format(ShortStringTypeName); - } - - public static string TypedFileTypeNameTemplate = "file of {0}"; - public static string TypedSetTypeNameTemplate = "set of {0}"; - public static string GetTypedFileTypeName(string elem_type_name) - { - return string.Format(TypedFileTypeNameTemplate, elem_type_name); - } - - public static string GetSetTypeName(string elem_type_name) - { - return string.Format(TypedSetTypeNameTemplate, elem_type_name); - } - - public static string array_word = "array"; - private static string of_word = "of"; - private static string space = " "; - - public static string result_variable_name = "result"; - - public static string event_add_method_nameformat = event_add_method_prefix + "{0}"; - public static string event_remove_method_nameformat = event_remove_method_prefix + "{0}"; - public static string event_add_method_prefix = "add_"; - public static string event_remove_method_prefix = "remove_"; - - public static string default_constructor_name = "create"; - - // SSM - Константы директив компилятора. Вообще разбросаны по коду. Пусть будут здесь (3.1.2011) - public static string compiler_directive_apptype = "apptype"; - public static string compiler_directive_reference = "reference"; - public static string include_namespace_directive = "includenamespace"; - public static string compiler_savepcu = "savepcu"; - public static string compiler_directive_nullbasedstrings = "nullbasedstrings"; - public static string compiler_directive_nullbasedstrings_ON = "string_nullbased+"; - public static string compiler_directive_nullbasedstrings_OFF = "string_nullbased-"; - public static string compiler_directive_initstring_as_empty_ON = "string_initempty+"; - public static string compiler_directive_initstring_as_empty_OFF = "string_initempty-"; - public static string compiler_directive_resource = "resource"; - public static string compiler_directive_platformtarget = "platformtarget"; - public static string compiler_directive_faststrings = "faststrings"; - - // SSM (3.1.2011) Перенес эти константы сюда. - public static string version_string = "version"; - public static string product_string = "product"; - public static string company_string = "company"; - public static string copyright_string = "copyright"; - public static string trademark_string = "trademark"; - public static string main_resource_string = "mainresource"; - public static string title_string = "title"; - public static string description_string = "description"; - - public static string system_unit_marker = "__IS_SYSTEM_MODULE"; - public static string system_unit_file_name = "PABCSystem"; - public static string extensions_unit_file_name = "PABCExtensions"; - - public static string get_array_type_name(string type_name, int rank) - { - if (rank == 1) - return (array_word + space + of_word + space + type_name); - else - { - StringBuilder sb = new StringBuilder(); - sb.Append(',', rank - 1); - return array_word + "[" + sb.ToString() + "]" + space + of_word + space + type_name; - } - } - - public static readonly string new_array_procedure_name = "__new_array"; - - public static readonly string new_procedure_name = "new"; - public static readonly string dispose_procedure_name = "dispose"; - - public static string pointer_net_type_name_intptr = "System.IntPtr"; - public static string pointer_net_type_name_void = "System.Void*"; - - public static string record_const_type_name = "RecordConst"; - public static string array_const_type_name = "ArrayConst"; - public static string auto_type_name = "AutoType"; // SSM 25.06.16 - тип, который определяется на этапе компиляции при первом присваивании - public static string ienumerable_auto_type_name = "IEnumerableAutoType"; // SSM 05.07.16 - тип, который определяется на этапе компиляции при первом присваивании - public static string recort_printable_name_template = "record{0}end"; - public static string set_name = "TypedSet"; - public const string deconstruct_method_name = "deconstruct"; - public const string is_test_function_name = "__TypeCheckAndAssignForIsMatch"; - - public static string bounded_array_printable_name_template = "array [{0}..{1}] of {2}"; - public static string array_printable_name_template = "array of {0}"; - public static string multi_dim_array_printable_name_template = "array [{0}] of {1}"; - public static readonly string generic_params_infix = "`"; - - public static string GetAccessorName(string accessorTemplate, string name) - { - return string.Format(accessorTemplate, name); - } - public static string GetGetAccessorName(string name) - { - return GetAccessorName("get_{0}", name); - } - public static string GetSetAccessorName(string name) - { - return GetAccessorName("set_{0}", name); - } - public static string GetAddHandler(string name) - { - return "add_" + name; - } - public static string GetRemoveHandler(string name) - { - return "remove_" + name; - } - public static string IEnumerableInterfaceName = "System.Collections.IEnumerable"; - public static string IGenericEnumerableInterfaceName = "System.Collections.Generic.IEnumerable`1"; - public static string GetEnumeratorMethodName = "GetEnumerator"; - public static string IEnumeratorInterfaceName = "System.Collections.IEnumerator"; - public static string IGenericEnumeratorInterfaceName = "System.Collections.Generic.IEnumerator`1"; - public static string CurrentPropertyName = "Current"; - - public static string static_ctor_prefix = "$sctor$"; - public static string generic_param_kind_prefix = "$kind_of$"; - public static string CheckCanUsePointerOnType_proc_name = "CheckCanUsePointerOnType"; - public static string CheckCanUseTypeForBinaryFiles_proc_name = "CheckCanUseTypeForBinaryFiles"; - public static string CheckCanUseTypeForTypedFiles_proc_name = "CheckCanUseTypeForTypedFiles"; - public static string RuntimeDetermineType_func_name = "RuntimeDetermineType"; - public static string RuntimeInitializeFunction_func_name = "RuntimeInitialize"; - public static string PointerToStringFunction_func_name = "PointerToString"; - public static string GetRuntimeSizeFunction_func_name = "GetRuntimeSize"; - public static string StrProcedure_func_name = "Str"; - public static string PascalABCVersion_func_name = "PascalABCVersion"; - public static string ChrUnicodeFunction_func_name = "ChrUnicode"; - public static string ExceptionName = "System.Exception"; - public static string value_in_accessor_name = "$value"; - public static string synonym_value_name = "$synonym"; - public static string file_of_attr_name = "$Attributes.$FileOfAttr"; - public static string set_of_attr_name = "$Attributes.$SetOfAttr"; - public static string type_synonim_attr_name = "$Attributes.$TypeSynonimAttr"; - public static string template_class_attr_name = "$Attributes.$TemplateClassAttr"; - public static string short_string_attr_name = "$Attributes.$ShortStringAttr"; - public static string global_attr_name = "$GlobAttr"; - public static string class_unit_attr_name = "$ClassUnitAttr"; - public static string pabc_rtl_dll_name = "PABCRtl.dll"; - public static string ObjectType = "Object"; - public static string StringType = "string"; - public static string config_variable_name = "__CONFIG__"; - } - -} +// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +//Строковые константы. +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using PascalABCCompiler.TreeRealization; + +namespace PascalABCCompiler.TreeConverter +{ + + public static class compiler_string_consts + { + + public static Dictionary oper_names = new Dictionary(); + + static int tvnc = 0; + public static string GetTempVariableName() + { + return "$TV" + (tvnc++).ToString() + "$"; + } + + static compiler_string_consts() + { + oper_names[plus_name] = "op_Addition"; + oper_names[minus_name] = "op_Subtraction"; + oper_names[mul_name] = "op_Multiply"; + oper_names[div_name] = "op_Division"; + oper_names[idiv_name] = "op_Division"; + oper_names[and_name] = "op_BitwiseAnd"; + oper_names[or_name] = "op_BitwiseOr"; + oper_names[eq_name] = "op_Equality"; + oper_names[gr_name] = "op_GreaterThan"; + oper_names[greq_name] = "op_GreaterThanOrEqual"; + oper_names[sm_name] = "op_LessThan"; + oper_names[smeq_name] = "op_LessThanOrEqual"; + oper_names[mod_name] = "op_Modulus"; + oper_names[not_name] = "op_LogicalNot"; + oper_names[noteq_name] = "op_Inequality"; + } + + public static string GetNETOperName(string name) + { + string oper_name = null; + if (oper_names.TryGetValue(name, out oper_name)) + return oper_name; + return null; + } + + public static string GetConnectedFunctionName(string class_name, string func_name) + { + if (oper_names.ContainsKey(func_name)) + func_name = oper_names[func_name]; + return class_name + "_" + func_name; + } + + public static string GetGenericTypeInformation(string name, out int generic_param_count) + { + generic_param_count = 0; + if (name == null) + { + return null; + } + string rez = name; + int ind = name.IndexOf(compiler_string_consts.generic_params_infix); + if (ind > 0) + { + rez = name.Substring(0, ind); + if (name.Length > ind + 1) + { + try + { + generic_param_count = Convert.ToInt32(name.Substring(ind + 1)); + } + catch + { + generic_param_count = 0; + } + } + } + return rez; + } + + + public static string ImplementationSectionNamespaceName = "_implementation______"; + + public static readonly string bool_type_name = "boolean"; + public static readonly string byte_type_name = "byte"; + public static readonly string sbyte_type_name = "shortint"; + public static readonly string short_type_name = "smallint"; + public static readonly string ushort_type_name = "word"; + public static readonly string integer_type_name = "integer";//longint + public static readonly string uint_type_name = "longword";//cardinal + public static readonly string long_type_name = "int64";//int64 + public static readonly string ulong_type_name = "uint64"; + //public static readonly string decimal_type_name = "decimal"; + public static readonly string real_type_name = "real"; + public static readonly string float_type_name = "single"; + public static readonly string char_type_name = "char"; + public static readonly string string_type_name = "string"; + public static readonly string pointer_type_name = "pointer"; + public static readonly string object_type_name = "object"; + public static readonly string true_const_name = "true"; + public static readonly string false_const_name = "false"; + public static readonly string base_exception_class_name = "Exception"; + public static readonly string combine_method_name = "Combine"; + public static readonly string remove_method_name = "Remove"; + public static readonly string base_enum_class_name = "Enum"; + public static readonly string void_class_name = "void"; + public static string value = "value"; + public static readonly string object_equals_name = "Equals"; + + public static readonly string plus_name = "+"; + public static readonly string minus_name = "-"; + public static readonly string mul_name = "*"; + public static readonly string div_name = "/"; + public static readonly string idiv_name = "div"; + public static readonly string mod_name = "mod"; + public static readonly string explicit_operator_name = "op_Explicit"; + public static readonly string implicit_operator_name = "op_Implicit"; + + //public static string CommandLineArgsVariableName = "CommandLineArgs"; + public static string MainArgsParamName = "args"; + public static string IsConsoleApplicationVariableName = "IsConsoleApplication"; + + public static readonly string plusassign_name = "+="; + public static readonly string minusassign_name = "-="; + public static readonly string multassign_name = "*="; + public static readonly string divassign_name = "/="; + public static readonly string power_name = "**"; + public static readonly string gr_name = ">"; + public static readonly string sm_name = "<"; + public static readonly string greq_name = ">="; + public static readonly string smeq_name = "<="; + public static readonly string eq_name = "="; + public static readonly string noteq_name = "<>"; + + public static readonly string or_name = "or"; + public static readonly string xor_name = "xor"; + public static readonly string not_name = "not"; + public static readonly string and_name = "and"; + + public static readonly string as_name = "as"; + public static readonly string is_name = "is"; + public static readonly string in_name = "in"; + public static readonly string shl_name = "shl"; + public static readonly string shr_name = "shr"; + + public static readonly string assign_name = ":="; + + public static readonly string unary_param_name = "param"; + public static readonly string left_param_name = "left"; + public static readonly string right_param_name = "right"; + + public static readonly string main_function_name = "Main"; + public static readonly string c_main_function_name = "main"; + public static readonly string temp_main_function_name = "$Main"; + public static readonly string initialization_function_name = "$Initialization"; + public static readonly string finalization_function_name = "$Finalization"; + + public static readonly string function_return_value_prefix = "$rv_"; + public static readonly string empty_function_name = "empty_function"; + + public static readonly string break_procedure_name = "break"; + public static readonly string continue_procedure_name = "continue"; + public static readonly string exit_procedure_name = "exit"; + + + public static readonly string temp_for_variable_name = "$tfr_"; + + public static readonly string lower_array_const_name = "LowerIndex"; + public static readonly string upper_array_const_name = "UpperIndex"; + + public static readonly string pascal_array_name = "$pascal_array"; + public static readonly string indexer_name = "[]"; + public static readonly string internal_array_name = "NullBasedArray"; + public static readonly string simple_array_name = "simple_array"; + + public static readonly string get_val_pascal_array_name = "get_val"; + public static readonly string set_val_pascal_array_name = "set_val"; + public static readonly string index_property_pascal_array_name = "index"; + + public static readonly string system_unit_name = "PascalABCSystem"; + + public static readonly string delegate_type_name_template = "$delegate"; + + public static readonly string roof_name = "^"; + + public static readonly string string_concat_method_name = "Concat"; + public static readonly string to_string_method_name = "ToString"; + + public static readonly string base_delegate_type_name = "delegate"; + public static readonly string base_array_type_name = "array"; + public static readonly string net_constructor_name = ".ctor"; + + public static readonly string method_group_type_name = "Method group"; + + public static readonly string invoke_method_name = "Invoke"; + public static readonly string begin_invoke_method_name = "BeginInvoke"; + public static readonly string end_invoke_method_name = "EndInvoke"; + public static readonly string callback_string = "callback"; + public static readonly string result_string = "result"; + public static readonly string object_in_par_string = "'object'"; + + public static readonly string omp_get_nested = "omp_get_nested"; + public static readonly string omp_set_nested = "omp_set_nested"; + public static readonly string OMP_NESTED = "OMP_NESTED"; + + public static readonly string set_length_procedure_name = "SetLength"; + public static readonly string set_length_for_short_string = "SetLengthForShortString"; + public static readonly string self_word = "self"; + public static string get_pointer_type_name_by_type_name(string type_name) + { + return (roof_name + type_name); + } + + public static string format_procedure_name = "FormatValue"; + public static string read_procedure_name = "read"; + public static string write_procedure_name = "write"; + public static string writeln_procedure_name = "writeln"; + public static string readln_procedure_name = "readln"; + public static string text_file_name_type_name = "Text"; + public static string TextFileInitProcedureName = "TextFileInit"; + public static string StringDefaultPropertySetProcedureName = "StringDefaultPropertySet"; + public static string BinaryFileTypeName = "BinaryFile"; + public static string AbstractBinaryFileTypeName = "AbstractBinaryFile"; + public static string BinaryFileInitProcedureName = "BinaryFileInit"; + public static string BinaryFileReadProcedureName = "BinaryFileRead"; + public static string TypedFileTypeName = "TypedFile"; + public static string TypedFileInitProcedureName = "TypedFileInit"; + public static string TypedFileReadProcedureName = "TypedFileRead"; + public static string ShortStringTypeName = "ShortString"; + public static string ShortStringTypeInitProcedure = "InitShortString"; + public static string PointerOutputTypeName = "PointerOutput"; + + public static string PascalReadAccessorName = "read"; + public static string PascalWriteAccessorName = "write"; + public static string AssignSetName = "AssignSetFrom"; + public static string TypedSetInitProcedure = "TypedSetInit"; + public static string TypedSetInitProcedureWithBounds = "TypedSetInitWithBounds"; + public static string TypedSetInitWithShortString = "TypedSetInitWithShortString"; + public static string AssignSetProcedure = "AssignSet"; + public static string AssignSetProcedureWithBounds = "AssignSetWithBounds"; + public static string ClipShortStringInSetFunction = "ClipShortStringInSet"; + public static string ClipShortStringInSetProcedure = "ClipShortStringInSetProcedure"; + public static string union_of_set = "Union"; + public static string intersect_of_set = "Intersect"; + public static string subtract_of_set = "Subtract"; + public static string in_set = "InSet"; + public static string CreateSetProcedure = "CreateSet"; + public static string IncludeProcedure = "Include"; + public static string ExcludeProcedure = "Exclude"; + public static string DiapasonType = "Diapason"; + public static string CreateDiapason = "CreateDiapason"; + public static string CreateObjDiapason = "CreateObjDiapason"; + public static string CompareSetEquals = "CompareSetEquals"; + public static string CompareSetInEquals = "CompareSetInEquals"; + public static string CompareSetLess = "CompareSetLess"; + public static string CompareSetLessEqual = "CompareSetLessEqual"; + public static string CompareSetGreater = "CompareSetGreater"; + public static string CompareSetGreaterEqual = "CompareSetGreaterEqual"; + public static string IncProcedure = "Inc"; + public static string DecProcedure = "Dec"; + public static string SuccFunction = "Succ"; + public static string PredFunction = "Pred"; + public static string OrdFunction = "Ord"; + public static string ClipProcedure = "ClipSet"; + public static string ClipFunction = "ClipSetFunc"; + public static string ClipShortString = "ClipShortString"; + public static string GetCharInShortString = "GetCharInShortString"; + public static string SetCharInShortString = "SetCharInShortString"; + public static string read_short_string = "ReadShortString"; + public static string read_short_string_from_file = "ReadShortStringFromFile"; + public static string Insert = "Insert"; + public static string Delete = "Delete"; + public static string InsertInShortString = "InsertInShortString"; + public static string AssertProcedure = "Assert"; + public static string CopyWithSizeFunction = "CopyWithSize"; + public static string Low = "Low"; + public static string High = "High"; + public static string ArrayCopyFunction = "Copy"; + public static string check_in_range = "check_in_range"; + public static string check_in_range_char = "check_in_range_char"; + public static string ShortStringTypeNameTemplate = string_type_name + "[{0}]"; + public static string GetCurrentLineFunction = "__GetCurrentLine__"; + public static string GetCurrentFileFunction = "__GetCurrentFile__"; + public static string GetShortStringTypeName(int length) + { + if (length < 256) + return string.Format(ShortStringTypeNameTemplate, length); + else return string.Format(ShortStringTypeName); + } + + public static string TypedFileTypeNameTemplate = "file of {0}"; + public static string TypedSetTypeNameTemplate = "set of {0}"; + public static string GetTypedFileTypeName(string elem_type_name) + { + return string.Format(TypedFileTypeNameTemplate, elem_type_name); + } + + public static string GetSetTypeName(string elem_type_name) + { + return string.Format(TypedSetTypeNameTemplate, elem_type_name); + } + + public static string array_word = "array"; + private static string of_word = "of"; + private static string space = " "; + + public static string result_variable_name = "result"; + + public static string event_add_method_nameformat = event_add_method_prefix + "{0}"; + public static string event_remove_method_nameformat = event_remove_method_prefix + "{0}"; + public static string event_add_method_prefix = "add_"; + public static string event_remove_method_prefix = "remove_"; + + public static string default_constructor_name = "create"; + + // SSM - Константы директив компилятора. Вообще разбросаны по коду. Пусть будут здесь (3.1.2011) + public static string compiler_directive_apptype = "apptype"; + public static string compiler_directive_reference = "reference"; + public static string include_namespace_directive = "includenamespace"; + public static string compiler_savepcu = "savepcu"; + public static string compiler_directive_nullbasedstrings = "nullbasedstrings"; + public static string compiler_directive_nullbasedstrings_ON = "string_nullbased+"; + public static string compiler_directive_nullbasedstrings_OFF = "string_nullbased-"; + public static string compiler_directive_initstring_as_empty_ON = "string_initempty+"; + public static string compiler_directive_initstring_as_empty_OFF = "string_initempty-"; + public static string compiler_directive_resource = "resource"; + public static string compiler_directive_platformtarget = "platformtarget"; + public static string compiler_directive_faststrings = "faststrings"; + + // SSM (3.1.2011) Перенес эти константы сюда. + public static string version_string = "version"; + public static string product_string = "product"; + public static string company_string = "company"; + public static string copyright_string = "copyright"; + public static string trademark_string = "trademark"; + public static string main_resource_string = "mainresource"; + public static string title_string = "title"; + public static string description_string = "description"; + + public static string system_unit_marker = "__IS_SYSTEM_MODULE"; + public static string system_unit_file_name = "PABCSystem"; + public static string extensions_unit_file_name = "PABCExtensions"; + + public static string get_array_type_name(string type_name, int rank) + { + if (rank == 1) + return (array_word + space + of_word + space + type_name); + else + { + StringBuilder sb = new StringBuilder(); + sb.Append(',', rank - 1); + return array_word + "[" + sb.ToString() + "]" + space + of_word + space + type_name; + } + } + + public static readonly string new_array_procedure_name = "__new_array"; + + public static readonly string new_procedure_name = "new"; + public static readonly string dispose_procedure_name = "dispose"; + + public static string pointer_net_type_name_intptr = "System.IntPtr"; + public static string pointer_net_type_name_void = "System.Void*"; + + public static string record_const_type_name = "RecordConst"; + public static string array_const_type_name = "ArrayConst"; + public static string auto_type_name = "AutoType"; // SSM 25.06.16 - тип, который определяется на этапе компиляции при первом присваивании + public static string ienumerable_auto_type_name = "IEnumerableAutoType"; // SSM 05.07.16 - тип, который определяется на этапе компиляции при первом присваивании + public static string recort_printable_name_template = "record{0}end"; + public static string set_name = "TypedSet"; + public const string deconstruct_method_name = "deconstruct"; + public const string is_test_function_name = "__TypeCheckAndAssignForIsMatch"; + public const string wild_cards_tuple_equal_function_name = "__WildCardsTupleEqual"; + public const string seq_function_name = "Seq"; + public const string count_property_name = "Count"; + public static string bounded_array_printable_name_template = "array [{0}..{1}] of {2}"; + public static string array_printable_name_template = "array of {0}"; + public static string multi_dim_array_printable_name_template = "array [{0}] of {1}"; + public static readonly string generic_params_infix = "`"; + + public static string GetAccessorName(string accessorTemplate, string name) + { + return string.Format(accessorTemplate, name); + } + public static string GetGetAccessorName(string name) + { + return GetAccessorName("get_{0}", name); + } + public static string GetSetAccessorName(string name) + { + return GetAccessorName("set_{0}", name); + } + public static string GetAddHandler(string name) + { + return "add_" + name; + } + public static string GetRemoveHandler(string name) + { + return "remove_" + name; + } + public static string IEnumerableInterfaceName = "System.Collections.IEnumerable"; + public static string IGenericEnumerableInterfaceName = "System.Collections.Generic.IEnumerable`1"; + public static string GetEnumeratorMethodName = "GetEnumerator"; + public static string IEnumeratorInterfaceName = "System.Collections.IEnumerator"; + public static string IGenericEnumeratorInterfaceName = "System.Collections.Generic.IEnumerator`1"; + public static string CurrentPropertyName = "Current"; + + public static string static_ctor_prefix = "$sctor$"; + public static string generic_param_kind_prefix = "$kind_of$"; + public static string CheckCanUsePointerOnType_proc_name = "CheckCanUsePointerOnType"; + public static string CheckCanUseTypeForBinaryFiles_proc_name = "CheckCanUseTypeForBinaryFiles"; + public static string CheckCanUseTypeForTypedFiles_proc_name = "CheckCanUseTypeForTypedFiles"; + public static string RuntimeDetermineType_func_name = "RuntimeDetermineType"; + public static string RuntimeInitializeFunction_func_name = "RuntimeInitialize"; + public static string PointerToStringFunction_func_name = "PointerToString"; + public static string GetRuntimeSizeFunction_func_name = "GetRuntimeSize"; + public static string StrProcedure_func_name = "Str"; + public static string PascalABCVersion_func_name = "PascalABCVersion"; + public static string ChrUnicodeFunction_func_name = "ChrUnicode"; + public static string ExceptionName = "System.Exception"; + public static string value_in_accessor_name = "$value"; + public static string synonym_value_name = "$synonym"; + public static string file_of_attr_name = "$Attributes.$FileOfAttr"; + public static string set_of_attr_name = "$Attributes.$SetOfAttr"; + public static string type_synonim_attr_name = "$Attributes.$TypeSynonimAttr"; + public static string template_class_attr_name = "$Attributes.$TemplateClassAttr"; + public static string short_string_attr_name = "$Attributes.$ShortStringAttr"; + public static string global_attr_name = "$GlobAttr"; + public static string class_unit_attr_name = "$ClassUnitAttr"; + public static string pabc_rtl_dll_name = "PABCRtl.dll"; + public static string ObjectType = "Object"; + public static string StringType = "string"; + public static string config_variable_name = "__CONFIG__"; + } + +} diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 1d37bc881..defcf9c5e 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -20162,6 +20162,18 @@ namespace PascalABCCompiler.TreeConverter var type = st.lst[1] as type_definition; CheckIfCanBeMatched(expr, type); } + else if (st.typ is SemanticCheckType.MatchedExpressionAndExpression) + { + var matchedExpr = st.lst[0] as expression; + var patternExpr = st.lst[1] as expression; + CheckIfCanBeMatched(matchedExpr, patternExpr); + } + else if (st.typ is SemanticCheckType.MatchedTuple) + { + var tuple = st.lst[0] as expression; + var length = st.lst[1] as int32_const; + CheckIfCanBeMatched(tuple, length); + } // !Patterns else { diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 736b2ab80..0cd5b1892 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1971,6 +1971,37 @@ function KV(key: TKey; value: TVal): KeyValuePair; function __TypeCheckAndAssignForIsMatch(obj: object; var res: T): boolean; +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; + + // ----------------------------------------------------- // Стандартные классы исключений // ----------------------------------------------------- @@ -4486,6 +4517,112 @@ begin end; end; +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + 5: Result := Result and first.Item6.Equals(second.Item6); + end; +end; +end; + +function __WildCardsTupleEqual( + first: Tuple; + second: Tuple; + elemsToCompare: sequence of integer): boolean; +begin +Result := True; +foreach var ind in elemsToCompare do +begin + case ind of + 0: Result := Result and first.Item1.Equals(second.Item1); + 1: Result := Result and first.Item2.Equals(second.Item2); + 2: Result := Result and first.Item3.Equals(second.Item3); + 3: Result := Result and first.Item4.Equals(second.Item4); + 4: Result := Result and first.Item5.Equals(second.Item5); + 5: Result := Result and first.Item6.Equals(second.Item6); + 6: Result := Result and first.Item7.Equals(second.Item7); + end; +end; +end; + + ///-- procedure Deconstruct(self: T; var res: T); extensionmethod; begin diff --git a/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat b/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat index 3af3c3016..57d94a426 100644 --- a/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat +++ b/bin/Lng/Rus/SyntaxTreeVisitorsErrors.dat @@ -19,6 +19,7 @@ LAMBDA_EXPRESSIONS_CANNOT_CONTAIN_YIELD=Лямбда-выражения не м PATTERN_MATHING_IS_NOT_SUPPORTED_IN_THIS_CONTEXT=Сопоставление с образцом не поддерживается в данном контексте ONLY_ONE_DECONSTRUCT_ALLOWED=Можно определить только один пользовательский деконструктор REPEATED_DECONSTRUCTION_TYPE=Повторение типов при сопоставлении с образцом +REPEATED_DOTDOT_COLLECTION_PATTERN_EXPR=Конструкция '..' встречена более одного раза в выражении для сопоставления Var_{0}_is_already_defined=Переменная {0} уже определена