From 9e929f43e73dcdada925eabbc641133414ddef33 Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Sun, 26 Jul 2020 17:38:23 +0300
Subject: [PATCH 01/18] ArrFilter ArrTransform
---
.../SortArrays/QuickSortFunctional.pas | 13 ++----
bin/Lib/PABCSystem.pas | 46 ++++++++++---------
2 files changed, 29 insertions(+), 30 deletions(-)
diff --git a/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas b/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
index e57eef174..349681aab 100644
--- a/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
+++ b/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
@@ -1,13 +1,10 @@
// Быстрая сортировка Ч. Хоара
-// Неэффективный алгоритм, иллюстрирующмй суть
-function QS(a: array of integer): array of integer;
-begin
+// Неэффективный код, иллюстрирующий суть алгоритма
+function QS(a: array of integer): array of integer :=
if a.Length < 2 then
- Result := a
- else Result := QS(a[1:].Where(y->y<=a[0]).ToArray) + |a[0]| + QS(a[1:].Where(y->y>a[0]).ToArray)
- //QS(ArrGen(a[1:],y->y<=a[0]))
- //QS(|y:y in a[1:] where y<=a[0]|)
-end;
+ a
+ else
+ QS(ArrFilter(a[1:],y->y<=a[0])) + |a[0]| + QS(ArrFilter(a[1:],y->y>a[0]));
begin
var a := ArrRandom(20);
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index c0d260e4a..a29ade576 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -2224,6 +2224,11 @@ function ArrGen(count: integer; first, second: T; next: (T,T) ->T): array of
/// Возвращает массив из count элементов x
function ArrFill(count: integer; x: T): array of T;
+/// Возвращает массив из элементов массива a, удовлетворяющих условию condition
+function ArrFilter(a: array of T; condition: T->boolean): array of T;
+/// Возвращает по массиву a массив, преобразованный по правилу convert
+function ArrTransform(a: array of T; convert: T->T1): array of T1;
+
/// Возвращает массив из n целых, введенных с клавиатуры
function ReadArrInteger(n: integer): array of integer;
/// Возвращает массив из n целых int64, введенных с клавиатуры
@@ -4732,32 +4737,29 @@ begin
Result := a;
end;
-{function ListWhile(first: T; next: Func; pred: Predicate): List;
+function ArrTransform(a: array of T; convert: T->T1): array of T1;
begin
- var a := new List;
- var x := first;
- while pred(x) do
- begin
- a.Add(x);
- x := next(x);
- end;
- Result := a;
+ var n := a.Length;
+ var a1 := new T1[n];
+ for var i:=0 to n-1 do
+ a1[i] := convert(a[i]);
+ Result := a1;
end;
-function ListWhile(first,second: T; next: Func2; pred: Predicate): List;
+function ArrFilter(a: array of T; condition: T->boolean): array of T;
begin
- var a := new List;
- var x := first;
- var y := second;
- while pred(x) do
- begin
- a.Add(x);
- var z := next(x,y);
- x := y;
- y := z;
- end;
- Result := a;
-end;}
+ var n := a.Length;
+ var a1 := new T[n];
+ var j := 0;
+ for var i:=0 to n-1 do
+ if condition(a[i]) then
+ begin
+ a1[j] := a[i];
+ j += 1;
+ end;
+ SetLength(a1,j);
+ Result := a1;
+end;
function ArrFill(count: integer; x: T): array of T;
begin
From 9ae473518a137c9c7e2aefed29836abb25236e5b Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Mon, 27 Jul 2020 10:13:32 +0300
Subject: [PATCH 02/18] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20ArrFilte?=
=?UTF-8?q?r=20=D0=B8=20ArrTransform.=20=D0=95=D1=81=D1=82=D1=8C=20=D1=81?=
=?UTF-8?q?=D0=B8=D0=BD=D0=BE=D0=BD=D0=B8=D0=BC=D1=8B:=20a.ConvertAll=20?=
=?UTF-8?q?=D0=B8=20a.FindAll?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 +-
.../SortArrays/QuickSortFunctional.pas | 2 +-
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
TestSuite/CompilationSamples/PABCSystem.pas | 46 ++++++++++---------
bin/Lib/PABCSystem.pas | 14 +++---
7 files changed, 38 insertions(+), 34 deletions(-)
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 8bbcf8c3d..2982cadff 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2595";
+ public const string Revision = "2596";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 4f169b13c..7ee14efe4 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%MINOR%=6
-%REVISION%=2595
%COREVERSION%=3
+%REVISION%=2596
+%MINOR%=6
%MAJOR%=3
diff --git a/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas b/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
index 349681aab..d9e929a2b 100644
--- a/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
+++ b/InstallerSamples/Algorithms/SortArrays/QuickSortFunctional.pas
@@ -4,7 +4,7 @@ function QS(a: array of integer): array of integer :=
if a.Length < 2 then
a
else
- QS(ArrFilter(a[1:],y->y<=a[0])) + |a[0]| + QS(ArrFilter(a[1:],y->y>a[0]));
+ QS(a[1:].FindAll(y->y<=a[0])) + a[:1] + QS(a[1:].FindAll(y->y>a[0]));
begin
var a := ArrRandom(20);
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 15b13dd63..02eba4a48 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2595
+3.6.3.2596
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index d22bcb03c..0e67ff2a5 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2595'
+!define VERSION '3.6.3.2596'
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index c0d260e4a..a29ade576 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -2224,6 +2224,11 @@ function ArrGen(count: integer; first, second: T; next: (T,T) ->T): array of
/// Возвращает массив из count элементов x
function ArrFill(count: integer; x: T): array of T;
+/// Возвращает массив из элементов массива a, удовлетворяющих условию condition
+function ArrFilter(a: array of T; condition: T->boolean): array of T;
+/// Возвращает по массиву a массив, преобразованный по правилу convert
+function ArrTransform(a: array of T; convert: T->T1): array of T1;
+
/// Возвращает массив из n целых, введенных с клавиатуры
function ReadArrInteger(n: integer): array of integer;
/// Возвращает массив из n целых int64, введенных с клавиатуры
@@ -4732,32 +4737,29 @@ begin
Result := a;
end;
-{function ListWhile(first: T; next: Func; pred: Predicate): List;
+function ArrTransform(a: array of T; convert: T->T1): array of T1;
begin
- var a := new List;
- var x := first;
- while pred(x) do
- begin
- a.Add(x);
- x := next(x);
- end;
- Result := a;
+ var n := a.Length;
+ var a1 := new T1[n];
+ for var i:=0 to n-1 do
+ a1[i] := convert(a[i]);
+ Result := a1;
end;
-function ListWhile(first,second: T; next: Func2; pred: Predicate): List;
+function ArrFilter(a: array of T; condition: T->boolean): array of T;
begin
- var a := new List;
- var x := first;
- var y := second;
- while pred(x) do
- begin
- a.Add(x);
- var z := next(x,y);
- x := y;
- y := z;
- end;
- Result := a;
-end;}
+ var n := a.Length;
+ var a1 := new T[n];
+ var j := 0;
+ for var i:=0 to n-1 do
+ if condition(a[i]) then
+ begin
+ a1[j] := a[i];
+ j += 1;
+ end;
+ SetLength(a1,j);
+ Result := a1;
+end;
function ArrFill(count: integer; x: T): array of T;
begin
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index a29ade576..bfef6f463 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -2224,10 +2224,12 @@ function ArrGen(count: integer; first, second: T; next: (T,T) ->T): array of
/// Возвращает массив из count элементов x
function ArrFill(count: integer; x: T): array of T;
-/// Возвращает массив из элементов массива a, удовлетворяющих условию condition
-function ArrFilter(a: array of T; condition: T->boolean): array of T;
-/// Возвращает по массиву a массив, преобразованный по правилу convert
-function ArrTransform(a: array of T; convert: T->T1): array of T1;
+// Возвращает массив из элементов массива a, удовлетворяющих условию condition
+// a.FindAll
+//function ArrFilter(a: array of T; condition: T->boolean): array of T;
+// Возвращает по массиву a массив, преобразованный по правилу convert
+// a.ConvertAll
+//function ArrTransform(a: array of T; convert: T->T1): array of T1;
/// Возвращает массив из n целых, введенных с клавиатуры
function ReadArrInteger(n: integer): array of integer;
@@ -4737,7 +4739,7 @@ begin
Result := a;
end;
-function ArrTransform(a: array of T; convert: T->T1): array of T1;
+{function ArrTransform(a: array of T; convert: T->T1): array of T1;
begin
var n := a.Length;
var a1 := new T1[n];
@@ -4759,7 +4761,7 @@ begin
end;
SetLength(a1,j);
Result := a1;
-end;
+end;}
function ArrFill(count: integer; x: T): array of T;
begin
From 85b2d98f2e4ba6153ad0304063e865687a95dabf Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Mon, 27 Jul 2020 23:13:08 +0300
Subject: [PATCH 03/18] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D0=BF=D0=B0=D0=BA?=
=?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4?=
=?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81?=
=?UTF-8?q?=D1=82=D0=B8=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?=
=?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 +-
Localization/DefaultLang.resources | Bin 94998 -> 95065 bytes
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
.../StandardSyntaxConverter.cs | 2 +-
TestSuite/CompilationSamples/PABCSystem.pas | 14 +-
.../Closure/CapturedVariablesTreeBuilder.cs | 5 +
.../TreeConversion/syntax_tree_visitor.cs | 201 +++++++++++++++---
bin/Lng/Eng/SemanticErrors_ms.dat | 1 +
bin/Lng/Rus/SemanticErrors_ms.dat | 1 +
11 files changed, 189 insertions(+), 45 deletions(-)
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 2982cadff..2be4eddb3 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2596";
+ public const string Revision = "2603";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 7ee14efe4..e736c766f 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%COREVERSION%=3
-%REVISION%=2596
%MINOR%=6
+%REVISION%=2603
+%COREVERSION%=3
%MAJOR%=3
diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources
index da4f35610833b739db6184f12e140301aaf8c46a..8fa9e22ca7ddaeb9848375774ee04200ecbb72b4 100644
GIT binary patch
delta 70
zcmV-M0J;B`<^|d21(4tYb+O@sn-En{OhsQ$QeRU=QB_4wLq(GTToWDY?(p*E<{;?n
c=pgUz@$2Q}?&9F`cvtXRI)&Th`UH||9
delta 19
bcmccljCI;G)(H<7jW#}Pn!S11oXyt&YBmcN
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 02eba4a48..cdb9ce778 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2596
+3.6.3.2603
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 0e67ff2a5..0fa7746b4 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2596'
+!define VERSION '3.6.3.2603'
diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs
index d9b886219..ddccb9410 100644
--- a/SyntaxTreeConverters/StandardSyntaxConverter.cs
+++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs
@@ -45,7 +45,7 @@ namespace PascalABCCompiler.SyntaxTreeConverters
IndexVisitor.New.ProcessNode(root);
// assign_tuple и assign_var_tuple
- AssignTuplesDesugarVisitor.New.ProcessNode(root);
+ //AssignTuplesDesugarVisitor.New.ProcessNode(root);
// slice_expr и slice_expr_question
SliceDesugarVisitor.New.ProcessNode(root);
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index a29ade576..bfef6f463 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -2224,10 +2224,12 @@ function ArrGen(count: integer; first, second: T; next: (T,T) ->T): array of
/// Возвращает массив из count элементов x
function ArrFill(count: integer; x: T): array of T;
-/// Возвращает массив из элементов массива a, удовлетворяющих условию condition
-function ArrFilter(a: array of T; condition: T->boolean): array of T;
-/// Возвращает по массиву a массив, преобразованный по правилу convert
-function ArrTransform(a: array of T; convert: T->T1): array of T1;
+// Возвращает массив из элементов массива a, удовлетворяющих условию condition
+// a.FindAll
+//function ArrFilter(a: array of T; condition: T->boolean): array of T;
+// Возвращает по массиву a массив, преобразованный по правилу convert
+// a.ConvertAll
+//function ArrTransform(a: array of T; convert: T->T1): array of T1;
/// Возвращает массив из n целых, введенных с клавиатуры
function ReadArrInteger(n: integer): array of integer;
@@ -4737,7 +4739,7 @@ begin
Result := a;
end;
-function ArrTransform(a: array of T; convert: T->T1): array of T1;
+{function ArrTransform(a: array of T; convert: T->T1): array of T1;
begin
var n := a.Length;
var a1 := new T1[n];
@@ -4759,7 +4761,7 @@ begin
end;
SetLength(a1,j);
Result := a1;
-end;
+end;}
function ArrFill(count: integer; x: T): array of T;
begin
diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs
index f3675450b..e9b677fda 100644
--- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs
+++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs
@@ -69,6 +69,11 @@ namespace TreeConverter.LambdaExpressions.Closure
// Не обходить проверочные узлы в визиторе строительства дерева - SSM 1.05.17
}
+ public override void visit(assign_var_tuple assvartup)
+ {
+ _visitor.ProcessNode(assvartup);
+ }
+
public override void visit(var_def_statement varDefStmt)
{
if (varDefStmt.inital_value != null)
diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
index 5fa78dc93..dc4ffd6fb 100644
--- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs
+++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
@@ -17439,6 +17439,44 @@ namespace PascalABCCompiler.TreeConverter
throw new NotSupportedError(get_location(_expression));
}
+ public void visit_statement_list_internal(SyntaxTree.statement_list _statement_list)
+ {
+ statements_list stl = new statements_list(get_location(_statement_list), get_location_with_check(_statement_list.left_logical_bracket), get_location_with_check(_statement_list.right_logical_bracket));
+
+ for (var i = 0; i < _statement_list.subnodes.Count; i++) // SSM 13.10.16 - поменял т.к. собираюсь менять узлы в процессе обхода
+ {
+ statement syntax_statement = _statement_list.subnodes[i];
+ try
+ {
+ statement_node semantic_statement = convert_strong(syntax_statement);
+ if (semantic_statement != null)
+ {
+ if (stl.statements.Count > 0 && stl.statements[0] is basic_function_call && i == 2)
+ {
+ base_function_call bfc = stl.statements[0] as basic_function_call;
+ if (bfc.type != null && bfc.type.name.Contains("<>local_variables_class") && (semantic_statement is compiled_constructor_call || semantic_statement is common_constructor_call)
+ && !context.converted_func_stack.Empty && context.converted_func_stack.top() is common_method_node && (context.converted_func_stack.top() as common_method_node).is_constructor)
+ stl.statements.AddElementFirst(semantic_statement);
+ else
+ stl.statements.AddElement(semantic_statement);
+ }
+ else
+ stl.statements.AddElement(semantic_statement);
+ }
+ context.allow_inherited_ctor_call = false;
+ }
+ catch (Errors.Error ex)
+ {
+ if (ThrowCompilationError || ex is MemberIsNotDeclaredInType || ex is UndefinedNameReference)//TODO: add interface
+ throw ex;
+ else
+ ErrorsList.Add(ex);
+ }
+ }
+
+ return_value(stl);
+ }
+
public override void visit(SyntaxTree.statement_list _statement_list)
{
#region MikhailoMMX, обработка omp parallel section
@@ -20658,89 +20696,186 @@ namespace PascalABCCompiler.TreeConverter
ProcessNode(av.new_addr_value); // обойти десахарное
}
+ private void CheckUnpacking(expression ex, out expression_node sem_ex, out bool IsTuple, out bool IsSequence, int countvars, syntax_tree_node stn)
+ {
+ sem_ex = convert_strong(ex);
+ sem_ex = convert_if_typed_expression_to_function_call(sem_ex);
+ var t = ConvertSemanticTypeNodeToNETType(sem_ex.type);
+ if (t == null)
+ AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED");
+ IsTuple = false;
+ IsSequence = false;
+ if (t.FullName.StartsWith("System.Tuple"))
+ IsTuple = true;
+ if (!IsTuple)
+ {
+ if (t.Name.Equals("IEnumerable`1") || t.GetInterface("IEnumerable`1") != null)
+ IsSequence = true;
+ }
+ if (!IsTuple && !IsSequence)
+ {
+ AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED");
+ }
+ if (IsTuple)
+ {
+ if (countvars > t.GetGenericArguments().Count())
+ AddError(get_location(stn), "TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT");
+ }
+ }
+
+ private addressed_value UnpackingExpr(int i, bool IsTuple, bool IsSequence, string tname)
+ {
+ addressed_value dn = null;
+ if (IsTuple)
+ dn = new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString()));
+ else if (IsSequence)
+ {
+ dn = new dot_node(new ident(tname), new ident("ElementAt"));
+ var pars = new SyntaxTree.expression_list(new int32_const(i));
+
+ dn = new method_call(dn, pars);
+ }
+ return dn;
+ }
+
public override void visit(SyntaxTree.assign_tuple asstup) // сахарный узел
{
- AddError(get_location(asstup), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", asstup.GetType().Name);
+ //AddError(get_location(asstup), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", asstup.GetType().Name);
- /*semantic_check_assign_tuple(asstup);
+
+ CheckUnpacking(asstup.expr, out var sem_ex, out var IsTuple, out var IsSequence, asstup.vars.variables.Count(), asstup.vars);
+ var sem_node = new SyntaxTree.semantic_addr_value(sem_ex); // чтобы два раза не делать convert_strong
+
+ //semantic_check_assign_tuple(asstup.vars, asstup.expr);
var tname = "#temp_var" + UniqueNumStr();
- //var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название
- var tt = new var_statement(new ident(tname), asstup.expr); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название
- var st = new statement_list(new SyntaxTree.empty_statement());
+ var tt = new var_statement(new ident(tname), sem_node /*asstup.expr*/); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название
+ var st = new statement_list();
st.Add(tt);
var n = asstup.vars.variables.Count();
for (var i = 0; i < n; i++)
{
- var a = new assign(asstup.vars.variables[i], new dot_node(new ident(tname),
- new ident("Item" + (i + 1).ToString())), Operators.Assignment,
+ var a = new assign(asstup.vars.variables[i],
+ //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())),
+ UnpackingExpr(i, IsTuple, IsSequence, tname),
+ Operators.Assignment,
asstup.vars.variables[i].source_context);
st.Add(a);
}
- //visit(st);
- // Замена 1 оператор на 1 оператор - всё OK
- ReplaceUsingParent(asstup, st);*/
+ visit(st);
}
public override void visit(SyntaxTree.assign_var_tuple assvartup) // сахарный узел
{
- AddError(get_location(assvartup), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", assvartup.GetType().Name);
+ //AddError(get_location(assvartup), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", assvartup.GetType().Name);
- /*check_sugared(assvartup);
+ CheckUnpacking(assvartup.expr, out var sem_ex, out var IsTuple, out var IsSequence, assvartup.idents.idents.Count(), assvartup.idents);
+
+ /*var sem_ex = convert_strong(assvartup.expr);
+ sem_ex = convert_if_typed_expression_to_function_call(sem_ex);
+ var t = ConvertSemanticTypeNodeToNETType(sem_ex.type);
+ if (t == null)
+ AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED");
+
+ var IsTuple = false;
+ var IsSequence = false;
+ if (t.FullName.StartsWith("System.Tuple"))
+ IsTuple = true;
+ if (!IsTuple)
+ {
+ if (t.Name.Equals("IEnumerable`1") || t.GetInterface("IEnumerable`1") != null)
+ IsSequence = true;
+ }
+ if (!IsTuple && !IsSequence)
+ {
+ AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED");
+ }
+
+ if (IsTuple)
+ {
+ var nn = assvartup.idents.idents.Count();
+ if (nn > t.GetGenericArguments().Count())
+ AddError(get_location(assvartup.idents), "TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT");
+ }*/
+
+
+ // В зависимости от типа выражения по-разному распаковывать
+ // Распаковывать можно только для кортежей или последовательностей
+ // if IsTuple ...
+ // if IsSequence ...
+ // else AddError(либо кортеж либо последовательность)
+
+ var sem_node = new SyntaxTree.semantic_addr_value(sem_ex); // чтобы два раза не делать convert_strong
+
+ //semantic_check_assign_var_tuple(assvartup.idents, sem_node /*assvartup.expr*/);
var tname = "#temp_var" + UniqueNumStr();
- var tt = new var_statement(new ident(tname), assvartup.expr); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!!
- //var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название
- //visit(tt); // обходится первый элемент - вместо asstup
+ var tt = new var_statement(new ident(tname), sem_node /*assvartup.expr*/);
- var sl = new List();
- sl.Add(new SyntaxTree.empty_statement());
- sl.Add(tt); // он же помещается в новое синтаксическое дерево
+ var sl = new statement_list();
+ sl.Add(tt);
var n = assvartup.idents.idents.Count();
for (var i = 0; i < n; i++)
{
+ /*addressed_value dn = null;
+ if (IsTuple)
+ dn = new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString()));
+ else if (IsSequence)
+ {
+ dn = new dot_node(new ident(tname), new ident("ElementAt"));
+ var pars = new SyntaxTree.expression_list(new int32_const(i));
+
+ dn = new method_call(dn,pars);
+ }*/
+
var rr = assvartup.idents.idents[i] as ident;
- var a = new var_statement(rr,
- new dot_node(new ident(tname),new ident("Item" + (i + 1).ToString())),
+ var a = new var_statement(rr,
+ //new dot_node(new ident(tname),new ident("Item" + (i + 1).ToString())),
+ //dn,
+ UnpackingExpr(i, IsTuple, IsSequence, tname),
assvartup.idents.idents[i].source_context
);
- // Остальные элементы обходить не надо (!!!уже надо!) - они обходятся на следующих итерациях при обходе внешнего statement_list
- //visit(a);
sl.Add(a);
}
- ReplaceStatementUsingParent(assvartup, sl);*/
+ visit_statement_list_internal(sl);
}
public override void visit(var_tuple_def_statement vtd)
{
- AddError(get_location(vtd), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", vtd.GetType().Name);
+ //AddError(get_location(vtd), "SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR", vtd.GetType().Name);
// Состоит из var_def_statements. Некоторые являются var_tuple_def_statement
// Их надо найти и сделать несколько секций variable_definitions - без семантических проверок.
// Каждую var_tuple_def_statement надо заменить на assign_var_tuple - одну на секцию variable_definitions
// А потом оставшаяся часть визитора сделает семантические проверки
- /*var tname = "#temp_var" + UniqueNumStr();
- var vd = new List();
- vd.Add(new semantic_check_sugared_var_def_statement_node(typeof(assign_var_tuple), new List { vtd.vars, vtd.inital_value }, vtd.source_context)); // Это нужно для проверок на этапе преобразования в семантику
- visit(vd[0]);
+ CheckUnpacking(vtd.inital_value, out var sem_ex, out var IsTuple, out var IsSequence, vtd.vars.idents.Count(), vtd.vars);
+ var sem_node = new SyntaxTree.semantic_addr_value(sem_ex); // чтобы два раза не делать convert_strong
+
+ //semantic_check_assign_var_tuple(vtd.vars, vtd.inital_value);
+
+ var tname = "#temp_var" + UniqueNumStr();
+ //var vd = new List();
+ //vd.Add(new semantic_check_sugared_var_def_statement_node(typeof(assign_var_tuple), new List { vtd.vars, vtd.inital_value }, vtd.source_context)); // Это нужно для проверок на этапе преобразования в семантику
+ //visit(vd[0]);
+
var tt1 = new var_def_statement(new ident(tname), vtd.inital_value);
- vd.Add(tt1);
+ ProcessNode(tt1);
var nn = vtd.vars.idents.Count();
for (var i = 0; i < nn; i++)
{
var a = new var_def_statement(vtd.vars.idents[i],
- new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())),
+ UnpackingExpr(i, IsTuple, IsSequence, tname),
+ //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())),
vtd.vars.idents[i].source_context);
- vd.Add(a);
+ ProcessNode(a);
}
-
- ReplaceVarTupleDefStatementUsingParent(vtd, vd);*/
}
+
public void ReplaceVarTupleDefStatementUsingParent(var_tuple_def_statement from, IEnumerable to)
{
foreach (var x in to)
diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat
index bd5248d43..a26dee7e7 100644
--- a/bin/Lng/Eng/SemanticErrors_ms.dat
+++ b/bin/Lng/Eng/SemanticErrors_ms.dat
@@ -1,6 +1,7 @@
%PREFIX%=SEMANTICERROR_
CAN_NOT_READ=Can not read data of this type
TUPLE_EXPECTED=Tuple expected
+TUPLE_OR_SEQUENCE_EXPECTED=Tuple or sequence expected
TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT=Too many elements on the left side of tuple assignment
ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Tuple allows only base assignment :=
TUPLE_TYPE_ERROR=Bad element in Tuple type
diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat
index 4f28b55b6..240fb5f76 100644
--- a/bin/Lng/Rus/SemanticErrors_ms.dat
+++ b/bin/Lng/Rus/SemanticErrors_ms.dat
@@ -1,6 +1,7 @@
%PREFIX%=SEMANTICERROR_
CAN_NOT_READ=Нельзя считывать данные этого типа
TUPLE_EXPECTED=Ожидался кортеж
+TUPLE_OR_SEQUENCE_EXPECTED=Ожидался кортеж или последовательность
TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT=Слишком много элементов в левой части при присваивании кортежа
ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Для кортежа допустимо только обычное присваивание :=
TUPLE_TYPE_ERROR=Ошибочная конструкция при построении типа кортежа
From b0ea0a30cae0e7a8f2398c59fe670a1a15c6e05c Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Tue, 28 Jul 2020 10:11:48 +0300
Subject: [PATCH 04/18] =?UTF-8?q?SF=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?=
=?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8?=
=?UTF-8?q?=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D1=8F?=
=?UTF-8?q?=20=D1=81=20=D0=BA=D0=BE=D1=80=D0=BE=D1=82=D0=BA=D0=B8=D0=BC?=
=?UTF-8?q?=D0=B8=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=D0=BC=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bin/Lib/PABCSystem.pas | 5 ++-
bin/Lib/SF.pas | 88 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 91 insertions(+), 2 deletions(-)
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index bfef6f463..3baaf5af1 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -2122,6 +2122,9 @@ procedure Reverse(var s: string);
procedure Reverse(var s: string; index, count: integer);
/// Перемешивает динамический массив случайным образом
procedure Shuffle(a: array of T);
+/// Возвращает, совпадают ли массивы
+function ArrEqual(a, b: array of T): boolean;
+
/// Сравнивает матрицы на равенство
function MatrEqual(a, b: array [,] of T): boolean;
/// Перемешивает список случайным образом
@@ -2254,8 +2257,6 @@ function ReadArrReal(prompt: string; n: integer): array of real;
/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры
function ReadArrString(prompt: string; n: integer): array of string;
-/// Возвращает, совпадают ли массивы
-function ArrEqual(a, b: array of T): boolean;
// -----------------------------------------------------
//>> Подпрограммы для создания двумерных динамических массивов # Subroutines for matrixes
diff --git a/bin/Lib/SF.pas b/bin/Lib/SF.pas
index f4f8a9f10..d683205f8 100644
--- a/bin/Lib/SF.pas
+++ b/bin/Lib/SF.pas
@@ -11,6 +11,7 @@ function RI64 := ReadInt64;
function RR := ReadReal;
function RC := ReadChar;
function RS := ReadString;
+function RL := ReadLexem;
function RlnI := ReadlnInteger;
function RlnBI := ReadlnBigInteger;
@@ -68,36 +69,123 @@ function Prln(Self: char): char; extensionmethod := Self.Println;
function Prln(Self: boolean): boolean; extensionmethod := Self.Println;
function Prln(Self: string): string; extensionmethod := Self.Println;
+/// Записывает в min значение x если xmax
procedure ReMax(var max: integer; x: integer);
begin
if x > max then
max := x
end;
+/// Записывает в min значение x если xmax
procedure ReMax(var max: real; x: real);
begin
if x > max then
max := x
end;
+/// Преобразует строку в целое
function ToI(Self: string); extensionmethod := Self.ToInteger;
+/// Преобразует строку в вещественное
function ToR(Self: string); extensionmethod := Self.ToReal;
+/// Преобразует строку в массив целых
+function ToIs(Self: string); extensionmethod := Self.ToIntegers;
+
+/// Преобразует строку в массив вещественных
+function ToRs(Self: string); extensionmethod := Self.ToReals;
+
function operator-(c,c1: char): integer; extensionmethod := Ord(c) - Ord(c1);
+/// Возвращает длину строки
function Len(Self: string): integer; extensionmethod := Self.Length;
+/// Возвращает длину массива
+function Len(Self: array of T): integer; extensionmethod := Self.Length;
+
+/// Возвращает среднее элементов последовательности
+function Av(Self: sequence of integer): real; extensionmethod := Self.Average;
+/// Возвращает среднее элементов последовательности
+function Av(Self: sequence of real): real; extensionmethod := Self.Average;
+
+function Dst(Self: sequence of T): sequence of T; extensionmethod := Self.Distinct;
+
+function Ord(Self: sequence of T): sequence of T; extensionmethod := Self.Order;
+function OrdD(Self: sequence of T): sequence of T; extensionmethod := Self.OrderDescending;
+
+/// Преобразует последовательность в строку
+function Str(Self: sequence of T): string; extensionmethod := Self.JoinToString;
+
+/// Выводит последовательность, разделяя элементы пробелами
+function Pr(Self: sequence of T): sequence of T; extensionmethod := Self.Print;
+/// Выводит последовательность, разделяя элементы пробелами, и переходит на новую строку
+function Prln(Self: sequence of T): sequence of T; extensionmethod := Self.Println;
+
+/// Возвращает инвертированную последовательность
+function Rev(Self: sequence of T): sequence of T; extensionmethod := Self.Reverse;
+
+/// Преобразует последовательность, используя функцию transform
+function Sel(Self: sequence of T; transform: T->T1): sequence of T1; extensionmethod := Self.Select(transform);
+
+/// Фильтрует последовательность по условию cond
+function Wh(Self: sequence of T; cond: T->boolean): sequence of T; extensionmethod := Self.Where(cond);
+
+/// Преобразует последовательность в массив
+function ToA(Self: sequence of T): array of T; extensionmethod := Self.ToArray;
+
+/// Преобразует последовательность в список
+function ToL(Self: sequence of T): List; extensionmethod := Self.ToList;
+
+/// Преобразует последовательность в HashSet
+function ToHS(Self: sequence of T): HashSet; extensionmethod := Self.ToHashSet;
+/// Преобразует последовательность в SortedSet
+function ToSS(Self: sequence of T): SortedSet; extensionmethod := Self.ToSortedSet;
+
+/// Преобразует последовательность в HashSet
+function HS(s: sequence of T): HashSet := s.ToHashSet;
+/// Преобразует последовательность в SortedSet
+function SS(s: sequence of T): SortedSet := s.ToSortedSet;
+
+/// Инвертирует последовательность
+procedure Rev(a: array of T) := Reverse(a);
+
+/// Возвращает индекс минимального элемента
+function IMin(Self: array of T): integer; extensionmethod; where T: IComparable;
+begin
+ Result := Self.IndexMin;
+end;
+
+/// Возвращает индекс максимального элемента
+function IMax(Self: array of T): integer; extensionmethod; where T: IComparable;
+begin
+ Result := Self.IndexMax;
+end;
+
+/// Возвращает True если массивы равны
+function Eq(Self,b: array of T): boolean; extensionmethod := Self.ArrEqual(b);
+
+/// Возвращает в виде массива все элементы, удовлетворяющие cond
+function Filt(Self: array of T; cond: T->boolean): array of T; extensionmethod := Self.FindAll(cond);
+
+/// Возвращает массив с элементами, преобразованными по правилу transform
+function Tr(Self: array of T; transform: T->T): array of T; extensionmethod := Self.ConvertAll(transform);
+
+/// Преобразует массив по правилу transform
+procedure Tr(a: array of T; transform: T->T) := a.Transform(transform);
+
+
end.
\ No newline at end of file
From 15a94452162f8843d791ed4e743618aa35bb954d Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Wed, 29 Jul 2020 11:29:51 +0300
Subject: [PATCH 05/18] =?UTF-8?q?x=20=E2=86=92=20x=20(=D1=81=D1=82=D1=80?=
=?UTF-8?q?=D0=B5=D0=BB=D0=BE=D1=87=D0=BA=D0=B0=20:))?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
|1,2,3|.Print
---
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 +-
.../PascalABCParserNewSaushkin/ABCPascal.cs | 1524 ++++++++---------
.../PascalABCParserNewSaushkin/ABCPascal.lex | 4 +-
.../PascalABCParserNewSaushkin/ABCPascal.y | 8 +-
.../ABCPascalYacc.cs | 946 +++++-----
Parsers/PascalABCParserNewSaushkin/PABC.ymc | 1 +
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
SyntaxTree/tree/SyntaxTreeStreamReader.cs | 2 +-
SyntaxTree/tree/SyntaxTreeStreamWriter.cs | 2 +-
SyntaxTree/tree/Tree.cs | 2 +-
SyntaxTree/tree/tree.xml | 2 +-
TestSuite/CompilationSamples/PABCSystem.pas | 7 +-
TestSuite/CompilationSamples/SF.pas | 91 +
bin/Lib/PABCSystem.pas | 2 +-
bin/Lib/SF.pas | 3 +
17 files changed, 1347 insertions(+), 1257 deletions(-)
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 2be4eddb3..9dc1e9936 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2603";
+ public const string Revision = "2604";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index e736c766f..4cfaf70d5 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%MINOR%=6
-%REVISION%=2603
%COREVERSION%=3
+%REVISION%=2604
+%MINOR%=6
%MAJOR%=3
diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs
index bee8217d1..46d40d6fc 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: 26.07.2020 13:45:30
-// UserName: Ivan
+// Machine: DESKTOP-G8V08V4
+// DateTime: 29.07.2020 11:15:11
+// UserName: ?????????
// GPLEX input file
// GPLEX frame file
//
@@ -124,8 +124,8 @@ namespace GPPGParserScanner
enum Result {accept, noMatch, contextFound};
- const int maxAccept = 70;
- const int initial = 71;
+ const int maxAccept = 69;
+ const int initial = 70;
const int eofNum = 0;
const int goStart = -1;
const int INITIAL = 0;
@@ -177,65 +177,65 @@ public PT parsertools;
}
};
- static int[] startState = new int[] {71, 108, 109, 110, 110, 111,
+ static int[] startState = new int[] {70, 106, 107, 108, 108, 109,
0};
#region TwoLevelCharacterMap
//
- // There are 50 equivalence classes
+ // There are 48 equivalence classes
// There are 256 character sequence regions
// There are 47 tables, 12032 entries
//
static sbyte[] mLo0 = new sbyte[256] {
-/* '\0' */ 5, 44, 5, 5, 5, 5, 5, 5, 5, 12, 0, 5, 5, 6, 5, 5,
+/* '\0' */ 5, 42, 5, 5, 5, 5, 5, 5, 5, 12, 0, 5, 5, 6, 5, 5,
/* '\x10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\x20' */ 12, 29, 5, 11, 4, 5, 13, 49, 7, 9, 8, 24, 14, 25, 16, 1,
-/* '0' */ 46, 46, 31, 46, 46, 46, 46, 46, 46, 30, 15, 17, 27, 23, 26, 20,
-/* '@' */ 22, 47, 47, 47, 47, 48, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* 'P' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 18, 5, 19, 28, 21,
-/* '`' */ 5, 41, 47, 47, 47, 32, 47, 45, 45, 37, 45, 45, 45, 42, 39, 38,
-/* 'p' */ 34, 45, 35, 36, 40, 45, 45, 45, 33, 43, 45, 3, 10, 2, 5, 5,
+/* '\x20' */ 12, 5, 5, 11, 4, 5, 13, 47, 7, 9, 8, 24, 14, 25, 16, 1,
+/* '0' */ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 15, 17, 27, 23, 26, 20,
+/* '@' */ 22, 45, 45, 45, 45, 46, 45, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* 'P' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 18, 5, 19, 28, 21,
+/* '`' */ 5, 39, 45, 45, 45, 30, 45, 43, 43, 35, 43, 43, 43, 40, 37, 36,
+/* 'p' */ 32, 43, 33, 34, 38, 43, 43, 43, 31, 41, 43, 3, 10, 2, 5, 5,
/* '\x80' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\x90' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\xA0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 5, 5, 5, 5, 5,
-/* '\xB0' */ 5, 5, 5, 5, 5, 45, 5, 5, 5, 5, 45, 5, 5, 5, 5, 5,
-/* '\xC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\xD0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\xE0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\xF0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\xA0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 5, 5, 5, 5, 5,
+/* '\xB0' */ 5, 5, 5, 5, 5, 43, 5, 5, 5, 5, 43, 5, 5, 5, 5, 5,
+/* '\xC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\xD0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\xE0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\xF0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo1 = new sbyte[256] {
-/* '\u0100' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0110' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0120' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0130' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0140' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0150' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0160' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0170' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0180' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0190' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u01F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u0100' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0110' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0120' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0130' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0140' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0150' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0160' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0170' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0180' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0190' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u01F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo2 = new sbyte[256] {
-/* '\u0200' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0210' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0220' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0230' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0240' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0250' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0260' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0270' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0280' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0290' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u02A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u02B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u02C0' */ 45, 45, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u02D0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u02E0' */ 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 5,
+/* '\u0200' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0210' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0220' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0230' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0240' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0250' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0260' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0270' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0280' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0290' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u02A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u02B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u02C0' */ 43, 43, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u02D0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u02E0' */ 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 5,
/* '\u02F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo3 = new sbyte[256] {
/* '\u0300' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -245,83 +245,83 @@ public PT parsertools;
/* '\u0340' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0350' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0360' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0370' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 5, 5,
-/* '\u0380' */ 5, 5, 5, 5, 5, 5, 45, 5, 45, 45, 45, 5, 45, 5, 45, 45,
-/* '\u0390' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u03A0' */ 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u03B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u03C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u03D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u03E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u03F0' */ 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u0370' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 5, 5,
+/* '\u0380' */ 5, 5, 5, 5, 5, 5, 43, 5, 43, 43, 43, 5, 43, 5, 43, 43,
+/* '\u0390' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u03A0' */ 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u03B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u03C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u03D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u03E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u03F0' */ 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo4 = new sbyte[256] {
-/* '\u0400' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0410' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0420' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0430' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0440' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0450' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0460' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0470' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0480' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0490' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u04F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u0400' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0410' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0420' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0430' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0440' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0450' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0460' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0470' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0480' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0490' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u04F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo5 = new sbyte[256] {
-/* '\u0500' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0510' */ 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0500' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0510' */ 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0520' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0530' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0540' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0550' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 45, 5, 5, 5, 5, 5, 5,
-/* '\u0560' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0570' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0580' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0530' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0540' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0550' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 43, 5, 5, 5, 5, 5, 5,
+/* '\u0560' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0570' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0580' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0590' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u05A0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u05B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u05C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u05D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u05E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\u05F0' */ 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
+/* '\u05D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u05E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\u05F0' */ 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo6 = new sbyte[256] {
/* '\u0600' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0610' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0620' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0630' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\u0640' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
+/* '\u0620' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0630' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\u0640' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
/* '\u0650' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0660' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45,
-/* '\u0670' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0680' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0690' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u06A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u06B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u06C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u06D0' */ 45, 45, 45, 45, 5, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u06E0' */ 5, 5, 5, 5, 5, 45, 45, 5, 5, 5, 5, 5, 5, 5, 45, 45,
-/* '\u06F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 5, 5, 45 };
+/* '\u0660' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43,
+/* '\u0670' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0680' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0690' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u06A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u06B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u06C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u06D0' */ 43, 43, 43, 43, 5, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u06E0' */ 5, 5, 5, 5, 5, 43, 43, 5, 5, 5, 5, 5, 5, 5, 43, 43,
+/* '\u06F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 5, 5, 43 };
static sbyte[] mLo7 = new sbyte[256] {
/* '\u0700' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0710' */ 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0720' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+/* '\u0710' */ 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0720' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
/* '\u0730' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0740' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45,
-/* '\u0750' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0760' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
+/* '\u0740' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43,
+/* '\u0750' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0760' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
/* '\u0770' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0780' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0790' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u07A0' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u07B0' */ 5, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u07C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\u07D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u07E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\u07F0' */ 5, 5, 5, 5, 45, 45, 5, 5, 5, 5, 45, 5, 5, 5, 5, 5 };
+/* '\u0780' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0790' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u07A0' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u07B0' */ 5, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u07C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\u07D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u07E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\u07F0' */ 5, 5, 5, 5, 43, 43, 5, 5, 5, 5, 43, 5, 5, 5, 5, 5 };
static sbyte[] mLo8 = new sbyte[256] {
/* '\u0800' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0810' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -340,117 +340,117 @@ public PT parsertools;
/* '\u08E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u08F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo9 = new sbyte[256] {
-/* '\u0900' */ 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0910' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0920' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0930' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 45, 5, 5,
+/* '\u0900' */ 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0910' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0920' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0930' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 43, 5, 5,
/* '\u0940' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0950' */ 45, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0960' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0970' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45,
-/* '\u0980' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 45,
-/* '\u0990' */ 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u09A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u09B0' */ 45, 5, 45, 5, 5, 5, 45, 45, 45, 45, 5, 5, 5, 45, 5, 5,
-/* '\u09C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 5,
-/* '\u09D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 5, 45,
-/* '\u09E0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u09F0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
+/* '\u0950' */ 43, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0960' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0970' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43,
+/* '\u0980' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 43,
+/* '\u0990' */ 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u09A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u09B0' */ 43, 5, 43, 5, 5, 5, 43, 43, 43, 43, 5, 5, 5, 43, 5, 5,
+/* '\u09C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 5,
+/* '\u09D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 5, 43,
+/* '\u09E0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u09F0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo10 = new sbyte[256] {
-/* '\u0A00' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 45,
-/* '\u0A10' */ 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0A20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0A30' */ 45, 5, 45, 45, 5, 45, 45, 5, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\u0A00' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 43,
+/* '\u0A10' */ 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0A20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0A30' */ 43, 5, 43, 43, 5, 43, 43, 5, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\u0A40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0A50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 5, 45, 5,
+/* '\u0A50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 5, 43, 5,
/* '\u0A60' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0A70' */ 5, 5, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0A80' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45,
-/* '\u0A90' */ 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0AA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0AB0' */ 45, 5, 45, 45, 5, 45, 45, 45, 45, 45, 5, 5, 5, 45, 5, 5,
+/* '\u0A70' */ 5, 5, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0A80' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43,
+/* '\u0A90' */ 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0AA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0AB0' */ 43, 5, 43, 43, 5, 43, 43, 43, 43, 43, 5, 5, 5, 43, 5, 5,
/* '\u0AC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0AD0' */ 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0AE0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0AD0' */ 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0AE0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0AF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo11 = new sbyte[256] {
-/* '\u0B00' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 45,
-/* '\u0B10' */ 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0B20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0B30' */ 45, 5, 45, 45, 5, 45, 45, 45, 45, 45, 5, 5, 5, 45, 5, 5,
+/* '\u0B00' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 43,
+/* '\u0B10' */ 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0B20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0B30' */ 43, 5, 43, 43, 5, 43, 43, 43, 43, 43, 5, 5, 5, 43, 5, 5,
/* '\u0B40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0B50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 5, 45,
-/* '\u0B60' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0B70' */ 5, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0B80' */ 5, 5, 5, 45, 5, 45, 45, 45, 45, 45, 45, 5, 5, 5, 45, 45,
-/* '\u0B90' */ 45, 5, 45, 45, 45, 45, 5, 5, 5, 45, 45, 5, 45, 5, 45, 45,
-/* '\u0BA0' */ 5, 5, 5, 45, 45, 5, 5, 5, 45, 45, 45, 5, 5, 5, 45, 45,
-/* '\u0BB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\u0B50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 5, 43,
+/* '\u0B60' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0B70' */ 5, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0B80' */ 5, 5, 5, 43, 5, 43, 43, 43, 43, 43, 43, 5, 5, 5, 43, 43,
+/* '\u0B90' */ 43, 5, 43, 43, 43, 43, 5, 5, 5, 43, 43, 5, 43, 5, 43, 43,
+/* '\u0BA0' */ 5, 5, 5, 43, 43, 5, 5, 5, 43, 43, 43, 5, 5, 5, 43, 43,
+/* '\u0BB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\u0BC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0BD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0BE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0BF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo12 = new sbyte[256] {
-/* '\u0C00' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\u0C10' */ 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0C20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0C30' */ 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\u0C00' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\u0C10' */ 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0C20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0C30' */ 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\u0C40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0C50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0C60' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0C60' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0C70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0C80' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\u0C90' */ 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0CA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0CB0' */ 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 5, 5, 5, 45, 5, 5,
+/* '\u0C80' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\u0C90' */ 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0CA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0CB0' */ 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 5, 5, 5, 43, 5, 5,
/* '\u0CC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0CD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 5,
-/* '\u0CE0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0CD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 5,
+/* '\u0CE0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0CF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo13 = new sbyte[256] {
-/* '\u0D00' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\u0D10' */ 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0D20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0D30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\u0D00' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\u0D10' */ 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0D20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0D30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\u0D40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0D50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0D60' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0D60' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0D70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0D80' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0D90' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\u0DA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0DB0' */ 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 5, 5,
-/* '\u0DC0' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0D80' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0D90' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\u0DA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0DB0' */ 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 5, 5,
+/* '\u0DC0' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0DD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0DE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0DF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo14 = new sbyte[256] {
-/* '\u0E00' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0E10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0E20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0E30' */ 45, 5, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0E40' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0E00' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0E10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0E20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0E30' */ 43, 5, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0E40' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0E50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0E60' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0E70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0E80' */ 5, 45, 45, 5, 45, 5, 5, 45, 45, 5, 45, 5, 5, 45, 5, 5,
-/* '\u0E90' */ 5, 5, 5, 5, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0EA0' */ 5, 45, 45, 45, 5, 45, 5, 45, 5, 5, 45, 45, 5, 45, 45, 45,
-/* '\u0EB0' */ 45, 5, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 5, 5,
-/* '\u0EC0' */ 45, 45, 45, 45, 45, 5, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0ED0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 5, 5,
+/* '\u0E80' */ 5, 43, 43, 5, 43, 5, 5, 43, 43, 5, 43, 5, 5, 43, 5, 5,
+/* '\u0E90' */ 5, 5, 5, 5, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0EA0' */ 5, 43, 43, 43, 5, 43, 5, 43, 5, 5, 43, 43, 5, 43, 43, 43,
+/* '\u0EB0' */ 43, 5, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 5, 5,
+/* '\u0EC0' */ 43, 43, 43, 43, 43, 5, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0ED0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 5, 5,
/* '\u0EE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0EF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo15 = new sbyte[256] {
-/* '\u0F00' */ 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u0F00' */ 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0F10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0F20' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0F30' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0F40' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0F50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u0F60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
+/* '\u0F40' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0F50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u0F60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
/* '\u0F70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u0F80' */ 5, 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 5, 5, 5, 5,
+/* '\u0F80' */ 5, 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 5, 5, 5, 5,
/* '\u0F90' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0FA0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0FB0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -459,161 +459,161 @@ public PT parsertools;
/* '\u0FE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u0FF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo16 = new sbyte[256] {
-/* '\u1000' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1010' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1020' */ 45, 45, 5, 45, 45, 45, 45, 45, 5, 45, 45, 5, 5, 5, 5, 5,
+/* '\u1000' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1010' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1020' */ 43, 43, 5, 43, 43, 43, 43, 43, 5, 43, 43, 5, 5, 5, 5, 5,
/* '\u1030' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1040' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1050' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1050' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1060' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1070' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1080' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1090' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u10A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u10B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u10C0' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u10D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u10E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u10F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 5, 5, 5 };
+/* '\u10A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u10B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u10C0' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u10D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u10E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u10F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 5, 5, 5 };
static sbyte[] mLo17 = new sbyte[256] {
-/* '\u1100' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1110' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1120' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1130' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1140' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1150' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 45,
-/* '\u1160' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1170' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1180' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1190' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11A0' */ 45, 45, 45, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u11F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5 };
+/* '\u1100' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1110' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1120' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1130' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1140' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1150' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 43,
+/* '\u1160' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1170' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1180' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1190' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11A0' */ 43, 43, 43, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u11F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo18 = new sbyte[256] {
-/* '\u1200' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1210' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1220' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1230' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1240' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 5, 5,
-/* '\u1250' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 5, 45, 45, 45, 45, 5, 5,
-/* '\u1260' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1270' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1280' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 5, 5,
-/* '\u1290' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u12A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u12B0' */ 45, 5, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u12C0' */ 45, 5, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u12D0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u12E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u12F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u1200' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1210' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1220' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1230' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1240' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 5, 5,
+/* '\u1250' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 5, 43, 43, 43, 43, 5, 5,
+/* '\u1260' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1270' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1280' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 5, 5,
+/* '\u1290' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u12A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u12B0' */ 43, 5, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u12C0' */ 43, 5, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u12D0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u12E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u12F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo19 = new sbyte[256] {
-/* '\u1300' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1310' */ 45, 5, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1320' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1330' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1340' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1350' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
+/* '\u1300' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1310' */ 43, 5, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1320' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1330' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1340' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1350' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
/* '\u1360' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1370' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1380' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+/* '\u1380' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
/* '\u1390' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u13A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u13B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u13C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u13D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u13E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u13F0' */ 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
+/* '\u13A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u13B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u13C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u13D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u13E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u13F0' */ 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo20 = new sbyte[256] {
-/* '\u1400' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1410' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1420' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1430' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1440' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1450' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1460' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1470' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1480' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1490' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u14F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u1400' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1410' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1420' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1430' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1440' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1450' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1460' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1470' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1480' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1490' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u14F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo22 = new sbyte[256] {
-/* '\u1600' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1610' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1620' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1630' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1640' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1650' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1660' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 45,
-/* '\u1670' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1680' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1690' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\u16A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u16B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u16C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u16D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u16E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
+/* '\u1600' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1610' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1620' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1630' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1640' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1650' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1660' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 43,
+/* '\u1670' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1680' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1690' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\u16A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u16B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u16C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u16D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u16E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
/* '\u16F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo23 = new sbyte[256] {
-/* '\u1700' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\u1710' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1720' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1730' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1740' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1750' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1760' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\u1770' */ 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1780' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1790' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u17A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u17B0' */ 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1700' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\u1710' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1720' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1730' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1740' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1750' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1760' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\u1770' */ 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1780' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1790' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u17A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u17B0' */ 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u17C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u17D0' */ 5, 5, 5, 5, 5, 5, 5, 45, 5, 5, 5, 5, 45, 5, 5, 5,
+/* '\u17D0' */ 5, 5, 5, 5, 5, 5, 5, 43, 5, 5, 5, 5, 43, 5, 5, 5,
/* '\u17E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u17F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo24 = new sbyte[256] {
/* '\u1800' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1810' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1820' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1830' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1840' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1850' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1860' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1870' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1880' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1890' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u18A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1820' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1830' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1840' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1850' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1860' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1870' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1880' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1890' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u18A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5,
/* '\u18B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u18C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u18D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u18E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u18F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo25 = new sbyte[256] {
-/* '\u1900' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1910' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
+/* '\u1900' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1910' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
/* '\u1920' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1930' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1940' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1950' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1960' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\u1970' */ 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1980' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1990' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u19A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\u1950' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1960' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\u1970' */ 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1980' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1990' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u19A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\u19B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u19C0' */ 5, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u19C0' */ 5, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u19D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u19E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u19F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo26 = new sbyte[256] {
-/* '\u1A00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1A10' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1A00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1A10' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1A20' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1A30' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1A40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -629,11 +629,11 @@ public PT parsertools;
/* '\u1AE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1AF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo27 = new sbyte[256] {
-/* '\u1B00' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1B10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1B20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1B30' */ 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u1B40' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5,
+/* '\u1B00' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1B10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1B20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1B30' */ 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u1B40' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5,
/* '\u1B50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1B60' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1B70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -646,56 +646,56 @@ public PT parsertools;
/* '\u1BE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1BF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo29 = new sbyte[256] {
-/* '\u1D00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1D90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1DA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1DB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+/* '\u1D00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1D90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1DA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1DB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
/* '\u1DC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1DD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1DE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u1DF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo30 = new sbyte[256] {
-/* '\u1E00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1E90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5,
-/* '\u1EA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1EB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1EC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1ED0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1EE0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1EF0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5 };
+/* '\u1E00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1E90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5,
+/* '\u1EA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1EB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1EC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1ED0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1EE0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1EF0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo31 = new sbyte[256] {
-/* '\u1F00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1F10' */ 45, 45, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\u1F20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1F30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1F40' */ 45, 45, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\u1F50' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 5, 45, 5, 45, 5, 45,
-/* '\u1F60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1F70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\u1F80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1F90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1FA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u1FB0' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5, 45, 5,
-/* '\u1FC0' */ 5, 5, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
-/* '\u1FD0' */ 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5,
-/* '\u1FE0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
-/* '\u1FF0' */ 5, 5, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5 };
+/* '\u1F00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1F10' */ 43, 43, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\u1F20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1F30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1F40' */ 43, 43, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\u1F50' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 5, 43, 5, 43, 5, 43,
+/* '\u1F60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1F70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\u1F80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1F90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1FA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u1FB0' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5, 43, 5,
+/* '\u1FC0' */ 5, 5, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
+/* '\u1FD0' */ 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5,
+/* '\u1FE0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
+/* '\u1FF0' */ 5, 5, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5 };
static sbyte[] mLo32 = new sbyte[256] {
/* '\u2000' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2010' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -704,9 +704,9 @@ public PT parsertools;
/* '\u2040' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2050' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2060' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2070' */ 5, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45,
+/* '\u2070' */ 5, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43,
/* '\u2080' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2090' */ 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2090' */ 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u20A0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u20B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u20C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -714,16 +714,16 @@ public PT parsertools;
/* '\u20E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u20F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo33 = new sbyte[256] {
-/* '\u2100' */ 5, 5, 45, 5, 5, 5, 5, 45, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\u2110' */ 45, 45, 45, 45, 5, 45, 5, 5, 5, 45, 45, 45, 45, 45, 5, 5,
-/* '\u2120' */ 5, 5, 5, 5, 45, 5, 45, 5, 45, 5, 45, 45, 45, 45, 5, 45,
-/* '\u2130' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45,
-/* '\u2140' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 5, 5, 5, 5, 45, 5,
+/* '\u2100' */ 5, 5, 43, 5, 5, 5, 5, 43, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\u2110' */ 43, 43, 43, 43, 5, 43, 5, 5, 5, 43, 43, 43, 43, 43, 5, 5,
+/* '\u2120' */ 5, 5, 5, 5, 43, 5, 43, 5, 43, 5, 43, 43, 43, 43, 5, 43,
+/* '\u2130' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43,
+/* '\u2140' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 5, 5, 5, 5, 43, 5,
/* '\u2150' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2160' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2170' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2180' */ 5, 5, 5, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2190' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2180' */ 5, 5, 5, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2190' */ 5, 5, 29, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u21A0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u21B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u21C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -731,117 +731,117 @@ public PT parsertools;
/* '\u21E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u21F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo44 = new sbyte[256] {
-/* '\u2C00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2C10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2C20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u2C30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2C40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2C50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u2C60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
-/* '\u2C70' */ 5, 5, 5, 5, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2C80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2C90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2CA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2CB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2CC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2CD0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2CE0' */ 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2C00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2C10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2C20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u2C30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2C40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2C50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u2C60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
+/* '\u2C70' */ 5, 5, 5, 5, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2C80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2C90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2CA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2CB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2CC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2CD0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2CE0' */ 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2CF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo45 = new sbyte[256] {
-/* '\u2D00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D20' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2D30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D60' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 45,
+/* '\u2D00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D20' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2D30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D60' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 43,
/* '\u2D70' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2D80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u2D90' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u2DA0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u2DB0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u2DC0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\u2DD0' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5,
+/* '\u2D80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u2D90' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u2DA0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u2DB0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u2DC0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\u2DD0' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5,
/* '\u2DE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u2DF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo48 = new sbyte[256] {
-/* '\u3000' */ 5, 5, 5, 5, 5, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u3000' */ 5, 5, 5, 5, 5, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u3010' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u3020' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u3030' */ 5, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 45, 45, 5, 5, 5,
-/* '\u3040' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3050' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3060' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3070' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3080' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3090' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 45, 45, 45,
-/* '\u30A0' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u30B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u30C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u30D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u30E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u30F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45 };
+/* '\u3030' */ 5, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 43, 43, 5, 5, 5,
+/* '\u3040' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3050' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3060' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3070' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3080' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3090' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 43, 43, 43,
+/* '\u30A0' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u30B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u30C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u30D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u30E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u30F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43 };
static sbyte[] mLo49 = new sbyte[256] {
-/* '\u3100' */ 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3110' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3120' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
-/* '\u3130' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3140' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3150' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3160' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3170' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u3180' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
+/* '\u3100' */ 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3110' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3120' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
+/* '\u3130' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3140' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3150' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3160' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3170' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u3180' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
/* '\u3190' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u31A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u31B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u31A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u31B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u31C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u31D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u31E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\u31F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\u31F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo77 = new sbyte[256] {
-/* '\u4D00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4D90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4DA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u4DB0' */ 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\u4D00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4D90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4DA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u4DB0' */ 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u4DC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u4DD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u4DE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u4DF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo159 = new sbyte[256] {
-/* '\u9F00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9F90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9FA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\u9FB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5,
+/* '\u9F00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9F90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9FA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\u9FB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5,
/* '\u9FC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u9FD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u9FE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\u9FF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo164 = new sbyte[256] {
-/* '\uA400' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA410' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA420' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA430' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA440' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA450' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA460' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA470' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA480' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5,
+/* '\uA400' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA410' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA420' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA430' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA440' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA450' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA460' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA470' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA480' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5,
/* '\uA490' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA4A0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA4B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -851,7 +851,7 @@ public PT parsertools;
/* '\uA4F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo167 = new sbyte[256] {
/* '\uA700' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uA710' */ 5, 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 5, 5, 5, 5, 5,
+/* '\uA710' */ 5, 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 5, 5, 5, 5, 5,
/* '\uA720' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA730' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA740' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -867,14 +867,14 @@ public PT parsertools;
/* '\uA7E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA7F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo168 = new sbyte[256] {
-/* '\uA800' */ 45, 45, 5, 45, 45, 45, 5, 45, 45, 45, 45, 5, 45, 45, 45, 45,
-/* '\uA810' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA820' */ 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uA800' */ 43, 43, 5, 43, 43, 43, 5, 43, 43, 43, 43, 5, 43, 43, 43, 43,
+/* '\uA810' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA820' */ 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA830' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uA840' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA850' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA860' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uA870' */ 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uA840' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA850' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA860' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uA870' */ 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA880' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA890' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA8A0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -884,73 +884,73 @@ public PT parsertools;
/* '\uA8E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uA8F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo215 = new sbyte[256] {
-/* '\uD700' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD710' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD720' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD730' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD740' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD750' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD760' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD770' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD780' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD790' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uD7A0' */ 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uD700' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD710' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD720' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD730' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD740' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD750' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD760' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD770' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD780' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD790' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uD7A0' */ 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uD7B0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uD7C0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uD7D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uD7E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uD7F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo250 = new sbyte[256] {
-/* '\uFA00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\uFA30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA40' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\uFA70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFA90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFAA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFAB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFAC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFAD0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\uFA00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\uFA30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA40' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\uFA70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFA90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFAA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFAB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFAC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFAD0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\uFAE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFAF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mLo251 = new sbyte[256] {
-/* '\uFB00' */ 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFB10' */ 5, 5, 5, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 45, 5, 45,
-/* '\uFB20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\uFB30' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 5, 45, 5,
-/* '\uFB40' */ 45, 45, 5, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFB50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFB60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFB70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFB80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFB90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFBA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFBB0' */ 45, 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uFB00' */ 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uFB10' */ 5, 5, 5, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 43, 5, 43,
+/* '\uFB20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\uFB30' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 5, 43, 5,
+/* '\uFB40' */ 43, 43, 5, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFB50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFB60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFB70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFB80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFB90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFBA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFBB0' */ 43, 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFBC0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFBD0' */ 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFBE0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFBF0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\uFBD0' */ 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFBE0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFBF0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mLo253 = new sbyte[256] {
-/* '\uFD00' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD10' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
+/* '\uFD00' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD10' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
/* '\uFD40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFD50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD60' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFD90' */ 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFDA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFDB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFDC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\uFD50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD60' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFD90' */ 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFDA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFDB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFDC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFDD0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFDE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFDF0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5 };
+/* '\uFDF0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5 };
static sbyte[] mLo254 = new sbyte[256] {
/* '\uFE00' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFE10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -959,30 +959,30 @@ public PT parsertools;
/* '\uFE40' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFE50' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFE60' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFE70' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFE80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFE90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFEA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFEB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFEC0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFED0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFEE0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFEF0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5 };
+/* '\uFE70' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFE80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFE90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFEA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFEB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFEC0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFED0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFEE0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFEF0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5 };
static sbyte[] mLo255 = new sbyte[256] {
/* '\uFF00' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFF10' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\uFF20' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFF30' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\uFF40' */ 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFF50' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5,
-/* '\uFF60' */ 5, 5, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFF70' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFF80' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFF90' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFFA0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\uFFB0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\uFFC0' */ 5, 5, 45, 45, 45, 45, 45, 45, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\uFFD0' */ 5, 5, 45, 45, 45, 45, 45, 45, 5, 5, 45, 45, 45, 5, 5, 5,
+/* '\uFF20' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFF30' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\uFF40' */ 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFF50' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5,
+/* '\uFF60' */ 5, 5, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFF70' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFF80' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFF90' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFFA0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\uFFB0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\uFFC0' */ 5, 5, 43, 43, 43, 43, 43, 43, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\uFFD0' */ 5, 5, 43, 43, 43, 43, 43, 43, 5, 5, 43, 43, 43, 5, 5, 5,
/* '\uFFE0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\uFFF0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
@@ -1008,99 +1008,99 @@ public PT parsertools;
#region CompressedCharacterMap
//
- // There are 50 equivalence classes
+ // There are 48 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' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45,
-/* '\U00010010' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010020' */ 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010030' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 5, 45,
-/* '\U00010040' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\U00010050' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
+/* '\U00010000' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43,
+/* '\U00010010' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010020' */ 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010030' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 5, 43,
+/* '\U00010040' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\U00010050' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
/* '\U00010060' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\U00010070' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\U00010080' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010090' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100C0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000100F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45 };
+/* '\U00010080' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010090' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100C0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000100F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43 };
static sbyte[] mapC2 = new sbyte[256] {
-/* '\U00010300' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010310' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
+/* '\U00010300' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010310' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
/* '\U00010320' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\U00010330' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010340' */ 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5, 5, 5, 5, 5,
+/* '\U00010330' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010340' */ 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5, 5, 5, 5, 5,
/* '\U00010350' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\U00010360' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\U00010370' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\U00010380' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010390' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 5,
-/* '\U000103A0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000103B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U000103C0' */ 45, 45, 45, 45, 5, 5, 5, 5, 45, 45, 45, 45, 45, 45, 45, 45,
+/* '\U00010380' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010390' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 5,
+/* '\U000103A0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000103B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U000103C0' */ 43, 43, 43, 43, 5, 5, 5, 5, 43, 43, 43, 43, 43, 43, 43, 43,
/* '\U000103D0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\U000103E0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
/* '\U000103F0' */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
static sbyte[] mapC5 = new sbyte[64] {
-/* '\U00010800' */ 45, 45, 45, 45, 45, 45, 5, 5, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\U00010810' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010820' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010830' */ 45, 45, 45, 45, 45, 45, 5, 45, 45, 5, 5, 5, 45, 5, 5, 45 };
+/* '\U00010800' */ 43, 43, 43, 43, 43, 43, 5, 5, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\U00010810' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010820' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010830' */ 43, 43, 43, 43, 43, 43, 5, 43, 43, 5, 5, 5, 43, 5, 5, 43 };
static sbyte[] mapC9 = new sbyte[52] {
-/* '\U00010A00' */ 45, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-/* '\U00010A10' */ 45, 45, 45, 45, 5, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010A20' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U00010A30' */ 45, 45, 45, 45 };
+/* '\U00010A00' */ 43, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+/* '\U00010A10' */ 43, 43, 43, 43, 5, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010A20' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U00010A30' */ 43, 43, 43, 43 };
static sbyte[] mapC13 = new sbyte[338] {
-/* '\U0001D400' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D410' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D420' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D430' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D440' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D450' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D460' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D470' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D480' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D490' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\U0001D4A0' */ 5, 5, 45, 5, 5, 45, 45, 5, 5, 45, 45, 45, 45, 5, 45, 45,
-/* '\U0001D4B0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 5, 45, 45, 45,
-/* '\U0001D4C0' */ 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D4D0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D4E0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D4F0' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D500' */ 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 5, 5, 45, 45, 45,
-/* '\U0001D510' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\U0001D520' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D530' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 5,
-/* '\U0001D540' */ 45, 45, 45, 45, 45, 5, 45, 5, 5, 5, 45, 45, 45, 45, 45, 45,
-/* '\U0001D550' */ 45, 5 };
+/* '\U0001D400' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D410' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D420' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D430' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D440' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D450' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D460' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D470' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D480' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D490' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\U0001D4A0' */ 5, 5, 43, 5, 5, 43, 43, 5, 5, 43, 43, 43, 43, 5, 43, 43,
+/* '\U0001D4B0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 5, 43, 43, 43,
+/* '\U0001D4C0' */ 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D4D0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D4E0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D4F0' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D500' */ 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 5, 5, 43, 43, 43,
+/* '\U0001D510' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\U0001D520' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D530' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 5,
+/* '\U0001D540' */ 43, 43, 43, 43, 43, 5, 43, 5, 5, 5, 43, 43, 43, 43, 43, 43,
+/* '\U0001D550' */ 43, 5 };
static sbyte[] mapC15 = new sbyte[294] {
-/* '\U0001D6A6' */ 5, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D6B6' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45,
-/* '\U0001D6C6' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D6D6' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D6E6' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D6F6' */ 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D706' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\U0001D716' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D726' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5,
-/* '\U0001D736' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D746' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\U0001D756' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D766' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45, 45, 45, 45, 45,
-/* '\U0001D776' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D786' */ 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D796' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D7A6' */ 45, 45, 45, 5, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-/* '\U0001D7B6' */ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 5, 45, 45,
-/* '\U0001D7C6' */ 45, 45, 45, 45, 45, 45 };
+/* '\U0001D6A6' */ 5, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D6B6' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43,
+/* '\U0001D6C6' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D6D6' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D6E6' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D6F6' */ 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D706' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\U0001D716' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D726' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5,
+/* '\U0001D736' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D746' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\U0001D756' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D766' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43, 43, 43, 43, 43,
+/* '\U0001D776' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D786' */ 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D796' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D7A6' */ 43, 43, 43, 5, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+/* '\U0001D7B6' */ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 5, 43, 43,
+/* '\U0001D7C6' */ 43, 43, 43, 43, 43, 43 };
static sbyte MapC(int code)
{ // '\U00010000' <= code <= '\U0010FFFF'
@@ -1116,7 +1116,7 @@ public PT parsertools;
return mapC2[code - 66304];
else // '\U00010400' <= code <= '\U000107FF'
if (code < 66718) // '\U00010400' <= code <= '\U0001049D'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U0001049E' <= code <= '\U000107FF'
return (sbyte)5;
else // '\U00010800' <= code <= '\U00010A33'
@@ -1127,7 +1127,7 @@ public PT parsertools;
return (sbyte)5;
else // '\U00010900' <= code <= '\U00010A33'
if (code < 67862) // '\U00010900' <= code <= '\U00010915'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U00010916' <= code <= '\U00010A33'
if (code < 68096) // '\U00010916' <= code <= '\U000109FF'
return (sbyte)5;
@@ -1139,7 +1139,7 @@ public PT parsertools;
if (code < 73728) // '\U00010A34' <= code <= '\U00011FFF'
return (sbyte)5;
else // '\U00012000' <= code <= '\U0001236E'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U0001236F' <= code <= '\U0001D6A5'
if (code < 119808) // '\U0001236F' <= code <= '\U0001D3FF'
return (sbyte)5;
@@ -1147,7 +1147,7 @@ public PT parsertools;
if (code < 120146) // '\U0001D400' <= code <= '\U0001D551'
return mapC13[code - 119808];
else // '\U0001D552' <= code <= '\U0001D6A5'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U0001D6A6' <= code <= '\U0010FFFF'
if (code < 173783) // '\U0001D6A6' <= code <= '\U0002A6D6'
if (code < 120780) // '\U0001D6A6' <= code <= '\U0001D7CB'
@@ -1156,13 +1156,13 @@ public PT parsertools;
if (code < 131072) // '\U0001D7CC' <= code <= '\U0001FFFF'
return (sbyte)5;
else // '\U00020000' <= code <= '\U0002A6D6'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U0002A6D7' <= code <= '\U0010FFFF'
if (code < 194560) // '\U0002A6D7' <= code <= '\U0002F7FF'
return (sbyte)5;
else // '\U0002F800' <= code <= '\U0010FFFF'
if (code < 195102) // '\U0002F800' <= code <= '\U0002FA1D'
- return (sbyte)45;
+ return (sbyte)43;
else // '\U0002FA1E' <= code <= '\U0010FFFF'
return (sbyte)5;
}
@@ -1177,57 +1177,56 @@ public PT parsertools;
return MapC(code);
}
- static Table[] NxS = new Table[113] {
+ static Table[] NxS = new Table[111] {
/* NxS[ 0] */ new Table(0, 0, 0, null),
-/* NxS[ 1] */ new Table(1, 23, -1, new sbyte[] {59, -1, -1, -1, -1, -1,
+/* NxS[ 1] */ new Table(1, 23, -1, new sbyte[] {58, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 60}),
+ 59}),
/* NxS[ 2] */ new Table(0, 0, -1, null),
-/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {107}),
-/* NxS[ 4] */ new Table(30, 20, -1, new sbyte[] {56, 56, 56, -1, -1, -1,
- -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, 56, 56, 56, 106}),
-/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {55}),
-/* NxS[ 6] */ new Table(8, 16, -1, new sbyte[] {53, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, 54}),
+/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {105}),
+/* NxS[ 4] */ new Table(30, 18, -1, new sbyte[] {55, -1, -1, -1, -1, -1,
+ -1, -1, -1, 55, -1, -1, -1, -1, 55, 55, 55, 104}),
+/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {54}),
+/* NxS[ 6] */ new Table(8, 16, -1, new sbyte[] {52, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 53}),
/* NxS[ 7] */ new Table(0, 0, -1, null),
/* NxS[ 8] */ new Table(0, 0, -1, null),
-/* NxS[ 9] */ new Table(44, 38, 49, new sbyte[] {-1, 49, 50, 49, 49, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, 50, 50}),
-/* NxS[ 10] */ new Table(21, 28, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, -1, 28, -1, 28, 28}),
+/* NxS[ 9] */ new Table(42, 36, 48, new sbyte[] {-1, 48, 49, 48, 48, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1}),
+/* NxS[ 10] */ new Table(21, 26, -1, new sbyte[] {27, -1, -1, -1, -1, -1,
+ -1, -1, -1, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -1,
+ 27, -1, 27, 27}),
/* NxS[ 11] */ new Table(0, 0, -1, null),
-/* NxS[ 12] */ new Table(23, 1, -1, new sbyte[] {48}),
-/* NxS[ 13] */ new Table(16, 1, -1, new sbyte[] {47}),
+/* NxS[ 12] */ new Table(23, 1, -1, new sbyte[] {47}),
+/* NxS[ 13] */ new Table(16, 1, -1, new sbyte[] {46}),
/* NxS[ 14] */ new Table(0, 0, -1, null),
/* NxS[ 15] */ new Table(0, 0, -1, null),
/* NxS[ 16] */ new Table(0, 0, -1, null),
-/* NxS[ 17] */ new Table(16, 5, -1, new sbyte[] {44, -1, 45, -1, 46}),
-/* NxS[ 18] */ new Table(21, 28, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
- -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, -1, 28, 28, 28, 28}),
+/* NxS[ 17] */ new Table(16, 5, -1, new sbyte[] {43, -1, 44, -1, 45}),
+/* NxS[ 18] */ new Table(21, 26, -1, new sbyte[] {27, -1, -1, -1, -1, -1,
+ -1, -1, -1, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -1,
+ 27, 27, 27, 27}),
/* NxS[ 19] */ new Table(0, 0, -1, null),
/* NxS[ 20] */ new Table(0, 0, -1, null),
-/* NxS[ 21] */ new Table(23, 1, -1, new sbyte[] {43}),
-/* NxS[ 22] */ new Table(23, 4, -1, new sbyte[] {41, -1, -1, 42}),
-/* NxS[ 23] */ new Table(23, 1, -1, new sbyte[] {40}),
-/* NxS[ 24] */ new Table(23, 5, -1, new sbyte[] {35, -1, -1, 36, 77}),
+/* NxS[ 21] */ new Table(23, 1, -1, new sbyte[] {42}),
+/* NxS[ 22] */ new Table(23, 4, -1, new sbyte[] {40, -1, -1, 41}),
+/* NxS[ 23] */ new Table(23, 1, -1, new sbyte[] {39}),
+/* NxS[ 24] */ new Table(23, 5, -1, new sbyte[] {34, -1, -1, 35, 75}),
/* NxS[ 25] */ new Table(0, 0, -1, null),
-/* NxS[ 26] */ new Table(30, 1, -1, new sbyte[] {76}),
-/* NxS[ 27] */ new Table(16, 33, -1, new sbyte[] {73, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 27, 27, 74, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, 74}),
-/* NxS[ 28] */ new Table(21, 28, -1, new sbyte[] {28, -1, -1, -1, -1, -1,
- -1, -1, -1, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, -1, 28, 28, 28, 28}),
-/* NxS[ 29] */ new Table(0, 0, -1, null),
-/* NxS[ 30] */ new Table(49, 2, 72, new sbyte[] {31, -1}),
-/* NxS[ 31] */ new Table(49, 1, -1, new sbyte[] {72}),
-/* NxS[ 32] */ new Table(30, 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(30, 19, -1, new sbyte[] {33, 33, 74, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 74}),
+/* NxS[ 26] */ new Table(0, 0, -1, null),
+/* NxS[ 27] */ new Table(21, 26, -1, new sbyte[] {27, -1, -1, -1, -1, -1,
+ -1, -1, -1, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -1,
+ 27, 27, 27, 27}),
+/* NxS[ 28] */ new Table(0, 0, -1, null),
+/* NxS[ 29] */ new Table(16, 31, -1, new sbyte[] {72, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 29, -1, 73}),
+/* NxS[ 30] */ new Table(47, 2, 71, new sbyte[] {31, -1}),
+/* NxS[ 31] */ new Table(47, 1, -1, new sbyte[] {71}),
+/* NxS[ 32] */ new Table(44, 1, -1, new sbyte[] {32}),
+/* NxS[ 33] */ new Table(30, 17, -1, new sbyte[] {73, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 73}),
/* NxS[ 34] */ new Table(0, 0, -1, null),
/* NxS[ 35] */ new Table(0, 0, -1, null),
/* NxS[ 36] */ new Table(0, 0, -1, null),
@@ -1242,89 +1241,83 @@ public PT parsertools;
/* NxS[ 45] */ new Table(0, 0, -1, null),
/* NxS[ 46] */ new Table(0, 0, -1, null),
/* NxS[ 47] */ new Table(0, 0, -1, null),
-/* NxS[ 48] */ new Table(0, 0, -1, null),
-/* NxS[ 49] */ new Table(21, 28, -1, new sbyte[] {49, -1, -1, -1, -1, -1,
- -1, -1, -1, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
- 49, -1, 49, 49, 49, 49}),
-/* NxS[ 50] */ new Table(30, 17, -1, new sbyte[] {50, 50, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50}),
+/* NxS[ 48] */ new Table(21, 26, -1, new sbyte[] {48, -1, -1, -1, -1, -1,
+ -1, -1, -1, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -1,
+ 48, 48, 48, 48}),
+/* NxS[ 49] */ new Table(44, 1, -1, new sbyte[] {49}),
+/* NxS[ 50] */ new Table(0, 13, -1, new sbyte[] {50, -1, -1, -1, -1, -1,
+ 50, -1, -1, -1, -1, -1, 50}),
/* NxS[ 51] */ new Table(0, 13, -1, new sbyte[] {51, -1, -1, -1, -1, -1,
51, -1, -1, -1, -1, -1, 51}),
-/* NxS[ 52] */ new Table(0, 13, -1, new sbyte[] {52, -1, -1, -1, -1, -1,
- 52, -1, -1, -1, -1, -1, 52}),
+/* NxS[ 52] */ new Table(0, 0, -1, null),
/* NxS[ 53] */ new Table(0, 0, -1, null),
/* NxS[ 54] */ new Table(0, 0, -1, null),
-/* NxS[ 55] */ new Table(0, 0, -1, null),
-/* NxS[ 56] */ new Table(30, 19, -1, new sbyte[] {56, 56, 56, -1, -1, -1,
- -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, 56, 56, 56}),
-/* NxS[ 57] */ new Table(49, 1, -1, new sbyte[] {106}),
-/* NxS[ 58] */ new Table(0, 0, -1, null),
-/* NxS[ 59] */ new Table(0, 7, 59, new sbyte[] {-1, 59, 59, 59, 59, 59,
+/* NxS[ 55] */ new Table(30, 17, -1, new sbyte[] {55, -1, -1, -1, -1, -1,
+ -1, -1, -1, 55, -1, -1, -1, -1, 55, 55, 55}),
+/* NxS[ 56] */ new Table(47, 1, -1, new sbyte[] {104}),
+/* NxS[ 57] */ new Table(0, 0, -1, null),
+/* NxS[ 58] */ new Table(0, 7, 58, new sbyte[] {-1, 58, 58, 58, 58, 58,
-1}),
+/* NxS[ 59] */ new Table(0, 0, -1, null),
/* NxS[ 60] */ new Table(0, 0, -1, null),
/* NxS[ 61] */ new Table(0, 0, -1, null),
/* NxS[ 62] */ new Table(0, 0, -1, null),
-/* NxS[ 63] */ new Table(0, 0, -1, null),
-/* NxS[ 64] */ new Table(9, 1, -1, new sbyte[] {65}),
+/* NxS[ 63] */ new Table(9, 1, -1, new sbyte[] {64}),
+/* NxS[ 64] */ new Table(0, 0, -1, null),
/* NxS[ 65] */ new Table(0, 0, -1, null),
-/* NxS[ 66] */ new Table(0, 0, -1, null),
-/* NxS[ 67] */ new Table(1, 1, -1, new sbyte[] {70}),
-/* NxS[ 68] */ new Table(4, 1, -1, new sbyte[] {112}),
-/* NxS[ 69] */ new Table(0, 0, -1, null),
-/* NxS[ 70] */ new Table(0, 7, 70, new sbyte[] {-1, 70, 70, 70, 70, 70,
+/* NxS[ 66] */ new Table(1, 1, -1, new sbyte[] {69}),
+/* NxS[ 67] */ new Table(4, 1, -1, new sbyte[] {110}),
+/* NxS[ 68] */ new Table(0, 0, -1, null),
+/* NxS[ 69] */ new Table(0, 7, 69, new sbyte[] {-1, 69, 69, 69, 69, 69,
-1}),
-/* NxS[ 71] */ new Table(44, 38, 28, new sbyte[] {29, 28, 27, 28, 28, 30,
+/* NxS[ 70] */ new Table(42, 36, 27, new sbyte[] {28, 27, 29, 27, 27, 30,
-1, 1, 2, 3, 4, 2, -1, 5, 6, 7, 8, 9, -1, 10, 11, 12,
- 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27}),
-/* NxS[ 72] */ new Table(49, 2, 72, new sbyte[] {31, -1}),
-/* NxS[ 73] */ new Table(30, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33}),
-/* NxS[ 74] */ new Table(24, 23, -1, new sbyte[] {75, 75, -1, -1, -1, -1,
- 32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 32}),
-/* NxS[ 75] */ new Table(30, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}),
-/* NxS[ 76] */ new Table(31, 1, -1, new sbyte[] {34}),
-/* NxS[ 77] */ new Table(32, 9, -1, new sbyte[] {78, -1, -1, -1, 79, -1,
- -1, -1, 80}),
-/* NxS[ 78] */ new Table(33, 1, -1, new sbyte[] {94}),
-/* NxS[ 79] */ new Table(40, 1, -1, new sbyte[] {85}),
-/* NxS[ 80] */ new Table(43, 1, -1, new sbyte[] {81}),
-/* NxS[ 81] */ new Table(34, 1, -1, new sbyte[] {82}),
-/* NxS[ 82] */ new Table(32, 1, -1, new sbyte[] {83}),
-/* NxS[ 83] */ new Table(26, 1, -1, new sbyte[] {84}),
-/* NxS[ 84] */ new Table(26, 1, -1, new sbyte[] {37}),
-/* NxS[ 85] */ new Table(41, 1, -1, new sbyte[] {86}),
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}),
+/* NxS[ 71] */ new Table(47, 2, 71, new sbyte[] {31, -1}),
+/* NxS[ 72] */ new Table(44, 1, -1, new sbyte[] {33}),
+/* NxS[ 73] */ new Table(24, 21, -1, new sbyte[] {74, 74, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}),
+/* NxS[ 74] */ new Table(44, 1, -1, new sbyte[] {32}),
+/* NxS[ 75] */ new Table(30, 9, -1, new sbyte[] {76, -1, -1, -1, 77, -1,
+ -1, -1, 78}),
+/* NxS[ 76] */ new Table(31, 1, -1, new sbyte[] {92}),
+/* NxS[ 77] */ new Table(38, 1, -1, new sbyte[] {83}),
+/* NxS[ 78] */ new Table(41, 1, -1, new sbyte[] {79}),
+/* NxS[ 79] */ new Table(32, 1, -1, new sbyte[] {80}),
+/* NxS[ 80] */ new Table(30, 1, -1, new sbyte[] {81}),
+/* NxS[ 81] */ new Table(26, 1, -1, new sbyte[] {82}),
+/* NxS[ 82] */ new Table(26, 1, -1, new sbyte[] {36}),
+/* NxS[ 83] */ new Table(39, 1, -1, new sbyte[] {84}),
+/* NxS[ 84] */ new Table(38, 1, -1, new sbyte[] {85}),
+/* NxS[ 85] */ new Table(30, 1, -1, new sbyte[] {86}),
/* NxS[ 86] */ new Table(40, 1, -1, new sbyte[] {87}),
-/* NxS[ 87] */ new Table(32, 1, -1, new sbyte[] {88}),
-/* NxS[ 88] */ new Table(42, 1, -1, new sbyte[] {89}),
-/* NxS[ 89] */ new Table(32, 1, -1, new sbyte[] {90}),
-/* NxS[ 90] */ new Table(39, 1, -1, new sbyte[] {91}),
-/* NxS[ 91] */ new Table(40, 1, -1, new sbyte[] {92}),
-/* NxS[ 92] */ new Table(26, 1, -1, new sbyte[] {93}),
-/* NxS[ 93] */ new Table(26, 1, -1, new sbyte[] {38}),
-/* NxS[ 94] */ new Table(34, 1, -1, new sbyte[] {95}),
-/* NxS[ 95] */ new Table(35, 1, -1, new sbyte[] {96}),
-/* NxS[ 96] */ new Table(32, 1, -1, new sbyte[] {97}),
-/* NxS[ 97] */ new Table(36, 1, -1, new sbyte[] {98}),
+/* NxS[ 87] */ new Table(30, 1, -1, new sbyte[] {88}),
+/* NxS[ 88] */ new Table(37, 1, -1, new sbyte[] {89}),
+/* NxS[ 89] */ new Table(38, 1, -1, new sbyte[] {90}),
+/* NxS[ 90] */ new Table(26, 1, -1, new sbyte[] {91}),
+/* NxS[ 91] */ new Table(26, 1, -1, new sbyte[] {37}),
+/* NxS[ 92] */ new Table(32, 1, -1, new sbyte[] {93}),
+/* NxS[ 93] */ new Table(33, 1, -1, new sbyte[] {94}),
+/* NxS[ 94] */ new Table(30, 1, -1, new sbyte[] {95}),
+/* NxS[ 95] */ new Table(34, 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(36, 1, -1, new sbyte[] {99}),
/* NxS[ 99] */ new Table(37, 1, -1, new sbyte[] {100}),
-/* NxS[ 100] */ new Table(38, 1, -1, new sbyte[] {101}),
-/* NxS[ 101] */ new Table(39, 1, -1, new sbyte[] {102}),
-/* NxS[ 102] */ new Table(26, 1, -1, new sbyte[] {103}),
-/* NxS[ 103] */ new Table(26, 1, -1, new sbyte[] {39}),
-/* NxS[ 104] */ new Table(0, 13, -1, new sbyte[] {51, -1, -1, -1, -1, -1,
- 51, -1, -1, -1, -1, 105, 51}),
-/* NxS[ 105] */ new Table(0, 13, -1, new sbyte[] {52, -1, -1, -1, -1, -1,
- 52, -1, -1, -1, -1, -1, 52}),
-/* NxS[ 106] */ new Table(49, 2, 106, new sbyte[] {57, -1}),
-/* NxS[ 107] */ new Table(0, 7, 107, new sbyte[] {-1, 107, 58, 107, 107, 107,
+/* NxS[ 100] */ new Table(26, 1, -1, new sbyte[] {101}),
+/* NxS[ 101] */ new Table(26, 1, -1, new sbyte[] {38}),
+/* NxS[ 102] */ new Table(0, 13, -1, new sbyte[] {50, -1, -1, -1, -1, -1,
+ 50, -1, -1, -1, -1, 103, 50}),
+/* NxS[ 103] */ new Table(0, 13, -1, new sbyte[] {51, -1, -1, -1, -1, -1,
+ 51, -1, -1, -1, -1, -1, 51}),
+/* NxS[ 104] */ new Table(47, 2, 104, new sbyte[] {56, -1}),
+/* NxS[ 105] */ new Table(0, 7, 105, new sbyte[] {-1, 105, 57, 105, 105, 105,
-1}),
-/* NxS[ 108] */ new Table(2, 1, 61, new sbyte[] {62}),
-/* NxS[ 109] */ new Table(8, 1, 63, new sbyte[] {64}),
-/* NxS[ 110] */ new Table(0, 0, -1, null),
-/* NxS[ 111] */ new Table(1, 3, 66, new sbyte[] {67, 66, 68}),
-/* NxS[ 112] */ new Table(0, 7, 112, new sbyte[] {-1, 112, 69, 112, 112, 112,
+/* NxS[ 106] */ new Table(2, 1, 60, new sbyte[] {61}),
+/* NxS[ 107] */ new Table(8, 1, 62, new sbyte[] {63}),
+/* NxS[ 108] */ new Table(0, 0, -1, null),
+/* NxS[ 109] */ new Table(1, 3, 65, new sbyte[] {66, 65, 67}),
+/* NxS[ 110] */ new Table(0, 7, 110, new sbyte[] {-1, 110, 68, 110, 110, 110,
-1}),
};
@@ -1335,7 +1328,7 @@ int NextState() {
unchecked {
int rslt;
int idx = Map(code) - NxS[state].min;
- if (idx < 0) idx += 50;
+ if (idx < 0) idx += 48;
if ((uint)idx >= (uint)NxS[state].rng) rslt = NxS[state].dflt;
else rslt = NxS[state].nxt[idx];
return rslt;
@@ -1761,7 +1754,6 @@ yylval = new Union(); yylval.op = new op_type_node(Operators.Division); return (
case 2:
case 4:
case 9:
- case 26:
case 30:
parsertools.AddErrorFromResource("UNEXPECTED_SYMBOL{0}",CurrentLexLocation, yytext);
return -1;
@@ -1829,13 +1821,10 @@ yylval = new Union(); yylval.op = new op_type_node(Operators.Less); return (int)
case 25:
yylval = new Union(); yylval.op = new op_type_node(Operators.Deref); return (int)Tokens.tkDeref;
break;
- case 27:
-yylval = new Union();
- currentLexLocation = CurrentLexLocation;
- yylval.ex = parsertools.create_int_const(yytext,currentLexLocation);
- return (int)Tokens.tkInteger;
+ case 26:
+yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow;
break;
- case 28:
+ case 27:
string cur_yytext = yytext;
int res = Keywords.KeywordOrIDToken(cur_yytext);
currentLexLocation = CurrentLexLocation;
@@ -2037,9 +2026,15 @@ string cur_yytext = yytext;
}
return res;
break;
- case 29:
+ case 28:
return (int)Tokens.INVISIBLE;
break;
+ case 29:
+yylval = new Union();
+ currentLexLocation = CurrentLexLocation;
+ yylval.ex = parsertools.create_int_const(yytext,currentLexLocation);
+ return (int)Tokens.tkInteger;
+ break;
case 31:
yylval = new Union();
currentLexLocation = CurrentLexLocation;
@@ -2054,89 +2049,86 @@ yylval = new Union();
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;
break;
- case 36:
+ case 35:
yylval = new Union(); yylval.op = new op_type_node(Operators.NotEqual); return (int)Tokens.tkNotEqual;
break;
- case 37:
+ case 36:
return (int)Tokens.tkParseModeType;
break;
- case 38:
+ case 37:
return (int)Tokens.tkParseModeStatement;
break;
- case 39:
+ case 38:
return (int)Tokens.tkParseModeExpression;
break;
- case 40:
+ case 39:
yylval = new Union(); yylval.op = new op_type_node(Operators.GreaterEqual); return (int)Tokens.tkGreaterEqual;
break;
- case 41:
+ case 40:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentSubtraction); return (int)Tokens.tkMinusEqual;
break;
- case 42:
+ case 41:
yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow;
break;
- case 43:
+ case 42:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual;
break;
- case 44:
+ case 43:
return (int)Tokens.tkQuestionPoint;
break;
- case 45:
+ case 44:
return (int)Tokens.tkQuestionSquareOpen;
break;
- case 46:
+ case 45:
return (int)Tokens.tkDoubleQuestion;
break;
- case 47:
+ case 46:
return (int)Tokens.tkDotDot;
break;
- case 48:
+ case 47:
yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign;
break;
- case 49:
+ case 48:
yylval = new Union();
yylval.id = new ident(yytext,CurrentLexLocation);
return (int)Tokens.tkDirectiveName;
break;
- case 50:
+ case 49:
yylval = new Union();
currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_sharp_char_const(yytext,currentLexLocation);
return (int)Tokens.tkAsciiChar;
break;
- case 51:
+ case 50:
yylval = new Union(); yylval.ti = new token_info("##",CurrentLexLocation); return (int)Tokens.tkShortProgram;
break;
- case 52:
+ case 51:
yylval = new Union(); yylval.ti = new token_info("###",CurrentLexLocation); return (int)Tokens.tkShortSFProgram;
break;
- case 53:
+ case 52:
yylval = new Union(); yylval.op = new op_type_node(Operators.Power); return (int)Tokens.tkStarStar;
break;
- case 54:
+ case 53:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual;
break;
- case 55:
+ case 54:
BEGIN(COMMENT1);
break;
- case 56:
+ case 55:
yylval = new Union();
currentLexLocation = CurrentLexLocation;
yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation);
return (int)Tokens.tkHex;
break;
- case 57:
+ case 56:
yylval = new Union();
currentLexLocation = CurrentLexLocation;
yylval.stn = parsertools.create_format_string_const(yytext,currentLexLocation);
return (int)Tokens.tkFormatStringLiteral;
break;
- case 58:
+ case 57:
if (parsertools.build_tree_for_formatter)
break;
@@ -2192,36 +2184,36 @@ if (parsertools.build_tree_for_formatter)
Defines.Remove(directiveparam);
}
break;
- case 59:
+ case 58:
{
}
break;
- case 60:
+ case 59:
yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual;
break;
- case 61:
+ case 60:
{
}
break;
+ case 61:
+BEGIN(INITIAL);
+ break;
case 62:
-BEGIN(INITIAL);
- break;
case 63:
- case 64:
{
}
break;
+ case 64:
+BEGIN(INITIAL);
+ break;
case 65:
-BEGIN(INITIAL);
- break;
case 66:
case 67:
- case 68:
{
}
break;
- case 69:
+ case 68:
parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE!
if (directivename == "IFDEF")
@@ -2253,7 +2245,7 @@ parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam);
BEGIN(INITIAL);
}
break;
- case 70:
+ case 69:
{
}
diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex
index 0778f463b..16effda02 100644
--- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex
+++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex
@@ -218,7 +218,9 @@ UNICODEARROW \x890
"<>" { 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.Deref); return (int)Tokens.tkDeref; }
"->" { yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; }
-\x2192 { yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; }
+
+\u2192 { yylval = new Union(); yylval.ti = new token_info(yytext); return (int)Tokens.tkArrow; }
+
\<\\> { return (int)Tokens.tkParseModeExpression; }
\<\\> { return (int)Tokens.tkParseModeStatement; }
\<\\> { return (int)Tokens.tkParseModeType; }
diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y
index da221a9d4..9ac01f4f0 100644
--- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y
+++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y
@@ -3934,10 +3934,6 @@ factor
{
$$ = new pascal_set_constant($2 as expression_list, @$);
}
- | tkVertParen elem_list tkVertParen
- {
- $$ = new array_const_new($2 as expression_list, @$);
- }
| tkNot factor
{
$$ = new un_expr($2, $1.type, @$);
@@ -4110,6 +4106,10 @@ variable
}
$$ = new slice_expr_question($1 as addressed_value,fe.expr,fe.format1,fe.format2,@$);
}
+ | tkVertParen elem_list tkVertParen
+ {
+ $$ = new array_const_new($2 as expression_list, @$);
+ }
| variable tkRoundOpen optional_expr_list tkRoundClose
{
$$ = new method_call($1 as addressed_value,$3 as expression_list, @$);
diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs
index d99da2a5d..82564329c 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: 26.07.2020 13:45:32
-// UserName: Ivan
+// Machine: DESKTOP-G8V08V4
+// DateTime: 29.07.2020 11:15:12
+// UserName: ?????????
// Input file
// options: no-lines gplex
@@ -296,43 +296,43 @@ public partial class GPPGParser: ShiftReduceParser tkVertParen, elem_list, tkVertParen
-{
- CurrentSemanticValue.ex = new array_const_new(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan);
- }
- break;
- case 737: // factor -> tkNot, factor
+ case 736: // factor -> tkNot, factor
{
CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan);
}
break;
- case 738: // factor -> sign, factor
+ case 737: // factor -> sign, factor
{
if (ValueStack[ValueStack.Depth-2].op.type == Operators.Minus)
{
@@ -6345,96 +6340,96 @@ public partial class GPPGParser: ShiftReduceParser tkDeref, factor
+ case 738: // factor -> tkDeref, factor
{
CurrentSemanticValue.ex = new index(ValueStack[ValueStack.Depth-1].ex, true, CurrentLocationSpan);
}
break;
- case 740: // factor -> var_reference
+ case 739: // factor -> var_reference
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 741: // factor -> tuple
+ case 740: // factor -> tuple
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 742: // literal_or_number -> literal
+ case 741: // literal_or_number -> literal
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 743: // literal_or_number -> unsigned_number
+ case 742: // literal_or_number -> unsigned_number
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 744: // var_question_point -> variable, tkQuestionPoint, variable
+ case 743: // 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 745: // var_question_point -> variable, tkQuestionPoint, var_question_point
+ case 744: // 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 746: // var_reference -> var_address, variable
+ case 745: // 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 747: // var_reference -> variable
+ case 746: // var_reference -> variable
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 748: // var_reference -> var_question_point
+ case 747: // var_reference -> var_question_point
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 749: // var_address -> tkAddressOf
+ case 748: // var_address -> tkAddressOf
{
CurrentSemanticValue.stn = NewVarAddress(CurrentLocationSpan);
}
break;
- case 750: // var_address -> var_address, tkAddressOf
+ case 749: // var_address -> var_address, tkAddressOf
{
CurrentSemanticValue.stn = NewVarAddress(ValueStack[ValueStack.Depth-2].stn as get_address, CurrentLocationSpan);
}
break;
- case 751: // attribute_variable -> simple_type_identifier, optional_expr_list_with_bracket
+ case 750: // 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 752: // attribute_variable -> template_type, optional_expr_list_with_bracket
+ case 751: // 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 753: // dotted_identifier -> identifier
+ case 752: // dotted_identifier -> identifier
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; }
break;
- case 754: // dotted_identifier -> dotted_identifier, tkPoint, identifier_or_keyword
+ case 753: // 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 755: // variable_as_type -> dotted_identifier
+ case 754: // variable_as_type -> dotted_identifier
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex;}
break;
- case 756: // variable_as_type -> dotted_identifier, template_type_params
+ case 755: // 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 757: // variable_or_literal_or_number -> variable
+ case 756: // variable_or_literal_or_number -> variable
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 758: // variable_or_literal_or_number -> literal_or_number
+ case 757: // variable_or_literal_or_number -> literal_or_number
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 759: // variable -> identifier
+ case 758: // variable -> identifier
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; }
break;
- case 760: // variable -> operator_name_ident
+ case 759: // variable -> operator_name_ident
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 761: // variable -> tkInherited, identifier
+ case 760: // variable -> tkInherited, identifier
{
CurrentSemanticValue.ex = new inherited_ident(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan);
}
break;
- case 762: // variable -> tkRoundOpen, expr, tkRoundClose
+ case 761: // variable -> tkRoundOpen, expr, tkRoundClose
{
if (!parsertools.build_tree_for_formatter)
{
@@ -6444,18 +6439,18 @@ public partial class GPPGParser: ShiftReduceParser sizeof_expr
+ case 762: // variable -> sizeof_expr
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 764: // variable -> typeof_expr
+ case 763: // variable -> typeof_expr
{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; }
break;
- case 765: // variable -> literal_or_number, tkPoint, identifier_or_keyword
+ case 764: // 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 766: // variable -> variable_or_literal_or_number, tkSquareOpen, expr_list,
+ case 765: // variable -> variable_or_literal_or_number, tkSquareOpen, expr_list,
// tkSquareClose
{
var el = ValueStack[ValueStack.Depth-2].stn as expression_list; // SSM 10/03/16
@@ -6474,7 +6469,7 @@ public partial class GPPGParser: ShiftReduceParser variable, tkQuestionSquareOpen, format_expr, tkSquareClose
+ case 766: // 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)
@@ -6487,6 +6482,11 @@ public partial class GPPGParser: ShiftReduceParser tkVertParen, elem_list, tkVertParen
+{
+ CurrentSemanticValue.ex = new array_const_new(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan);
+ }
+ break;
case 768: // 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);
diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
index 24435c450..ee2f89ed5 100644
--- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc
+++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
@@ -275,5 +275,6 @@ script=
+
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index cdb9ce778..4cc0b3877 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2603
+3.6.3.2604
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 0fa7746b4..3f04c1a78 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2603'
+!define VERSION '3.6.3.2604'
diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs
index 655e81b51..9513c68fb 100644
--- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs
+++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs
@@ -4426,7 +4426,7 @@ namespace PascalABCCompiler.SyntaxTree
public void read_array_const_new(array_const_new _array_const_new)
{
- read_expression(_array_const_new);
+ read_addressed_value(_array_const_new);
_array_const_new.elements = _read_node() as expression_list;
}
diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
index 19a9bd3f0..a924a86d0 100644
--- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
+++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
@@ -6917,7 +6917,7 @@ namespace PascalABCCompiler.SyntaxTree
public void write_array_const_new(array_const_new _array_const_new)
{
- write_expression(_array_const_new);
+ write_addressed_value(_array_const_new);
if (_array_const_new.elements == null)
{
bw.Write((byte)0);
diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs
index 1c77cfb11..7605d2ed2 100644
--- a/SyntaxTree/tree/Tree.cs
+++ b/SyntaxTree/tree/Tree.cs
@@ -54037,7 +54037,7 @@ namespace PascalABCCompiler.SyntaxTree
///
///
[Serializable]
- public partial class array_const_new : expression
+ public partial class array_const_new : addressed_value
{
///
diff --git a/SyntaxTree/tree/tree.xml b/SyntaxTree/tree/tree.xml
index 9012bdd69..86ab98f1d 100644
--- a/SyntaxTree/tree/tree.xml
+++ b/SyntaxTree/tree/tree.xml
@@ -3270,7 +3270,7 @@
-
+
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index bfef6f463..b8ab8c372 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -1941,7 +1941,7 @@ function TryReadIntegerFromString(s: string; var from: integer; var res: integer
function TryReadRealFromString(s: string; var from: integer; var res: real): boolean;
///-procedure Val(s: string; var value: число; var err: integer);
-/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value.
+/// Преобразует строковое представление s целого или вещественного числа к числовому значению и записывает его в переменную value.
///Если преобразование успешно, то err=0, иначе err>0
procedure Val(s: string; var value: integer; var err: integer);
///--
@@ -2122,6 +2122,9 @@ procedure Reverse(var s: string);
procedure Reverse(var s: string; index, count: integer);
/// Перемешивает динамический массив случайным образом
procedure Shuffle(a: array of T);
+/// Возвращает, совпадают ли массивы
+function ArrEqual(a, b: array of T): boolean;
+
/// Сравнивает матрицы на равенство
function MatrEqual(a, b: array [,] of T): boolean;
/// Перемешивает список случайным образом
@@ -2254,8 +2257,6 @@ function ReadArrReal(prompt: string; n: integer): array of real;
/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры
function ReadArrString(prompt: string; n: integer): array of string;
-/// Возвращает, совпадают ли массивы
-function ArrEqual(a, b: array of T): boolean;
// -----------------------------------------------------
//>> Подпрограммы для создания двумерных динамических массивов # Subroutines for matrixes
diff --git a/TestSuite/CompilationSamples/SF.pas b/TestSuite/CompilationSamples/SF.pas
index f4f8a9f10..c414e4a0b 100644
--- a/TestSuite/CompilationSamples/SF.pas
+++ b/TestSuite/CompilationSamples/SF.pas
@@ -11,6 +11,7 @@ function RI64 := ReadInt64;
function RR := ReadReal;
function RC := ReadChar;
function RS := ReadString;
+function RL := ReadLexem;
function RlnI := ReadlnInteger;
function RlnBI := ReadlnBigInteger;
@@ -68,36 +69,126 @@ function Prln(Self: char): char; extensionmethod := Self.Println;
function Prln(Self: boolean): boolean; extensionmethod := Self.Println;
function Prln(Self: string): string; extensionmethod := Self.Println;
+/// Записывает в min значение x если xmax
procedure ReMax(var max: integer; x: integer);
begin
if x > max then
max := x
end;
+/// Записывает в min значение x если xmax
procedure ReMax(var max: real; x: real);
begin
if x > max then
max := x
end;
+/// Преобразует строку в целое
function ToI(Self: string); extensionmethod := Self.ToInteger;
+/// Преобразует строку в вещественное
function ToR(Self: string); extensionmethod := Self.ToReal;
+/// Преобразует строку в массив целых
+function ToIs(Self: string); extensionmethod := Self.ToIntegers;
+
+/// Преобразует строку в массив вещественных
+function ToRs(Self: string); extensionmethod := Self.ToReals;
+
function operator-(c,c1: char): integer; extensionmethod := Ord(c) - Ord(c1);
+/// Возвращает длину строки
function Len(Self: string): integer; extensionmethod := Self.Length;
+/// Возвращает длину массива
+function Len(Self: array of T): integer; extensionmethod := Self.Length;
+
+/// Возвращает среднее элементов последовательности
+function Av(Self: sequence of integer): real; extensionmethod := Self.Average;
+/// Возвращает среднее элементов последовательности
+function Av(Self: sequence of real): real; extensionmethod := Self.Average;
+
+function Dst(Self: sequence of T): sequence of T; extensionmethod := Self.Distinct;
+
+function Ord(Self: sequence of T): sequence of T; extensionmethod := Self.Order;
+function OrdD(Self: sequence of T): sequence of T; extensionmethod := Self.OrderDescending;
+
+/// Преобразует последовательность в строку
+function Str(Self: sequence of T): string; extensionmethod := Self.JoinToString;
+
+/// Выводит последовательность, разделяя элементы пробелами
+function Pr(Self: sequence of T): sequence of T; extensionmethod := Self.Print;
+/// Выводит последовательность, разделяя элементы пробелами, и переходит на новую строку
+function Prln(Self: sequence of T): sequence of T; extensionmethod := Self.Println;
+
+/// Возвращает инвертированную последовательность
+function Rev(Self: sequence of T): sequence of T; extensionmethod := Self.Reverse;
+
+/// Преобразует последовательность, используя функцию transform
+function Sel(Self: sequence of T; transform: T->T1): sequence of T1; extensionmethod := Self.Select(transform);
+
+/// Фильтрует последовательность по условию cond
+function Wh(Self: sequence of T; cond: T->boolean): sequence of T; extensionmethod := Self.Where(cond);
+
+/// Преобразует последовательность в массив
+function ToA(Self: sequence of T): array of T; extensionmethod := Self.ToArray;
+
+/// Преобразует последовательность в список
+function ToL(Self: sequence of T): List; extensionmethod := Self.ToList;
+
+/// Преобразует последовательность в HashSet
+function ToHS(Self: sequence of T): HashSet; extensionmethod := Self.ToHashSet;
+/// Преобразует последовательность в SortedSet
+function ToSS(Self: sequence of T): SortedSet; extensionmethod := Self.ToSortedSet;
+
+/// Преобразует последовательность в HashSet
+function HS(s: sequence of T): HashSet := s.ToHashSet;
+/// Преобразует последовательность в SortedSet
+function SS(s: sequence of T): SortedSet := s.ToSortedSet;
+
+/// Инвертирует последовательность
+procedure Rev(a: array of T) := Reverse(a);
+
+/// Возвращает индекс минимального элемента
+function IMin(Self: array of T): integer; extensionmethod; where T: IComparable;
+begin
+ Result := Self.IndexMin;
+end;
+
+/// Возвращает индекс максимального элемента
+function IMax(Self: array of T): integer; extensionmethod; where T: IComparable;
+begin
+ Result := Self.IndexMax;
+end;
+
+/// Возвращает True если массивы равны
+function Eq(Self,b: array of T): boolean; extensionmethod := Self.ArrEqual(b);
+
+/// Возвращает в виде массива все элементы, удовлетворяющие cond
+function Filt(Self: array of T; cond: T->boolean): array of T; extensionmethod := Self.FindAll(cond);
+
+/// Возвращает массив с элементами, преобразованными по правилу transform
+function Tr(Self: array of T; transform: T->T): array of T; extensionmethod := Self.ConvertAll(transform);
+
+/// Преобразует массив по правилу transform
+procedure Tr(a: array of T; transform: T->T) := a.Transform(transform);
+
+/// Возвращает индекс последнего элемента массива
+function H(Self: array of T): integer; extensionmethod := Self.High;
+
+
end.
\ No newline at end of file
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index 3baaf5af1..b8ab8c372 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -1941,7 +1941,7 @@ function TryReadIntegerFromString(s: string; var from: integer; var res: integer
function TryReadRealFromString(s: string; var from: integer; var res: real): boolean;
///-procedure Val(s: string; var value: число; var err: integer);
-/// Преобразует строковое представление s целого числа к числовому значению и записывает его в переменную value.
+/// Преобразует строковое представление s целого или вещественного числа к числовому значению и записывает его в переменную value.
///Если преобразование успешно, то err=0, иначе err>0
procedure Val(s: string; var value: integer; var err: integer);
///--
diff --git a/bin/Lib/SF.pas b/bin/Lib/SF.pas
index d683205f8..c414e4a0b 100644
--- a/bin/Lib/SF.pas
+++ b/bin/Lib/SF.pas
@@ -187,5 +187,8 @@ function Tr(Self: array of T; transform: T->T): array of T; extensionmethod :
/// Преобразует массив по правилу transform
procedure Tr(a: array of T; transform: T->T) := a.Transform(transform);
+/// Возвращает индекс последнего элемента массива
+function H(Self: array of T): integer; extensionmethod := Self.High;
+
end.
\ No newline at end of file
From a4804f31a3d647b69965da68f43c8392f6a76b1b Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Sat, 1 Aug 2020 00:13:27 +0300
Subject: [PATCH 06/18] =?UTF-8?q?Controls=20-=20=D0=BF=D1=80=D0=B8=D0=BC?=
=?UTF-8?q?=D0=B5=D1=80=D1=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CodeCompletion/DomSyntaxTreeVisitor.cs | 10 +-
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 +-
.../Graphics/Controls/cc10_ComboBox.pas | 27 ++++
.../Graphics/Controls/cc11_ComboBox2.pas | 22 +++
.../Graphics/Controls/cc12_Wrapping.pas | 18 +++
.../Controls/cc13_Заголовки.pas | 38 +++++
.../Graphics/Controls/cc14_Canvas.pas | 17 +++
.../Graphics/Controls/cc15_ListView.pas | 23 +++
.../Graphics/Controls/cc16_Countries.pas | 19 +++
.../Graphics/Controls/cc17_CalcIdea.pas | 14 ++
.../Graphics/Controls/cc18_SimpleCalc.pas | 30 ++++
.../Graphics/Controls/cc19_StatusBar.pas | 17 +++
.../Graphics/Controls/cc1_All.pas | 34 +++++
.../Graphics/Controls/cc20_Menu.pas | 17 +++
.../Graphics/Controls/cc20_Menu2.pas | 10 ++
.../Graphics/Controls/cc21_FileDialogs.pas | 39 +++++
.../Graphics/Controls/cc22_MsgBox.pas | 19 +++
.../Controls/cc23_Random3DSpheres.pas | 13 ++
.../Graphics/Controls/cc24_RGB.pas | 32 ++++
.../Graphics/Controls/cc2_All2.pas | 59 ++++++++
.../Graphics/Controls/cc3_All3.pas | 34 +++++
.../Graphics/Controls/cc4_ButtonClick.pas | 19 +++
.../Graphics/Controls/cc5_CheckBoxes.pas | 20 +++
.../Graphics/Controls/cc6_CheckBoxes2.pas | 33 ++++
.../Graphics/Controls/cc7_RadioButtons.pas | 26 ++++
.../Graphics/Controls/cc8_MoveObject.pas | 28 ++++
.../Graphics/Controls/cc8a_MoveObject.pas | 27 ++++
.../Graphics/Controls/cc9_ListBox.pas | 28 ++++
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
TestSuite/CompilationSamples/GraphWPF.pas | 26 ++--
TestSuite/CompilationSamples/GraphWPFBase.pas | 19 ++-
TestSuite/CompilationSamples/PABCSystem.pas | 4 +-
bin/Lib/Controls.pas | 141 ++++++++++++++----
bin/Lib/GraphWPF.pas | 26 ++--
bin/Lib/GraphWPFBase.pas | 19 ++-
bin/Lib/PABCSystem.pas | 4 +-
bin/template.pct | 3 +
39 files changed, 849 insertions(+), 76 deletions(-)
create mode 100644 InstallerSamples/Graphics/Controls/cc10_ComboBox.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc11_ComboBox2.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc12_Wrapping.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc14_Canvas.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc15_ListView.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc16_Countries.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc17_CalcIdea.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc19_StatusBar.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc1_All.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc20_Menu.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc20_Menu2.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc21_FileDialogs.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc22_MsgBox.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc23_Random3DSpheres.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc24_RGB.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc2_All2.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc3_All3.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc4_ButtonClick.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc5_CheckBoxes.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc6_CheckBoxes2.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc7_RadioButtons.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc8_MoveObject.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc8a_MoveObject.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc9_ListBox.pas
diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs
index 341973cb8..7573f744d 100644
--- a/CodeCompletion/DomSyntaxTreeVisitor.cs
+++ b/CodeCompletion/DomSyntaxTreeVisitor.cs
@@ -2736,9 +2736,13 @@ namespace CodeCompletion
}
if (cur_scope != null && _program_module.program_block.program_code != null)
{
- cur_scope.body_loc = new location(_program_module.program_block.program_code.left_logical_bracket.source_context.end_position.line_num,
- _program_module.program_block.program_code.left_logical_bracket.source_context.end_position.column_num,
- _program_module.program_block.program_code.source_context.end_position.line_num, _program_module.program_block.program_code.source_context.end_position.column_num,
+ var left_line_num = _program_module.program_block.program_code.left_logical_bracket.source_context.end_position.line_num;
+ var left_column_num = _program_module.program_block.program_code.left_logical_bracket.source_context.end_position.column_num;
+ var right_line_num = _program_module.program_block.program_code.source_context.end_position.line_num;
+ var right_column_num = _program_module.program_block.program_code.source_context.end_position.column_num;
+ cur_scope.body_loc = new location(left_line_num,
+ left_column_num,
+ right_line_num, right_column_num,
doc);
_program_module.program_block.program_code.visit(this);
}
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 9dc1e9936..035a1024b 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2604";
+ public const string Revision = "2607";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 4cfaf70d5..67621ca1f 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%COREVERSION%=3
-%REVISION%=2604
%MINOR%=6
+%REVISION%=2607
+%COREVERSION%=3
%MAJOR%=3
diff --git a/InstallerSamples/Graphics/Controls/cc10_ComboBox.pas b/InstallerSamples/Graphics/Controls/cc10_ComboBox.pas
new file mode 100644
index 000000000..9b8da1a62
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc10_ComboBox.pas
@@ -0,0 +1,27 @@
+// Модуль Controls - элемент управления "Список" и использование словаря
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Столицы стран';
+ LeftPanel(150,Colors.Orange);
+ var l := ComboBox('Список стран');
+ l.Tooltip := 'Выбери страну - отобразится столица';
+ l.Add('Россия');
+ l.Add('США');
+ l.Add('Китай');
+ l.Add('Германия');
+ l.Add('Франция');
+
+ var d := Dict(('Россия','Москва'),
+ ('США','Вашингтон'),
+ ('Китай','Пекин'),
+ ('Германия','Берлин'),
+ ('Франция','Париж')
+ );
+
+ Font.Size := 70;
+ l.SelectionChanged := procedure -> begin
+ Window.Clear;
+ DrawText(GraphWindow.ClientRect,d[l.SelectedText]);
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc11_ComboBox2.pas b/InstallerSamples/Graphics/Controls/cc11_ComboBox2.pas
new file mode 100644
index 000000000..ba766b416
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc11_ComboBox2.pas
@@ -0,0 +1,22 @@
+// Модуль Controls - элемент управления "ComboBox" и графики функций
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - элемент управления "ComboBox" и графики функций';
+ LeftPanel(150, Colors.Orange);
+ var cb := ComboBox('Графики функций');
+ cb.AddRange('x*sin(x)','exp(x)','x*x','sin(x)-cos(2.5*x)');
+
+ var Redraw: procedure := () -> begin
+ case cb.SelectedIndex of
+ 0: DrawGraph(x->x*sin(x));
+ 1: DrawGraph(x->exp(x));
+ 2: DrawGraph(x->x*x);
+ 3: DrawGraph(x->sin(x)-cos(2.5*x));
+ end;
+ end;
+
+ cb.SelectionChanged := Redraw;
+ OnResize := Redraw;
+ Redraw;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc12_Wrapping.pas b/InstallerSamples/Graphics/Controls/cc12_Wrapping.pas
new file mode 100644
index 000000000..713feb38e
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc12_Wrapping.pas
@@ -0,0 +1,18 @@
+// Модуль Controls - режим Wrapping для TextBlock
+uses GraphWPF,Controls;
+
+function R := Random(-7,7);
+
+begin
+ Window.Title := 'Модуль Controls - режим Wrapping для TextBlock';
+ LeftPanel(150,Colors.Orange);
+ var b := Button('No Wrap');
+ b.Tooltip := 'Нажмите для изменения режима переноса слов';
+
+ var tb1 := TextBlock('Этот текст не помещается на одной строке и в режиме Wrapping автоматически переносится');
+ b.Click := procedure → begin
+ tb1.Wrapping := not tb1.Wrapping;
+ b.Text := if tb1.Wrapping then 'Wrap' else 'No Wrap';
+ end;
+ var tb := TextBlock('Этот текст усекается,'#10'но можно явно'#10'разделять на строки');
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas b/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
new file mode 100644
index 000000000..d7b704399
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
@@ -0,0 +1,38 @@
+// Модуль Controls - элементы управления с заголовками
+uses Controls, GraphWPF;
+
+begin
+ Window.Title := 'Модуль Controls - все элементы управления с заголовками';
+ LeftPanel(170, Colors.Orange);
+
+ var b := Button('Заголовки включены');
+
+ var tb := new TextBoxWPF('TextBox');
+ tb.Height := 40;
+ tb.Text := 'Несколько строк текста';
+ tb.Wrapping := True;
+
+ var ib := new IntegerBoxWPF('IntegerBox', 0, 10);
+ var lb := new ListBoxWPF('ListBox',100);
+ lb.AddRange('1 2 3 4 5'.ToWords);
+ var cb := new ComboBoxWPF('ComboBox');
+ cb.AddRange('1 2 3 4 5'.ToWords);
+
+ b.Click := procedure -> begin
+ if b.Text = 'Заголовки включены' then
+ b.Text := 'Заголовки выключены'
+ else b.Text := 'Заголовки включены';
+ if tb.Title = '' then
+ tb.Title := 'Заголовок'
+ else tb.Title := '';
+ if ib.Title = '' then
+ ib.Title := 'Заголовок'
+ else ib.Title := '';
+ if lb.Title = '' then
+ lb.Title := 'Заголовок'
+ else lb.Title := '';
+ if cb.Title = '' then
+ cb.Title := 'Заголовок'
+ else cb.Title := '';
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc14_Canvas.pas b/InstallerSamples/Graphics/Controls/cc14_Canvas.pas
new file mode 100644
index 000000000..844ac4dfb
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc14_Canvas.pas
@@ -0,0 +1,17 @@
+// Модуль Controls - замена графической панели на элемент управления "Канва"
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Модуль Controls - замена графической панели на элемент управления "Канва"';
+ var left := LeftPanel(150,Colors.Orange);
+ var can := SetMainControl.AsCanvas;
+ can.Color := Colors.AntiqueWhite;
+
+ Button(100,100,'На Канве можно располагать элементы');
+ Button(50,300,'в любом месте,');
+ TextBlock(150,500,'указывая их координаты');
+
+ // Смена активной панели
+ SetActivePanel(left);
+ Button('Закрыть').Click := procedure → Window.Close;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc15_ListView.pas b/InstallerSamples/Graphics/Controls/cc15_ListView.pas
new file mode 100644
index 000000000..25bcfe8a8
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc15_ListView.pas
@@ -0,0 +1,23 @@
+// Модуль Controls - замена графического окна элементом "ListView"
+uses Controls,GraphWPF;
+
+type My = auto class
+ i,j: integer;
+public
+ property Поле1: integer read i;
+ property Поле2: integer read j;
+end;
+
+begin
+ Window.Title := 'Модуль Controls - замена графического окна элементом "ListView"';
+ LeftPanel(150,Colors.Orange);
+
+ var l := SetMainControl.AsListView;
+
+ // Заполнение объектами класса, у которых есть публичные свойства
+ l.Fill(Arr(new My(2,5),new My(4,6)));
+
+ Button('Очистить список').Click := procedure -> l.Clear;
+ Button('Заполнить данными').Click := procedure -> l.Fill(|('Иванов',20),('Петров',19)|);
+ Button('Заполнить заголовки').Click := procedure -> l.SetHeaders('Фамилия','Возраст');
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc16_Countries.pas b/InstallerSamples/Graphics/Controls/cc16_Countries.pas
new file mode 100644
index 000000000..02008d8e8
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc16_Countries.pas
@@ -0,0 +1,19 @@
+// Модуль Controls - визуализация запросов к базе данных
+uses GraphWPF,Controls,ABCDatabases;
+
+begin
+ Window.Title := 'Модуль Controls - визуализация запросов к базе данных';
+ LeftPanel(150,Colors.Orange);
+ var l := SetMainControl.AsListView;
+
+ var страны := ЗаполнитьМассивСтран;
+ l.Fill(страны);
+
+ Button('Все').Click := procedure -> l.Fill(страны);
+
+ Button('Азия').Click := procedure ->
+ l.Fill(страны.Where(страна -> страна.Континент='Азия'));
+
+ Button('Сорт по населению').Click := procedure ->
+ l.Fill(страны.OrderByDescending(s -> s.Население));
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc17_CalcIdea.pas b/InstallerSamples/Graphics/Controls/cc17_CalcIdea.pas
new file mode 100644
index 000000000..ac030bdc3
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc17_CalcIdea.pas
@@ -0,0 +1,14 @@
+// Модуль Controls - Калькулятор Light
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Калькулятор Light';
+ LeftPanel(150, Colors.Orange);
+ var tb := SetMainControl.AsTextBox;
+ tb.FontSize := 30;
+ var x := IntegerBox('X:',1,9);
+ var y := IntegerBox('Y:',1,9);
+ Button('Sum').Click := procedure -> begin
+ tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}');
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas b/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
new file mode 100644
index 000000000..e92f47dd6
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
@@ -0,0 +1,30 @@
+// Модуль Controls - Калькулятор
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Калькулятор с выводом в TextBox';
+ LeftPanel(150, Colors.Orange);
+ var tb := SetMainControl.AsTextBox;
+ tb.FontSize := 30;
+ var x := IntegerBox('X:');
+ var y := IntegerBox('Y:');
+
+ var cb := new ComboBoxWPF('Операция');
+ cb.AddRange('+','-','*','/');
+
+ var b := Button('+');
+ b.Click := procedure -> begin
+ case cb.SelectedString of
+ string('+'): tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}');
+ string('-'): tb.Println($'{x.Value} - {y.Value} = {x.Value - y.Value}');
+ string('*'): tb.Println($'{x.Value} * {y.Value} = {x.Value * y.Value}');
+ string('/'): tb.Println($'{x.Value} / {y.Value} = {x.Value / y.Value}');
+ end;
+ x.Value := Random(0,10);
+ y.Value := Random(0,10);
+ end;
+
+ cb.SelectionChanged := procedure -> begin
+ b.Text := cb.SelectedString
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc19_StatusBar.pas b/InstallerSamples/Graphics/Controls/cc19_StatusBar.pas
new file mode 100644
index 000000000..0be2ecb95
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc19_StatusBar.pas
@@ -0,0 +1,17 @@
+// Модуль Controls - StatusBar
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Модуль Controls - StatusBar';
+ var l := LeftPanel(150,Colors.Orange);
+ l.Tooltip := 'Измените размеры окна';
+ var sb := StatusBar(24,55);
+ sb.AddText('',55);
+ Button('Очистить поле W').Click := procedure -> sb.ItemText[0] := '';
+ Button('Очистить поле H').Click := procedure -> sb.ItemText[1] := '';
+ OnResize := () -> begin
+ sb.ItemText[0] := 'W=' + Window.Width.Round;
+ sb.ItemText[1] := 'H=' + Window.Height.Round;
+ end;
+ OnResize();
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc1_All.pas b/InstallerSamples/Graphics/Controls/cc1_All.pas
new file mode 100644
index 000000000..9d195f324
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc1_All.pas
@@ -0,0 +1,34 @@
+// Модуль Controls - все элементы управления
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - все элементы управления';
+ // Обычно элементы управления размещаются на панели - левой или правой
+ LeftPanel(160,Colors.Orange);
+
+ Button('Кнопка');
+ CheckBox('Флажок');
+ RadioButton('Переключатель 1');
+ RadioButton('Переключатель 2');
+ TextBox('Поле ввода текста');
+ var ib := IntegerBox('Поле ввода целого',0,10);
+ ib.Tooltip := 'Покрутите колёсико мыши для изменения значения';
+ var l := ListBox('Список стран');
+ l.Height := 110;
+ l.Add('Россия');
+ l.Add('США');
+ l.Add('Китай');
+ l.Add('Германия');
+ l.Add('Франция');
+ var cb := ComboBox('Выпадающий список');
+ cb.AddRange('Россия','США','Китай','Германия','Франция');
+
+ TextBlock('Слайдер');
+ Slider(0,10);
+ TextBlock('Блок текста');
+ IntegerBlock('Блок целого:',64);
+ RealBlock('Блок вещественного:',3.5);
+
+ var s := StatusBar;
+ s.Text := 'Строка статуса';
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc20_Menu.pas b/InstallerSamples/Graphics/Controls/cc20_Menu.pas
new file mode 100644
index 000000000..576c6d93f
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc20_Menu.pas
@@ -0,0 +1,17 @@
+// Модуль Controls - меню
+uses Controls,GraphWPF;
+
+begin
+ LeftPanel(150, Colors.Orange);
+ var m := new MenuWPF;
+ var mi1 := m.Add('File');
+ mi1.Add('New');
+ mi1.Add('Open');
+ mi1.Add('Save');
+ mi1.AddSeparator;
+ mi1.Add('Exit').Click := procedure->Window.Close;
+ //mi1.Add('Exit',procedure->Window.Close);
+ m.Add('Edit');
+ m.Add('Options');
+ var mi := m.Add('Help');
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc20_Menu2.pas b/InstallerSamples/Graphics/Controls/cc20_Menu2.pas
new file mode 100644
index 000000000..6d1cd4bb5
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc20_Menu2.pas
@@ -0,0 +1,10 @@
+// Модуль Controls - меню 2
+uses Controls,GraphWPF;
+
+begin
+ LeftPanel(150, Colors.Orange);
+ var m := new MenuWPF;
+ m.AddRange('File','Edit','Options','Help');
+ m[0].AddRange('New','Open','Save','-','Exit');
+ m[0][3].Click := procedure->Window.Close;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc21_FileDialogs.pas b/InstallerSamples/Graphics/Controls/cc21_FileDialogs.pas
new file mode 100644
index 000000000..ea5f7a9a0
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc21_FileDialogs.pas
@@ -0,0 +1,39 @@
+// Модуль Controls - OpenFileDialog и SaveFileDialog
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Модуль Controls - OpenFileDialog и SaveFileDialog';
+ LeftPanel(150, Colors.Orange);
+ var tb := SetMainControl.AsTextBox;
+ tb.FontSize := 16;
+ tb.ReadOnly := False;
+ tb.FontName := 'Courier new Cyr';
+
+ var dopen := new OpenFileDialogWPF('c:\PABCWork.NET','Программы|*.pas');
+ var dSave := new SaveFileDialogWPF('c:\PABCWork.NET','Программы|*.pas');
+
+ var OpenHandler: procedure := procedure -> begin
+ var res := dopen.ShowDialog;
+ if res then
+ tb.Text := ReadAllText(dopen.FileName);
+ end;
+ var SaveHandler: procedure := procedure -> begin
+ var res := dSave.ShowDialog;
+ if res then
+ WriteAllText(dSave.FileName,tb.Text);
+ end;
+
+ var bOpen := Button('Open');
+ bOpen.Click := OpenHandler;
+
+ var bSave := Button('Save');
+ bSave.Click := SaveHandler;
+
+ var m := Menu;
+ var m1 := m.Add('File');
+ var mm1 := m1.Add('Open');
+ mm1.Click := OpenHandler;
+ m1.Add('Save',SaveHandler);
+ m1.AddSeparator;
+ m1.Add('Exit',procedure->Window.Close);
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc22_MsgBox.pas b/InstallerSamples/Graphics/Controls/cc22_MsgBox.pas
new file mode 100644
index 000000000..89cce8fac
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc22_MsgBox.pas
@@ -0,0 +1,19 @@
+// Модуль Controls - MessageBox
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - MessageBox';
+ LeftPanel(150, Colors.Orange);
+ Button('MsgBoxOK').Click := () -> MessageBox.Show('Сообщение','Заголовок');
+ Button('MsgBoxYesNo').Click := () -> begin
+ if MessageBox.Show('Сообщение','Заголовок',MessageBoxButton.YesNo) = MessageBoxResult.Yes then
+ Print('Yes')
+ else Print('No');
+ end;
+ Button('MsgBoxWithQuestion').Click := () -> begin
+ if MessageBox.Show('Вы уверены?','Заголовок',MessageBoxButton.YesNo,MessageBoxImage.Question)
+ = MessageBoxResult.Yes then
+ Print('Уверен')
+ else Print('Нет');
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc23_Random3DSpheres.pas b/InstallerSamples/Graphics/Controls/cc23_Random3DSpheres.pas
new file mode 100644
index 000000000..6505ad008
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc23_Random3DSpheres.pas
@@ -0,0 +1,13 @@
+// Случайные шары
+uses Graph3D,Controls;
+
+function R := Random(-7,7);
+
+begin
+ Window.Title := 'Случайные шары';
+ LeftPanel(150,Colors.Orange);
+ var b := new ButtonWPF('Создать шар');
+ b.Click := () → begin
+ Sphere(P3D(R,R,R),1);
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc24_RGB.pas b/InstallerSamples/Graphics/Controls/cc24_RGB.pas
new file mode 100644
index 000000000..a76b0b0c0
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc24_RGB.pas
@@ -0,0 +1,32 @@
+// Смешение цветов RGB
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Цвета';
+ Font.Size := 40;
+ LeftPanel(150);
+
+ var rb := IntegerBlock('Красный:');
+ rb.Margin := 3;
+ var r := Slider(0,255,255,16);
+ var gb := IntegerBlock('Зеленый:');
+ gb.Margin := 3;
+ var g := Slider(0,255,255,16);
+ var bb := IntegerBlock('Синий:');
+ bb.Margin := 3;
+ var b := Slider(0,255,255,16);
+
+ Button('Выход').Click := procedure -> Window.Close;
+
+ var p: procedure := ()-> begin
+ Window.Clear(RGB(r.Value.Round,g.Value.Round,b.Value.Round));
+ rb.Value := r.Value.Round;
+ gb.Value := g.Value.Round;
+ bb.Value := b.Value.Round;
+ DrawText(GraphWindow.ClientRect,$'R={rb.Value}, G={gb.Value}, B={bb.Value}');
+ end;
+ r.ValueChanged := p;
+ g.ValueChanged := p;
+ b.ValueChanged := p;
+ p;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc2_All2.pas b/InstallerSamples/Graphics/Controls/cc2_All2.pas
new file mode 100644
index 000000000..58fc3c8de
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc2_All2.pas
@@ -0,0 +1,59 @@
+// Модуль Controls - элементы управления на основной панели
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - элементы управления на основной панели';
+
+ var x := 10;
+ var w := 140;
+ Button(x,10,'Кнопка',w);
+ CheckBox(x,43,'Флажок');
+ RadioButton(x,70,'Переключатель 1');
+ RadioButton(x,97,'Переключатель 2');
+ TextBox(x,120,'Поле ввода текста',w);
+ var ib0 := IntegerBox(x,172,'Поле ввода целого',0,10,w);
+ ib0.Tooltip := 'Покрутите колёсико мыши для изменения значения';
+ var l0 := ListBox(x,221,'Список стран',w);
+ l0.Height := 110;
+ l0.Add('Россия');
+ l0.Add('США');
+ l0.Add('Китай');
+ l0.Add('Германия');
+ l0.Add('Франция');
+ var cb0 := ComboBox(x,362,'Выпадающий список',w);
+ cb0.AddRange('Россия','США','Китай','Германия','Франция');
+
+ TextBlock(x,414,'Слайдер');
+ Slider(x,434,0,10,w);
+ TextBlock(x,469,'Блок текста',w);
+ IntegerBlock(x,488,'Блок целого:',w,64);
+ RealBlock(x,507,'Блок вещественного:',w,3.5);
+
+ LeftPanel(160,Colors.Orange);
+
+ Button('Кнопка');
+ CheckBox('Флажок');
+ RadioButton('Переключатель 1');
+ RadioButton('Переключатель 2');
+ TextBox('Поле ввода текста');
+ var ib := IntegerBox('Поле ввода целого',0,10);
+ ib.Tooltip := 'Покрутите колёсико мыши для изменения значения';
+ var l := ListBox('Список стран');
+ l.Height := 110;
+ l.Add('Россия');
+ l.Add('США');
+ l.Add('Китай');
+ l.Add('Германия');
+ l.Add('Франция');
+ var cb := ComboBox('Выпадающий список');
+ cb.AddRange('Россия','США','Китай','Германия','Франция');
+
+ TextBlock('Слайдер');
+ Slider(0,10);
+ TextBlock('Блок текста');
+ IntegerBlock('Блок целого:',64);
+ RealBlock('Блок вещественного:',3.5);
+
+ var s := StatusBar;
+ s.Text := 'Строка статуса';
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc3_All3.pas b/InstallerSamples/Graphics/Controls/cc3_All3.pas
new file mode 100644
index 000000000..04692f327
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc3_All3.pas
@@ -0,0 +1,34 @@
+// Модуль Controls - создание элементов вызовом конструктора
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - создание элементов вызовом конструктора + правая панель';
+ // Размещение элементов на правой ранели
+ new RightPanelWPF(160,Colors.Orange);
+
+ new ButtonWPF('Кнопка');
+ new CheckBoxWPF('Флажок');
+ new RadioButtonWPF('Переключатель 1');
+ new RadioButtonWPF('Переключатель 2');
+ new TextBoxWPF('Поле ввода текста');
+ var ib := new IntegerBoxWPF('Поле ввода целого',0,10);
+ ib.Tooltip := 'Покрутите колёсико мыши для изменения значения';
+ var l := new ListBoxWPF('Список стран');
+ l.Height := 110;
+ l.Add('Россия');
+ l.Add('США');
+ l.Add('Китай');
+ l.Add('Германия');
+ l.Add('Франция');
+ var cb := new ComboBoxWPF('Выпадающий список');
+ cb.AddRange('Россия','США','Китай','Германия','Франция');
+
+ new TextBlockWPF('Слайдер');
+ new SliderWPF(0,10);
+ new TextBlockWPF('Блок текста');
+ new IntegerBlockWPF('Блок целого:',64);
+ new RealBlockWPF('Блок вещественного:',3.5);
+
+ var s := new StatusBarWPF;
+ s.Text := 'Строка статуса';
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc4_ButtonClick.pas b/InstallerSamples/Graphics/Controls/cc4_ButtonClick.pas
new file mode 100644
index 000000000..463d39486
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc4_ButtonClick.pas
@@ -0,0 +1,19 @@
+// Модуль Controls - кнопки и их обработчики
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - кнопки и их обработчики';
+ var p := LeftPanel;
+ p.Color := Colors.Orange;
+
+ Button('Случайный цвет').Click := () -> begin
+ Window.Clear(RandomColor);
+ end;
+
+ var b2 := Button('Плюс');
+ b2.Click := procedure ->
+ if b2.Text = 'Плюс' then b2.Text := 'Минус' else b2.Text := 'Плюс';
+
+ var b1 := Button('Закрыть окно');
+ b1.Click := procedure -> Window.Close;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc5_CheckBoxes.pas b/InstallerSamples/Graphics/Controls/cc5_CheckBoxes.pas
new file mode 100644
index 000000000..f909cb743
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc5_CheckBoxes.pas
@@ -0,0 +1,20 @@
+// Модуль Controls - флажки
+uses GraphWPF,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - флажки';
+
+ var p := LeftPanel(170,Colors.Orange);
+
+ var b1 := Button('Переключить флажок 1');
+ var b2 := Button('Переключить флажок 2');
+ var b3 := Button('Переключить флажок 3');
+
+ var cb1 := new CheckBoxWPF('Флажок 1');
+ var cb2 := new CheckBoxWPF('Флажок 2');
+ var cb3 := new CheckBoxWPF('Флажок 3');
+
+ b1.Click := procedure -> cb1.Checked := not cb1.Checked;
+ b2.Click := procedure -> cb2.Checked := not cb2.Checked;
+ b3.Click := procedure -> cb3.Checked := not cb3.Checked;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc6_CheckBoxes2.pas b/InstallerSamples/Graphics/Controls/cc6_CheckBoxes2.pas
new file mode 100644
index 000000000..7af4f754d
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc6_CheckBoxes2.pas
@@ -0,0 +1,33 @@
+// Модуль Controls - флажки
+uses WPFObjects,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - флажки';
+
+ LeftPanel(170);
+
+ var tb := TextBlock('Параметры круга:');
+ tb.Margin := 12;
+
+ var cb1 := new CheckBoxWPF('Заливка');
+ var cb2 := new CheckBoxWPF('Жирная граница');
+ var cb3 := new CheckBoxWPF('С текстом');
+
+ var c := new CircleWPF(GraphWindow.Center,60,Colors.White,1);
+
+ cb1.Click := procedure -> begin
+ if cb1.Checked then
+ c.Color := Colors.Green
+ else c.Color := Colors.White
+ end;
+ cb2.Click := procedure -> begin
+ if cb2.Checked then
+ c.BorderWidth := 4
+ else c.BorderWidth := 1
+ end;
+ cb3.Click := procedure -> begin
+ if cb3.Checked then
+ c.Text := 'Текст'
+ else c.Text := ''
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc7_RadioButtons.pas b/InstallerSamples/Graphics/Controls/cc7_RadioButtons.pas
new file mode 100644
index 000000000..b01f0738f
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc7_RadioButtons.pas
@@ -0,0 +1,26 @@
+// Модуль Controls - переключатели
+uses WPFObjects,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - переключатели';
+ LeftPanel(150,Colors.Beige);
+
+ var tb := TextBlock('Цвет круга:');
+ //tb.Margin := 12;
+
+ var rb1 := new RadioButtonWPF('Красный');
+ var rb2 := new RadioButtonWPF('Зелёный');
+ var rb3 := new RadioButtonWPF('Синий');
+
+ var c := new CircleWPF(GraphWindow.Center,60,Colors.White,1);
+
+ rb1.Click := procedure -> begin
+ c.Color := Colors.Red;
+ end;
+ rb2.Click := procedure -> begin
+ c.Color := Colors.Green;
+ end;
+ rb3.Click := procedure -> begin
+ c.Color := Colors.Blue;
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc8_MoveObject.pas b/InstallerSamples/Graphics/Controls/cc8_MoveObject.pas
new file mode 100644
index 000000000..197f6ee3a
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc8_MoveObject.pas
@@ -0,0 +1,28 @@
+// Модуль Controls - кнопки управления перемещением + клавиатура
+uses WPFObjects,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - кнопки управления перемещением + клавиатура';
+
+ LeftPanel;
+
+ var c := new CircleWPF(GraphWindow.Center,30,Colors.Blue);
+
+ OnKeyDown := k -> begin
+ case k of
+ Key.Left: c.MoveOn(-2,0);
+ Key.Right: c.MoveOn(2,0);
+ Key.Up: c.MoveOn(0,-2);
+ Key.Down: c.MoveOn(0,2);
+ end;
+ end;
+
+ var l := Button('Left');
+ var r := Button('Right');
+ var u := Button('Up');
+ var d := Button('Down');
+ l.Click := ()->c.MoveOn(-2,0);
+ r.Click := ()->c.MoveOn(2,0);
+ u.Click := ()->c.MoveOn(0,-2);
+ d.Click := ()->c.MoveOn(0,2);
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc8a_MoveObject.pas b/InstallerSamples/Graphics/Controls/cc8a_MoveObject.pas
new file mode 100644
index 000000000..29d2f1894
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc8a_MoveObject.pas
@@ -0,0 +1,27 @@
+// Модуль Controls - IntegerBlock, IntegerBox и перемещение объекта
+uses WPFObjects,Controls;
+
+begin
+ Window.Title := 'Модуль Controls - IntegerBlock, IntegerBox и перемещение объекта';
+
+ LeftPanel;
+
+ var c := new CircleWPF(300,300,30,Colors.Blue);
+
+ var X := IntegerBox('X:',0,600);
+ X.Value := 300;
+ var Y := IntegerBox('Y:',0,600);
+ Y.Value := 300;
+
+ var XX := IntegerBlock('X:',300);
+ var YY := IntegerBlock('Y:',300);
+
+ X.ValueChanged := procedure → begin
+ c.Center := Pnt(X.Value,Y.Value);
+ XX.Value := X.Value;
+ end;
+ Y.ValueChanged := procedure → begin
+ c.Center := Pnt(X.Value,Y.Value);
+ YY.Value := Y.Value;
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc9_ListBox.pas b/InstallerSamples/Graphics/Controls/cc9_ListBox.pas
new file mode 100644
index 000000000..6b91faf9a
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc9_ListBox.pas
@@ -0,0 +1,28 @@
+// Модуль Controls - элемент управления "Список" и использование словаря
+uses Controls,GraphWPF;
+
+begin
+ Window.Title := 'Столицы стран';
+ LeftPanel(150,Colors.Orange);
+ var l := ListBox('Список стран');
+ //l.Tooltip := 'Выбери страну - отобразится столица';
+ l.Height := 110;
+ l.Add('Россия');
+ l.Add('США');
+ l.Add('Китай');
+ l.Add('Германия');
+ l.Add('Франция');
+
+ var d := Dict(('Россия','Москва'),
+ ('США','Вашингтон'),
+ ('Китай','Пекин'),
+ ('Германия','Берлин'),
+ ('Франция','Париж')
+ );
+
+ Font.Size := 70;
+ l.SelectionChanged := procedure -> begin
+ Window.Clear;
+ DrawText(GraphWindow.ClientRect,'Столица:'+#10+d[l.SelectedText]);
+ end;
+end.
\ No newline at end of file
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 4cc0b3877..25a575f1f 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2604
+3.6.3.2607
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 3f04c1a78..9511fd679 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2604'
+!define VERSION '3.6.3.2607'
diff --git a/TestSuite/CompilationSamples/GraphWPF.pas b/TestSuite/CompilationSamples/GraphWPF.pas
index e5d77d634..8aec0dc6b 100644
--- a/TestSuite/CompilationSamples/GraphWPF.pas
+++ b/TestSuite/CompilationSamples/GraphWPF.pas
@@ -58,7 +58,6 @@ type
//{{{--doc: Конец секции 1 }}}
-function GetBrush(c: Color): GBrush;
function GetFontFamily(name: string): FontFamily;
@@ -630,20 +629,8 @@ procedure __FinalizeModule__;
implementation
-var BrushesDict := new Dictionary;
var FontFamiliesDict := new Dictionary;
-function GetBrush(c: Color): GBrush;
-begin
- if not (c in BrushesDict) then
- begin
- var b := new SolidColorBrush(c);
- BrushesDict[c] := b;
- Result := b
- end
- else Result := BrushesDict[c];
-end;
-
function GetFontFamily(name: string): FontFamily;
begin
if not (name in FontFamiliesDict) then
@@ -1494,6 +1481,7 @@ type
Pen.Color := Colors.Black;
var n := Round(w / 1);
+ if n<=0 then exit;
var pp := PartitionPoints(a, b, n);
var fff: real -> Point := xx -> Pnt(x + mx * (xx - a), y + my * (max - f(xx).Clamp(min,max)));
//pp.Select(x->(x,f(x))).PrintLines;
@@ -1523,8 +1511,11 @@ procedure DrawGraph(f: real -> real; a, b, min, max: real; title: string) := Dra
procedure DrawGraph(f: real -> real; a, b: real; x, y, w, h: real; title: string);
begin
var n := Round(w / 1);
- var q := PartitionPoints(a, b, n);
- DrawGraph(f, a, b, q.Min(f), q.Max(f), x, y, w, h, title)
+ if n<=0 then exit;
+ var q := PartitionPoints(a, b, n).ToArray;
+ var mi := q.Min(f);
+ var ma := q.Max(f);
+ DrawGraph(f, a, b, mi, ma, x, y, w, h, title);
end;
procedure DrawGraph(f: real -> real; a, b: real; r: GRect; title: string) := DrawGraph(f, a, b, r.X, r.Y, r.Width, r.Height, title);
@@ -1929,6 +1920,8 @@ GraphWPFWindow = class(GMainWindow)
public
procedure InitMainGraphControl; override;
begin
+ var g := Content as DockPanel;
+
host1 := new Canvas;
host := new MyVisualHost();
host1.ClipToBounds := True;
@@ -1938,7 +1931,6 @@ public
host.DataContext := sz;
end;
// Всегда последнее
- var g := MainPanel;
var dpiXProperty := typeof(SystemParameters).GetProperty('DpiX', BindingFlags.NonPublic or BindingFlags.Static);
var dpiYProperty := typeof(SystemParameters).GetProperty('Dpi', BindingFlags.NonPublic or BindingFlags.Static);
@@ -2004,7 +1996,7 @@ begin
app.Dispatcher.UnhandledException += (o, e) -> begin
Println(e.Exception.Message);
- if e.Exception.InnerException<>nil then
+ if e.Exception.InnerException <> nil then
Println(e.Exception.InnerException.Message);
halt;
end;
diff --git a/TestSuite/CompilationSamples/GraphWPFBase.pas b/TestSuite/CompilationSamples/GraphWPFBase.pas
index 854cab21a..db3ccf4a1 100644
--- a/TestSuite/CompilationSamples/GraphWPFBase.pas
+++ b/TestSuite/CompilationSamples/GraphWPFBase.pas
@@ -11,12 +11,14 @@ unit GraphWPFBase;
uses System.Windows;
uses System.Windows.Controls;
+uses System.Windows.Media;
type
/// Тип цвета
GColor = System.Windows.Media.Color;
/// Тип прямоугольника
GRect = System.Windows.Rect;
+ GBrush = System.Windows.Media.Brush;
GWindow = System.Windows.Window;
GMainWindow = class(GWindow)
@@ -56,6 +58,19 @@ var
app: Application;
MainWindow: GMainWindow;
+var BrushesDict := new Dictionary;
+
+function GetBrush(c: GColor): GBrush;
+begin
+ if not (c in BrushesDict) then
+ begin
+ var b := new SolidColorBrush(c);
+ BrushesDict[c] := b;
+ Result := b
+ end
+ else Result := BrushesDict[c];
+end;
+
procedure Invoke(d: System.Delegate; params args: array of object) := app.Dispatcher.Invoke(d, args);
procedure InvokeP(p: procedure(r: real); r: real) := Invoke(p,r);
@@ -303,6 +318,8 @@ begin
end;
end;
-begin
+initialization
__InitModule;
+
+finalization
end.
\ No newline at end of file
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index b8ab8c372..b254e7b7a 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -4545,9 +4545,9 @@ end;
function Range(a, b: real; n: integer): sequence of real;
begin
if n = 0 then
- raise new System.ArgumentException('n=0');
+ raise new System.ArgumentException('Range: n=0');
if n < 0 then
- raise new System.ArgumentException('n<0');
+ raise new System.ArgumentException('Range: n<0');
var r := a;
var h := (b - a) / n;
for var i := 0 to n do
diff --git a/bin/Lib/Controls.pas b/bin/Lib/Controls.pas
index afa8d4ca1..108229040 100644
--- a/bin/Lib/Controls.pas
+++ b/bin/Lib/Controls.pas
@@ -1,11 +1,11 @@
// Copyright (©) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
-///Модуль элементов управления для GraphWPF и WPFObjects
+///Модуль элементов управления для GraphWPF, WPFObjects и Graph3D
unit Controls;
interface
-uses GraphWPFBase,GraphWPF;
+uses GraphWPFBase;
uses System.Windows;
uses System.Windows.Media;
uses System.Windows.Media.Imaging;
@@ -33,8 +33,11 @@ type
Key = System.Windows.Input.Key;
var
- ActivePanel: GPanel;
+ _ActivePanel: GPanel;
GlobalHMargin := 12;
+
+function __ActivePanelInternal: GPanel;
+procedure __SetActivePanelInternal(p: GPanel);
procedure Invoke(d: System.Delegate; params args: array of object);
procedure InvokeP(p: procedure(r: real); r: real);
@@ -67,7 +70,8 @@ type
end;
DockPanel.SetDock(bb, d);
MainDockPanel.children.Insert(0, bb);
- ActivePanel := p;
+ //ActivePanel := p;
+ __SetActivePanelInternal(p);
end;
procedure SetColorP(c: GColor);
begin
@@ -75,15 +79,23 @@ type
bb.Background := p.Background
end;
function GetColorP := (p.Background as SolidColorBrush).Color;
+ procedure SetTTP(s: string);
+ begin
+ p.ToolTip := s;
+ end;
public
constructor Create(wh: real := 150; d: Dock := Dock.Left; c: Color := PanelsColor; internalMargin: real := 10);
begin
Invoke(CreateP,wh,d,c,internalMargin);
end;
+ /// Цвет
property Color: GColor read Invoke&(GetColorP) write Invoke(SetColorP, value);
+ /// Ширина внутренней границы
property InternalMargin: real
read InvokeReal(()->p.Margin.Left)
write Invoke(procedure -> p.Margin := new System.Windows.Thickness(internalMargin), value);
+ /// Всплывающая подсказка
+ property Tooltip: string read Invokestring(()->p.ToolTip as string) write Invoke(SetTTP, value);
end;
/// Класс левой панели
@@ -113,7 +125,7 @@ type
begin
element := el;
element.Focusable := False;
- if ActivePanel is StackPanel(var sp) then
+ if __ActivePanelInternal is StackPanel(var sp) then
if sp.Orientation = Orientation.Vertical then
element.Margin := new Thickness(0,0,0,GlobalHMargin);
//else element.Margin := new Thickness(0,0,GlobalHMargin,0);
@@ -124,12 +136,13 @@ type
end;
if width>0 then
element.Width := width;
- ActivePanel.Children.Add(element);
+ __ActivePanelInternal.Children.Add(element);
end;
procedure SetWP(w: real) := element.Width := w;
procedure SetHP(h: real) := element.Height := h;
procedure SetMP(m: real) := element.Margin := new Thickness(0,0,0,m);
+ procedure SetTTP(s: string) := element.Tooltip := s;
procedure SetEP(enabled: boolean) := element.IsEnabled := enabled;
public
/// Ширина элемента управления
@@ -140,6 +153,8 @@ type
property Margin: real read InvokeReal(()->element.Margin.Bottom) write Invoke(SetMP, value);
/// Активирован ли элемент управления
property Enabled: boolean read InvokeBoolean(()->element.IsEnabled) write Invoke(SetEP, value);
+ /// Всплывающая подсказка
+ property Tooltip: string read Invokestring(()->element.ToolTip as string) write Invoke(SetTTP, value);
end;
CommonControlWPF = class(CommonElementWPF)
@@ -234,7 +249,7 @@ type
procedure CreatePXY(x, y: real; Txt: string; width: real; fontsize: real);
begin
Init0(new GTextBlock, width, x, y);
- Margin := 3;
+ //Margin := 3;
Text := Txt;
Self.FontSize := fontSize;
end;
@@ -243,6 +258,8 @@ type
procedure SetTextP(t: string) := tb.Text := t;
procedure SetFontSizeP(sz: real) := tb.FontSize := sz;
procedure SetFontNameP(name: string) := tb.FontFamily := new FontFamily(name);
+ procedure SetTextWrappingP(value: boolean) := if value then tb.TextWrapping := TextWrapping.Wrap else
+ tb.TextWrapping := TextWrapping.NoWrap;
public
constructor Create(Txt: string; fontsize: real := 12):= Invoke(CreateP, Txt, fontsize);
constructor Create(x, y: real; Txt: string; width: real := 0; fontSize: real := 12):= Invoke(CreatePXY, x, y, Txt, width, fontSize);
@@ -253,6 +270,9 @@ type
property FontSize: real read InvokeReal(()->tb.FontSize) write Invoke(SetFontSizeP, value); virtual;
/// Имя шрифта
property FontName: string write Invoke(SetFontNameP, value); virtual;
+ /// Включён ли режим переноса слов
+ property Wrapping: boolean read InvokeBoolean(()->tb.TextWrapping = TextWrapping.Wrap)
+ write Invoke(SetTextWrappingP, value); virtual;
end;
/// Элемент управления "Целое число"
@@ -282,7 +302,7 @@ type
message: string;
procedure CreatePXY(x, y: real; message: string; width: real; initValue: real := 0; fontSize: real := 12);
begin
- inherited CreatePXY(x,y,message + ' ' + initValue, width, fontSize);
+ inherited CreatePXY(x,y,message + ' ' + initValue.ToString(FracDigits), width, fontSize);
Self.message := message;
val := initValue;
end;
@@ -351,7 +371,7 @@ type
/// Очистка текста в текстовом поле
procedure Clear := Text := '';
/// Разрешено ли ручное редактирование текста
- property Focusable: boolean read InvokeBoolean(()->not element.Focusable) write Invoke(SetReadOnlyP,value);
+ property ReadOnly: boolean read InvokeBoolean(()->not element.Focusable) write Invoke(SetReadOnlyP,value);
end;
///!#
@@ -420,21 +440,21 @@ type
Init1(new TextBox, title, width, x, y);
//tbx.TextWrapping := TextWrapping.Wrap;
tbx.Text := txt;
- tbx.TextChanged += (o,e) -> if TextChanged <> nil then TextChanged;
+ tbx.TextChanged += (o,e) -> if ValueChanged <> nil then ValueChanged;
end;
procedure CreateAsMainControlP;
begin
element := CreateStackPanel(new TextBox,'');
- Multiline := True;
- tbx.TextChanged += (o,e) -> if TextChanged <> nil then TextChanged;
+ Wrapping := True;
+ tbx.TextChanged += (o,e) -> if ValueChanged <> nil then ValueChanged;
MainDockPanel.children.RemoveAt(MainDockPanel.children.Count-1);
MainDockPanel.children.Add(element);
end;
procedure CreateP(title,text: string) := CreatePXY(-1,-1,title,text,0);
constructor Create(i: integer) := Invoke(CreateAsMainControlP);
public
- /// Событие "текст изменился"
- TextChanged: procedure;
+ /// Событие "значение изменилось"
+ ValueChanged: procedure;
constructor Create(title: string := '') := Invoke(CreateP, title, '');
constructor Create(x,y: real; title: string := ''; width: real := 120) := Invoke(CreatePXY, x, y, title,'', width);
@@ -442,8 +462,8 @@ type
procedure Clear := Text := '';
/// Текст в текстовом поле
property Text: string read InvokeString(()->tbx.Text) write Invoke(SetTextP, value);
- /// Разрешено ли несколько строк в текстовом поле
- property MultiLine: boolean read InvokeBoolean(()->tbx.TextWrapping = TextWrapping.Wrap) write Invoke(SetMultiLineP, value);
+ /// Включён ли режим переноса слов
+ property Wrapping: boolean read InvokeBoolean(()->tbx.TextWrapping = TextWrapping.Wrap) write Invoke(SetMultiLineP, value);
end;
/// Элемент управления "Целое поле"
@@ -572,14 +592,17 @@ type
/// Событие, возникающее при изменении текущего выделения
SelectionChanged: procedure;
constructor Create(title: string := '') := Invoke(CreateP, title);
- constructor Create(x,y: real; title: string := ''; width: real := 120) := Invoke(CreatePXY, x, y, title,'', width);
+ constructor Create(x,y: real; title: string := ''; width: real := 120) := Invoke(CreatePXY, x, y, title, width);
/// Добавляет элемент в список
procedure Add(s: string) := Invoke(AddP, s);
/// Добавляет набор элементов в список
procedure AddRange(params ss: array of string) := Invoke(AddRangeP, ss);
/// Выбранная строка
- function SelectedString := InvokeString(()->cb.SelectedItem as string);
+ function SelectedText := InvokeString(()->cb.SelectedItem as string);
+ /// Индекс выбранной строки
+ function SelectedIndex := InvokeInteger(()->cb.SelectedIndex);
+ property Items[i: integer]: string read InvokeString(()->cb.Items[i] as string); default;
end;
/// Элемент управления "Слайдер"
@@ -652,7 +675,7 @@ type
property Checked: boolean read InvokeBoolean(()->cb.IsChecked.Value) write Invoke(procedure(t: boolean) -> cb.IsChecked := t, value);
end;
- /// Элемент управления "Радиокнопка"
+ /// Элемент управления "Переключатель"
RadioButtonWPF = class(ClickableControlWPF)
private
property rb: RadioButton read element as RadioButton;
@@ -731,7 +754,8 @@ type
element.Focusable := False;
MainDockPanel.children.RemoveAt(MainDockPanel.children.Count-1);
MainDockPanel.children.Add(can);
- ActivePanel := can;
+ __SetActivePanelInternal(can);
+ //ActivePanel := can;
end;
constructor (i: integer) := Invoke(CreatePP); // фиктивный первый параметр
procedure SetColorP(c: GColor);
@@ -977,6 +1001,17 @@ function RealBlock(message: string; initValue: real := 0; fontSize: real := 12):
/// Элемент управления "Вещественное число" с заданными координатами
function RealBlock(x, y: real; message: string; width: real := 0; initValue: real := 0; fontSize: real := 12): RealBlockWPF;
+/// Элемент управления "Флажок"
+function CheckBox(text: string): CheckBoxWPF;
+/// Элемент управления "Флажок" с заданными координатами
+function CheckBox(x, y: real; text: string; width: real := 0): CheckBoxWPF;
+
+/// Элемент управления "Переключатель"
+function RadioButton(text: string): RadioButtonWPF;
+/// Элемент управления "Переключатель" с заданными координатами
+function RadioButton(x, y: real; text: string; width: real := 0): RadioButtonWPF;
+
+
/// Элемент управления "Текстовое поле с заголовком"
function TextBox(text: string := ''): TextBoxWPF;
/// Элемент управления "Текстовое поле с заголовком" с заданными координатами
@@ -1030,18 +1065,23 @@ function StatusBar(height: real := 24; itemWidth: real := 0): StatusBarWPF;
/// Пустой блок для задания промежутков между компонентами
procedure EmptyBlock(sz: integer := 16);
+/// Установка активной панели, на которую размещаются элементы управления
+procedure SetActivePanel(p: PanelWPF);
+
+
+
/// Графическое окно
-function Window: WindowTypeWPF;
+//function Window: WindowType;
implementation
-uses GraphWPF;
+//uses GraphWPF;
uses System.Windows;
uses System.Windows.Controls;
uses System.Windows.Controls.Primitives;
uses System.Windows.Media.Imaging;
-function Window: WindowTypeWPF := GraphWPF.Window;
+//function Window: WindowType := GraphWPF.Window;
function Button(Txt: string; fontSize: real): ButtonWPF := ButtonWPF.Create(Txt,fontSize);
function Button(x, y: real; Txt: string; width: real; fontSize: real): ButtonWPF := ButtonWPF.Create(x, y, Txt, width, fontSize);
@@ -1055,6 +1095,12 @@ function IntegerBlock(x, y: real; message: string; width: real; initValue: integ
function RealBlock(message: string; initValue: real; fontSize: real): RealBlockWPF := RealBlockWPF.Create(message, initValue, fontSize);
function RealBlock(x, y: real; message: string; width: real; initValue: real; fontSize: real): RealBlockWPF := RealBlockWPF.Create(x,y,message,width,initValue,fontSize);
+function CheckBox(text: string): CheckBoxWPF := CheckBoxWPF.Create(text);
+function CheckBox(x, y: real; text: string; width: real): CheckBoxWPF := CheckBoxWPF.Create(x,y,text,width);
+
+function RadioButton(text: string): RadioButtonWPF := RadioButtonWPF.Create(text);
+function RadioButton(x, y: real; text: string; width: real): RadioButtonWPF := RadioButtonWPF.Create(x,y,text,width);
+
function TextBox(text: string): TextBoxWPF := TextBoxWPF.Create(text);
function TextBox(x, y: real; text: string; width: real): TextBoxWPF := TextBoxWPF.Create(x,y,text,width);
@@ -1116,15 +1162,54 @@ begin
Result := flds.OrderBy(f->f.CustomAttributes.FirstOrDefault?.ToString ?? 'NoAttr').Select(f->f.Name);
end;
-procedure Invoke(d: System.Delegate; params args: array of object) := GraphWPFBase.Invoke(d, args);
-procedure InvokeP(p: procedure(r: real); r: real) := GraphWPFBase.Invoke(p,r);
-function Invoke(d: Func0): T := T(app.Dispatcher.Invoke(d));
+type ControlsCannotBeRunWithoutGraphModules = class(System.ApplicationException) end;
+
+procedure Invoke(d: System.Delegate; params args: array of object);
+begin
+ if app = nil then
+ raise new ControlsCannotBeRunWithoutGraphModules('Модуль Controls должен испольоваться только совместно с модулями GraphWPF и WPFObjects либо Graph3D');
+ GraphWPFBase.Invoke(d, args);
+end;
+
+procedure InvokeP(p: procedure(r: real); r: real);
+begin
+ if app = nil then
+ raise new ControlsCannotBeRunWithoutGraphModules('Модуль Controls должен испольоваться только совместно с модулями GraphWPF и WPFObjects либо Graph3D');
+ GraphWPFBase.Invoke(p,r);
+end;
+
+function Invoke(d: Func0): T;
+begin
+ if app = nil then
+ raise new ControlsCannotBeRunWithoutGraphModules('Модуль Controls должен испольоваться только совместно с модулями GraphWPF и WPFObjects либо Graph3D');
+ Result := T(app.Dispatcher.Invoke(d));
+end;
+
+procedure __SetActivePanelInternal(p: GPanel);
+begin
+ Invoke(()->begin
+ _ActivePanel := p;
+ end);
+end;
+
+procedure SetActivePanel(p: PanelWPF);
+begin
+ __SetActivePanelInternal(p.p)
+end;
procedure SetActivePanelInit;
begin
- ActivePanel := MainWindow.MainPanel.Children[0] as GPanel
+ __SetActivePanelInternal(MainWindow.MainPanel.Children[0] as GPanel);
+ //ActivePanel := MainWindow.MainPanel.Children[0] as GPanel
end;
+function __ActivePanelInternal: GPanel;
begin
- Invoke(SetActivePanelInit);
+ if _ActivePanel = nil then
+ Invoke(SetActivePanelInit);
+ Result := _ActivePanel;
+end;
+
+initialization
+finalization
end.
\ No newline at end of file
diff --git a/bin/Lib/GraphWPF.pas b/bin/Lib/GraphWPF.pas
index 4a896a82f..2b3470104 100644
--- a/bin/Lib/GraphWPF.pas
+++ b/bin/Lib/GraphWPF.pas
@@ -58,7 +58,6 @@ type
//{{{--doc: Конец секции 1 }}}
-function GetBrush(c: Color): GBrush;
function GetFontFamily(name: string): FontFamily;
@@ -630,20 +629,8 @@ procedure __FinalizeModule__;
implementation
-var BrushesDict := new Dictionary;
var FontFamiliesDict := new Dictionary;
-function GetBrush(c: Color): GBrush;
-begin
- if not (c in BrushesDict) then
- begin
- var b := new SolidColorBrush(c);
- BrushesDict[c] := b;
- Result := b
- end
- else Result := BrushesDict[c];
-end;
-
function GetFontFamily(name: string): FontFamily;
begin
if not (name in FontFamiliesDict) then
@@ -1494,6 +1481,7 @@ type
Pen.Color := Colors.Black;
var n := Round(w / 1);
+ if n<=0 then exit;
var pp := PartitionPoints(a, b, n);
var fff: real -> Point := xx -> Pnt(x + mx * (xx - a), y + my * (max - f(xx).Clamp(min,max)));
//pp.Select(x->(x,f(x))).PrintLines;
@@ -1523,8 +1511,11 @@ procedure DrawGraph(f: real -> real; a, b, min, max: real; title: string) := Dra
procedure DrawGraph(f: real -> real; a, b: real; x, y, w, h: real; title: string);
begin
var n := Round(w / 1);
- var q := PartitionPoints(a, b, n);
- DrawGraph(f, a, b, q.Min(f), q.Max(f), x, y, w, h, title)
+ if n<=0 then exit;
+ var q := PartitionPoints(a, b, n).ToArray;
+ var mi := q.Min(f);
+ var ma := q.Max(f);
+ DrawGraph(f, a, b, mi, ma, x, y, w, h, title);
end;
procedure DrawGraph(f: real -> real; a, b: real; r: GRect; title: string) := DrawGraph(f, a, b, r.X, r.Y, r.Width, r.Height, title);
@@ -1929,6 +1920,8 @@ GraphWPFWindow = class(GMainWindow)
public
procedure InitMainGraphControl; override;
begin
+ var g := Content as DockPanel;
+
host1 := new Canvas;
host := new MyVisualHost();
host1.ClipToBounds := True;
@@ -1938,7 +1931,6 @@ public
host.DataContext := sz;
end;
// Всегда последнее
- var g := MainPanel;
var dpiXProperty := typeof(SystemParameters).GetProperty('DpiX', BindingFlags.NonPublic or BindingFlags.Static);
var dpiYProperty := typeof(SystemParameters).GetProperty('Dpi', BindingFlags.NonPublic or BindingFlags.Static);
@@ -2004,7 +1996,7 @@ begin
app.Dispatcher.UnhandledException += (o, e) -> begin
Println(e.Exception.Message);
- if e.Exception.InnerException<>nil then
+ if e.Exception.InnerException <> nil then
Println(e.Exception.InnerException.Message);
halt;
end;
diff --git a/bin/Lib/GraphWPFBase.pas b/bin/Lib/GraphWPFBase.pas
index 854cab21a..db3ccf4a1 100644
--- a/bin/Lib/GraphWPFBase.pas
+++ b/bin/Lib/GraphWPFBase.pas
@@ -11,12 +11,14 @@ unit GraphWPFBase;
uses System.Windows;
uses System.Windows.Controls;
+uses System.Windows.Media;
type
/// Тип цвета
GColor = System.Windows.Media.Color;
/// Тип прямоугольника
GRect = System.Windows.Rect;
+ GBrush = System.Windows.Media.Brush;
GWindow = System.Windows.Window;
GMainWindow = class(GWindow)
@@ -56,6 +58,19 @@ var
app: Application;
MainWindow: GMainWindow;
+var BrushesDict := new Dictionary;
+
+function GetBrush(c: GColor): GBrush;
+begin
+ if not (c in BrushesDict) then
+ begin
+ var b := new SolidColorBrush(c);
+ BrushesDict[c] := b;
+ Result := b
+ end
+ else Result := BrushesDict[c];
+end;
+
procedure Invoke(d: System.Delegate; params args: array of object) := app.Dispatcher.Invoke(d, args);
procedure InvokeP(p: procedure(r: real); r: real) := Invoke(p,r);
@@ -303,6 +318,8 @@ begin
end;
end;
-begin
+initialization
__InitModule;
+
+finalization
end.
\ No newline at end of file
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index b8ab8c372..b254e7b7a 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -4545,9 +4545,9 @@ end;
function Range(a, b: real; n: integer): sequence of real;
begin
if n = 0 then
- raise new System.ArgumentException('n=0');
+ raise new System.ArgumentException('Range: n=0');
if n < 0 then
- raise new System.ArgumentException('n<0');
+ raise new System.ArgumentException('Range: n<0');
var r := a;
var h := (b - a) / n;
for var i := 0 to n do
diff --git a/bin/template.pct b/bin/template.pct
index 878af5251..69027c32d 100644
--- a/bin/template.pct
+++ b/bin/template.pct
@@ -112,6 +112,9 @@ end;
[ar]
array of |;
+[a]
+→|
+
[try]
try
|
From 5404728fdb7065c10ee4252057c0d67e9e85660c Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Sat, 1 Aug 2020 11:29:09 +0300
Subject: [PATCH 07/18] case s of '1' end
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
допускаются символы в case по строкам
---
.../Graphics/Controls/cc18_SimpleCalc.pas | 26 +++++++++++----
.../WPFObjects/StartStopMoveRotation.pas | 32 +++++++++++++++++++
.../TreeConversion/syntax_tree_visitor.cs | 2 ++
bin/Lib/WPFObjects.pas | 2 ++
4 files changed, 56 insertions(+), 6 deletions(-)
create mode 100644 InstallerSamples/Graphics/WPFObjects/StartStopMoveRotation.pas
diff --git a/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas b/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
index e92f47dd6..f28cadba6 100644
--- a/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
+++ b/InstallerSamples/Graphics/Controls/cc18_SimpleCalc.pas
@@ -8,23 +8,37 @@ begin
tb.FontSize := 30;
var x := IntegerBox('X:');
var y := IntegerBox('Y:');
+ x.Value := Random(0,10);
+ y.Value := Random(0,10);
var cb := new ComboBoxWPF('Операция');
cb.AddRange('+','-','*','/');
+ var count := 0;
+ var sb := StatusBar;
+ sb.Text := 'Количество вычислений: ' + count;
+
var b := Button('+');
b.Click := procedure -> begin
- case cb.SelectedString of
- string('+'): tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}');
- string('-'): tb.Println($'{x.Value} - {y.Value} = {x.Value - y.Value}');
- string('*'): tb.Println($'{x.Value} * {y.Value} = {x.Value * y.Value}');
- string('/'): tb.Println($'{x.Value} / {y.Value} = {x.Value / y.Value}');
+ case cb.SelectedText of
+ '+': tb.Println($'{x.Value} + {y.Value} = {x.Value + y.Value}');
+ '-': tb.Println($'{x.Value} - {y.Value} = {x.Value - y.Value}');
+ '*': tb.Println($'{x.Value} * {y.Value} = {x.Value * y.Value}');
+ '/': tb.Println($'{x.Value} / {y.Value} = {x.Value / y.Value}');
end;
x.Value := Random(0,10);
y.Value := Random(0,10);
+ count += 1;
+ sb.Text := 'Количество вычислений: ' + count;
+ end;
+
+ Button('Очистить').Click := () -> begin
+ count := 0;
+ sb.Text := 'Количество вычислений: ' + count;
+ tb.Clear;
end;
cb.SelectionChanged := procedure -> begin
- b.Text := cb.SelectedString
+ b.Text := cb.SelectedText
end;
end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/WPFObjects/StartStopMoveRotation.pas b/InstallerSamples/Graphics/WPFObjects/StartStopMoveRotation.pas
new file mode 100644
index 000000000..0b0a911d6
--- /dev/null
+++ b/InstallerSamples/Graphics/WPFObjects/StartStopMoveRotation.pas
@@ -0,0 +1,32 @@
+// Модуль Controls - StatusBar
+uses Controls,WPFObjects;
+
+// Управление свойствами объекта, связанными с перемещением и поворотом.
+// В OnDrawFrame объект сам себя перерисовывает
+begin
+ Window.Title := 'Модуль Controls - StatusBar';
+ var l := LeftPanel(180,Colors.Orange);
+
+ var c := new RectangleWPF(50,200,80,50,Colors.Green);
+ c.Direction := (1,0);
+ c.Velocity := 0;
+ c.Tag := 0; // скорость поворота
+
+ OnDrawFrame := dt -> begin
+ c.MoveTime(dt);
+ c.RotateAngle += integer(c.Tag) * dt;
+ end;
+
+ Button('Начать перемещение').Click := procedure -> begin
+ c.Velocity := 30;
+ end;
+ Button('Закончить перемещение').Click := procedure -> begin
+ c.Velocity := 0;
+ end;
+ Button('Начать поворот').Click := procedure -> begin
+ c.Tag := 30;
+ end;
+ Button('Закончить поворот').Click := procedure -> begin
+ c.Tag := 0;
+ end;
+end.
\ No newline at end of file
diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
index dc4ffd6fb..f5922af35 100644
--- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs
+++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
@@ -10583,6 +10583,8 @@ namespace PascalABCCompiler.TreeConverter
foreach (SyntaxTree.expression expr in cv.conditions.expressions)
{
expression_node cn = convert_strong(expr);
+ if (cn.type == SystemLibrary.SystemLibrary.char_type)
+ cn = convertion_data_and_alghoritms.convert_type(cn, SystemLibrary.SystemLibrary.string_type);
if (cn.type != SystemLibrary.SystemLibrary.string_type)
AddError(new CanNotConvertTypes(cn, cn.type, SystemLibrary.SystemLibrary.string_type, cn.location));
string_const_node scn = convert_string_const_to_switch(cn, cn.location);
diff --git a/bin/Lib/WPFObjects.pas b/bin/Lib/WPFObjects.pas
index ad729e806..f8d46bbfa 100644
--- a/bin/Lib/WPFObjects.pas
+++ b/bin/Lib/WPFObjects.pas
@@ -404,6 +404,8 @@ type
begin
Result := (Left < 0) or (Top < 0) or (Right > GraphWindow.Width) or (Bottom > GraphWindow.Height);
end;
+ /// Tag хранит любые присоединённые характеристики объекта
+ auto property Tag: object;
end;
// -----------------------------------------------------
From d333587d46a8ab7451cafa89d3ecd13e546a10d0 Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Sat, 1 Aug 2020 16:04:54 +0300
Subject: [PATCH 08/18] fix #2287
---
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 ++--
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
TestSuite/CompilationSamples/WPFObjects.pas | 2 ++
TestSuite/opImplicit.pas | 9 +++++++++
TreeConverter/TreeRealization/generics.cs | 1 +
7 files changed, 17 insertions(+), 5 deletions(-)
create mode 100644 TestSuite/opImplicit.pas
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 035a1024b..1724cf8b7 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2607";
+ public const string Revision = "2608";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 67621ca1f..18fb2f30a 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%MINOR%=6
-%REVISION%=2607
%COREVERSION%=3
+%REVISION%=2608
+%MINOR%=6
%MAJOR%=3
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 25a575f1f..e99562a0e 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2607
+3.6.3.2608
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 9511fd679..7c175e287 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2607'
+!define VERSION '3.6.3.2608'
diff --git a/TestSuite/CompilationSamples/WPFObjects.pas b/TestSuite/CompilationSamples/WPFObjects.pas
index ad729e806..f8d46bbfa 100644
--- a/TestSuite/CompilationSamples/WPFObjects.pas
+++ b/TestSuite/CompilationSamples/WPFObjects.pas
@@ -404,6 +404,8 @@ type
begin
Result := (Left < 0) or (Top < 0) or (Right > GraphWindow.Width) or (Bottom > GraphWindow.Height);
end;
+ /// Tag хранит любые присоединённые характеристики объекта
+ auto property Tag: object;
end;
// -----------------------------------------------------
diff --git a/TestSuite/opImplicit.pas b/TestSuite/opImplicit.pas
new file mode 100644
index 000000000..0e140f461
--- /dev/null
+++ b/TestSuite/opImplicit.pas
@@ -0,0 +1,9 @@
+type
+ t1 = class
+ static function operator implicit(o: T): t1 := new t1;
+ end;
+
+begin
+ var a: t1 := 'abcde';
+ Assert(a <> nil);
+end.
\ No newline at end of file
diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs
index cbbd330d8..af23b9f87 100644
--- a/TreeConverter/TreeRealization/generics.cs
+++ b/TreeConverter/TreeRealization/generics.cs
@@ -1629,6 +1629,7 @@ namespace PascalABCCompiler.TreeRealization
{
cmn.return_variable = (orig_fn as common_function_node)?.return_variable;
}
+ cmn.IsOperator = orig_fn.IsOperator;
return cmn;
}
From ec918d645d99715e00e8c4f8117a2599c71c8bd7 Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Sat, 1 Aug 2020 17:49:54 +0300
Subject: [PATCH 09/18] fix #2285
---
TreeConverter/TreeConversion/syntax_tree_visitor.cs | 7 +++++++
bin/Lng/Eng/SemanticErrors_ms.dat | 3 ++-
bin/Lng/Rus/SemanticErrors_ms.dat | 3 ++-
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
index f5922af35..3581e39f8 100644
--- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs
+++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
@@ -16386,6 +16386,13 @@ namespace PascalABCCompiler.TreeConverter
if (_var_def_statement.vars_type != null)
{
tn = convert_strong(_var_def_statement.vars_type);
+
+ if (tn.type_special_kind != SemanticTree.type_special_kind.array_kind &&
+ _var_def_statement.inital_value is SyntaxTree.array_const ac)
+ {
+ AddError(get_location(_var_def_statement), "IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}", tn);
+ }
+
//LambdaHelper.InferTypesFromVarStmt(tn, _var_def_statement.inital_value as SyntaxTree.function_lambda_definition, this); //lroman//
if (tn.IsStatic && _var_def_statement.vars.idents[0].name != YieldHelpers.YieldConsts.Self) // SSM 10/07/19 fix #1639 в статическом классе можно только фиктивное поле с именем YieldHelpers.YieldConsts.Self описать - для того чтобы посмотреть на семантике его тип!!!
AddError(get_location(_var_def_statement), "VARIABLES_OF_STATIC_CLASS_NOT_ALLOWED");
diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat
index a26dee7e7..e39f63f1d 100644
--- a/bin/Lng/Eng/SemanticErrors_ms.dat
+++ b/bin/Lng/Eng/SemanticErrors_ms.dat
@@ -44,4 +44,5 @@ EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Explicit type casts for lamb
STATIC_CLASS_CANNOT_HAVE_PREDEFINITION=Static class cannot be predefined
OPERATIONS_CANNOT_BE_CALLED_USING_THIS_SYNTAX=Operations cannot be called using this syntax
MEMBER_{0}_OF_TYPE_{1}_CANNOT_BE_FOUND_IN_THE_CONTEEXT_OF_FUNCTION_WITH_YIELD=Name {0} cannot be found in type {1} in the context of function with yield statement
-UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Uncomparable types in array initializers
\ No newline at end of file
+UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Uncomparable types in array initializers
+IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}=It is impossible to convert array initializer to type {0}
\ No newline at end of file
diff --git a/bin/Lng/Rus/SemanticErrors_ms.dat b/bin/Lng/Rus/SemanticErrors_ms.dat
index 240fb5f76..4c3f71bbb 100644
--- a/bin/Lng/Rus/SemanticErrors_ms.dat
+++ b/bin/Lng/Rus/SemanticErrors_ms.dat
@@ -44,4 +44,5 @@ EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Явные приведен
STATIC_CLASS_CANNOT_HAVE_PREDEFINITION=Статический класс не может иметь предописание
OPERATIONS_CANNOT_BE_CALLED_USING_THIS_SYNTAX=Операции нельзя вызывать, используя данный синтаксис
MEMBER_{0}_OF_TYPE_{1}_CANNOT_BE_FOUND_IN_THE_CONTEEXT_OF_FUNCTION_WITH_YIELD=Имя {0} не удаётся найти в типе {1} в контексте функции с оператором yield
-UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Несовместимые типы при задании массива
\ No newline at end of file
+UNCOMPARABLE_TYPES_IN_ARRAY_CONST=Несовместимые типы при задании массива
+IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}=Невозможно преобразовать инициализатор массива к типу {0}
\ No newline at end of file
From c0906732a5c7c318f530d5e2db00b7b4db12b337 Mon Sep 17 00:00:00 2001
From: Mikhalkovich Stanislav
Date: Mon, 3 Aug 2020 21:26:25 +0300
Subject: [PATCH 10/18] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?=
=?UTF-8?q?=D0=B2=20Controls=20=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5?=
=?UTF-8?q?=D1=80=D0=B0=D1=85=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?=
=?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?=
=?UTF-8?q?=20=D0=B2=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?=
=?UTF-8?q?=D0=B0=D1=85=20Pyramid=20Prism=20=D0=B2=20Graph3D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Configuration/GlobalAssemblyInfo.cs | 2 +-
Configuration/Version.defs | 4 +-
.../Controls/cc13_Заголовки.pas | 18 +-
.../Graphics/Controls/cc15_ListView.pas | 5 +-
.../Graphics/Controls/cc16a_CountyCapital.pas | 20 +++
.../Graphics/Controls/cc1_All.pas | 3 +-
.../Graphics/Controls/cc24_RGB.pas | 24 +--
.../Graphics/Controls/cc25_Gr3DProperties.pas | 28 +++
.../Graphics/Controls/cc2_All2.pas | 10 +-
.../Graphics/Controls/cc3_All3.pas | 3 +-
Localization/DefaultLang.resources | Bin 95065 -> 95237 bytes
Release/pabcversion.txt | 2 +-
ReleaseGenerators/PascalABCNET_version.nsh | 2 +-
SyntaxTree/tree/NodesBuilder.cs | 14 ++
.../TreeConversion/syntax_tree_visitor.cs | 4 +-
bin/Lib/Controls.pas | 163 +++++++++++++++---
bin/Lib/Graph3D.pas | 40 ++---
bin/Lng/Eng/SemanticErrors_nv.dat | 3 +
bin/Lng/Rus/SemanticErrors_nv.dat | 1 +
19 files changed, 256 insertions(+), 90 deletions(-)
create mode 100644 InstallerSamples/Graphics/Controls/cc16a_CountyCapital.pas
create mode 100644 InstallerSamples/Graphics/Controls/cc25_Gr3DProperties.pas
diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 1724cf8b7..0e9bc1f43 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2608";
+ public const string Revision = "2613";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 18fb2f30a..9c3d8e8a2 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%COREVERSION%=3
-%REVISION%=2608
%MINOR%=6
+%REVISION%=2613
+%COREVERSION%=3
%MAJOR%=3
diff --git a/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas b/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
index d7b704399..965b7b052 100644
--- a/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
+++ b/InstallerSamples/Graphics/Controls/cc13_Заголовки.pas
@@ -17,22 +17,16 @@ begin
lb.AddRange('1 2 3 4 5'.ToWords);
var cb := new ComboBoxWPF('ComboBox');
cb.AddRange('1 2 3 4 5'.ToWords);
+ var sl := new SliderWPF('Slider:');
b.Click := procedure -> begin
if b.Text = 'Заголовки включены' then
b.Text := 'Заголовки выключены'
else b.Text := 'Заголовки включены';
- if tb.Title = '' then
- tb.Title := 'Заголовок'
- else tb.Title := '';
- if ib.Title = '' then
- ib.Title := 'Заголовок'
- else ib.Title := '';
- if lb.Title = '' then
- lb.Title := 'Заголовок'
- else lb.Title := '';
- if cb.Title = '' then
- cb.Title := 'Заголовок'
- else cb.Title := '';
+ tb.TitleVisible := not tb.TitleVisible;
+ ib.TitleVisible := not ib.TitleVisible;
+ lb.TitleVisible := not lb.TitleVisible;
+ cb.TitleVisible := not cb.TitleVisible;
+ sl.TitleVisible := not sl.TitleVisible;
end;
end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc15_ListView.pas b/InstallerSamples/Graphics/Controls/cc15_ListView.pas
index 25bcfe8a8..490f2e1f2 100644
--- a/InstallerSamples/Graphics/Controls/cc15_ListView.pas
+++ b/InstallerSamples/Graphics/Controls/cc15_ListView.pas
@@ -2,10 +2,7 @@
uses Controls,GraphWPF;
type My = auto class
- i,j: integer;
-public
- property Поле1: integer read i;
- property Поле2: integer read j;
+ Поле1,Поле2: integer;
end;
begin
diff --git a/InstallerSamples/Graphics/Controls/cc16a_CountyCapital.pas b/InstallerSamples/Graphics/Controls/cc16a_CountyCapital.pas
new file mode 100644
index 000000000..370190e93
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc16a_CountyCapital.pas
@@ -0,0 +1,20 @@
+uses GraphWPF, Controls, ABCDatabases;
+
+begin
+ Window.Title := 'Столицы стран';
+ LeftPanel(220, Colors.LightGoldenrodYellow);
+ var страны := ЗаполнитьМассивСтран;
+
+ var a := ListBox('Страны',550);
+ a.AddRange(страны.ConvertAll(страна -> страна.Название));
+
+ var d := DictStr;
+ foreach var страна in страны do
+ d[страна.Название] := страна.Столица;
+
+ Font.Size := 70;
+ a.SelectionChanged := procedure -> begin
+ Window.Clear;
+ DrawText(GraphWindow.ClientRect,d[a.SelectedText])
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc1_All.pas b/InstallerSamples/Graphics/Controls/cc1_All.pas
index 9d195f324..6c0692d10 100644
--- a/InstallerSamples/Graphics/Controls/cc1_All.pas
+++ b/InstallerSamples/Graphics/Controls/cc1_All.pas
@@ -23,8 +23,7 @@ begin
var cb := ComboBox('Выпадающий список');
cb.AddRange('Россия','США','Китай','Германия','Франция');
- TextBlock('Слайдер');
- Slider(0,10);
+ Slider('Слайдер:',0,10);
TextBlock('Блок текста');
IntegerBlock('Блок целого:',64);
RealBlock('Блок вещественного:',3.5);
diff --git a/InstallerSamples/Graphics/Controls/cc24_RGB.pas b/InstallerSamples/Graphics/Controls/cc24_RGB.pas
index a76b0b0c0..22d684a07 100644
--- a/InstallerSamples/Graphics/Controls/cc24_RGB.pas
+++ b/InstallerSamples/Graphics/Controls/cc24_RGB.pas
@@ -6,24 +6,16 @@ begin
Font.Size := 40;
LeftPanel(150);
- var rb := IntegerBlock('Красный:');
- rb.Margin := 3;
- var r := Slider(0,255,255,16);
- var gb := IntegerBlock('Зеленый:');
- gb.Margin := 3;
- var g := Slider(0,255,255,16);
- var bb := IntegerBlock('Синий:');
- bb.Margin := 3;
- var b := Slider(0,255,255,16);
+ var r := Slider('Красный: ',0,255,255,16);
+ var g := Slider('Зеленый: ',0,255,255,16);
+ var b := Slider('Синий: ',0,255,255,16);
- Button('Выход').Click := procedure -> Window.Close;
+ Button('Выход').Click := procedure → Window.Close;
- var p: procedure := ()-> begin
- Window.Clear(RGB(r.Value.Round,g.Value.Round,b.Value.Round));
- rb.Value := r.Value.Round;
- gb.Value := g.Value.Round;
- bb.Value := b.Value.Round;
- DrawText(GraphWindow.ClientRect,$'R={rb.Value}, G={gb.Value}, B={bb.Value}');
+ var p: procedure := () → begin
+ var c := RGB(r.Value,g.Value,b.Value);
+ Window.Clear(c);
+ DrawText(GraphWindow.ClientRect,$'R={c.R}, G={c.G}, B={c.B}');
end;
r.ValueChanged := p;
g.ValueChanged := p;
diff --git a/InstallerSamples/Graphics/Controls/cc25_Gr3DProperties.pas b/InstallerSamples/Graphics/Controls/cc25_Gr3DProperties.pas
new file mode 100644
index 000000000..91ee6a624
--- /dev/null
+++ b/InstallerSamples/Graphics/Controls/cc25_Gr3DProperties.pas
@@ -0,0 +1,28 @@
+// Модуль Controls
+uses Graph3D, Controls;
+
+begin
+ var l := LeftPanel(200, Colors.LightGoldenrodYellow);
+
+ var height := IntegerBox('Высота:', 1, 15);
+ height.Value := 5;
+ height.Tooltip := 'Покрутите колёсико мыши';
+ var radius := IntegerBox('Радиус:', 1, 6);
+ radius.Value := 2;
+ radius.Tooltip := 'Покрутите колёсико мыши';
+ var sides := Slider('Количество сторон: ', 3, 20);
+ sides.Frequency := 1;
+ sides.Value := 5;
+
+ var p := Pyramid(Origin, sides.Value, height.Value, radius.Value, Colors.Green);
+
+ height.ValueChanged := procedure -> begin
+ p.Height := height.Value;
+ end;
+ radius.ValueChanged := procedure -> begin
+ p.Radius := radius.Value;
+ end;
+ sides.ValueChanged := procedure -> begin
+ p.Sides := sides.Value;
+ end;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/Graphics/Controls/cc2_All2.pas b/InstallerSamples/Graphics/Controls/cc2_All2.pas
index 58fc3c8de..5b9a62f8d 100644
--- a/InstallerSamples/Graphics/Controls/cc2_All2.pas
+++ b/InstallerSamples/Graphics/Controls/cc2_All2.pas
@@ -23,11 +23,10 @@ begin
var cb0 := ComboBox(x,362,'Выпадающий список',w);
cb0.AddRange('Россия','США','Китай','Германия','Франция');
- TextBlock(x,414,'Слайдер');
- Slider(x,434,0,10,w);
+ Slider(x,414,'Слайдер:',0,10,w);
TextBlock(x,469,'Блок текста',w);
- IntegerBlock(x,488,'Блок целого:',w,64);
- RealBlock(x,507,'Блок вещественного:',w,3.5);
+ IntegerBlock(x,497,'Блок целого:',w,64);
+ RealBlock(x,526,'Блок вещественного:',w,3.5);
LeftPanel(160,Colors.Orange);
@@ -48,8 +47,7 @@ begin
var cb := ComboBox('Выпадающий список');
cb.AddRange('Россия','США','Китай','Германия','Франция');
- TextBlock('Слайдер');
- Slider(0,10);
+ Slider('Слайдер:',0,10);
TextBlock('Блок текста');
IntegerBlock('Блок целого:',64);
RealBlock('Блок вещественного:',3.5);
diff --git a/InstallerSamples/Graphics/Controls/cc3_All3.pas b/InstallerSamples/Graphics/Controls/cc3_All3.pas
index 04692f327..603bc0c6c 100644
--- a/InstallerSamples/Graphics/Controls/cc3_All3.pas
+++ b/InstallerSamples/Graphics/Controls/cc3_All3.pas
@@ -23,8 +23,7 @@ begin
var cb := new ComboBoxWPF('Выпадающий список');
cb.AddRange('Россия','США','Китай','Германия','Франция');
- new TextBlockWPF('Слайдер');
- new SliderWPF(0,10);
+ new SliderWPF('Слайдер:',0,10);
new TextBlockWPF('Блок текста');
new IntegerBlockWPF('Блок целого:',64);
new RealBlockWPF('Блок вещественного:',3.5);
diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources
index 8fa9e22ca7ddaeb9848375774ee04200ecbb72b4..55686245d872bdef6f376ba62cf80b600d0d242a 100644
GIT binary patch
delta 151
zcmV;I0BHZ&<^_f51(4tZA#<_f@T_7)4uNetYQcqAtQdCJrli{u$2=U_X>GAU7;IqiD
Fk;6DKSXcl6
delta 33
rcmV++0N($F=mpv41(4tZb#k%d@T`;7O%t<8uH^xf1Jn_-hp>LbGGh_F
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index e99562a0e..e7f533f4e 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2608
+3.6.3.2613
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 7c175e287..0f3aeaacc 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2608'
+!define VERSION '3.6.3.2613'
diff --git a/SyntaxTree/tree/NodesBuilder.cs b/SyntaxTree/tree/NodesBuilder.cs
index 99a139d7c..0560d7e0b 100644
--- a/SyntaxTree/tree/NodesBuilder.cs
+++ b/SyntaxTree/tree/NodesBuilder.cs
@@ -215,6 +215,20 @@ namespace PascalABCCompiler.SyntaxTree
}
}
+ // добавление свойств - временно убрал т.к. свойства нельзя передавать как var-параметры
+ // По идее если это делать, то поля переименовывать везде в классе!!!
+ /*for (var i=0; i new ident("f" + x.name.ToLower(), x.source_context)).ToList();
diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
index 3581e39f8..1521e13f5 100644
--- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs
+++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs
@@ -16387,7 +16387,9 @@ namespace PascalABCCompiler.TreeConverter
{
tn = convert_strong(_var_def_statement.vars_type);
- if (tn.type_special_kind != SemanticTree.type_special_kind.array_kind &&
+ if (tn.type_special_kind != SemanticTree.type_special_kind.array_kind &&
+ tn.type_special_kind != SemanticTree.type_special_kind.array_wrapper &&
+ !tn.BaseFullName.StartsWith("System.Tuple") &&
_var_def_statement.inital_value is SyntaxTree.array_const ac)
{
AddError(get_location(_var_def_statement), "IMPOSSIBLE_TO_CONVERT_ARRAY_CONST_TO_{0}", tn);
diff --git a/bin/Lib/Controls.pas b/bin/Lib/Controls.pas
index 108229040..2387f7283 100644
--- a/bin/Lib/Controls.pas
+++ b/bin/Lib/Controls.pas
@@ -24,6 +24,7 @@ type
GPanel = System.Windows.Controls.Panel;
GControl = System.Windows.Controls.Control;
GStatusBar = System.Windows.Controls.Primitives.StatusBar;
+ Orientation = System.Windows.Controls.Orientation;
MessageBox = System.Windows.MessageBox;
MessageBoxButton = System.Windows.MessageBoxButton;
MessageBoxResult = System.Windows.MessageBoxResult;
@@ -181,6 +182,35 @@ type
/// Событие нажатия на элемент управления
Click: procedure;
end;
+
+ StackPanelWPF = class(CommonControlWPF)
+ private
+ property sp: StackPanel read element as StackPanel;
+ procedure CreateP(Orient: Orientation; width,height: real);
+ begin
+ element := new StackPanel;
+ element.Focusable := False;
+ if width>0 then
+ element.Width := width;
+ if height>0 then
+ element.Height := height;
+ sp.Orientation := Orient;
+ __ActivePanelInternal.Children.Add(sp);
+ _ActivePanel := sp;
+ end;
+ procedure SetColorP(c: GColor);
+ begin
+ sp.Background := GetBrush(c);
+ end;
+ function GetColorP := (sp.Background as SolidColorBrush).Color;
+ procedure SetTTP(s: string);
+ begin
+ sp.ToolTip := s;
+ end;
+ public
+ constructor (Orient: Orientation; width: real := 0; height: real := 0) := Invoke(CreateP,Orient,width,height);
+ property Color: GColor read Invoke&(GetColorP) write Invoke(SetColorP, value);
+ end;
/// Элемент управления "Изображение"
ImageWPF = class(CommonControlWPF)
@@ -200,7 +230,6 @@ type
MainDockPanel.children.RemoveAt(MainDockPanel.children.Count-1);
MainDockPanel.children.Add(im);
end;
- private
function GetNameP: string;
begin
Result := (im.Source as BitmapImage).UriSource.AbsolutePath
@@ -386,6 +415,12 @@ type
else tb.Visibility := System.Windows.Visibility.Visible;
tb.Text := t;
end;
+ procedure SetTitleVisibilityP(v: boolean);
+ begin
+ if v then
+ tb.Visibility := System.Windows.Visibility.Visible
+ else tb.Visibility := System.Windows.Visibility.Collapsed;
+ end;
procedure SetHP(h: real) := MainElement.Height := h;
function CreateStackPanel(el: FrameworkElement; title: string): StackPanel;
@@ -418,7 +453,10 @@ type
end;
public
/// Заголовок
- property Title: string read InvokeString(()->tb.Text) write Invoke(SetTitleP, value);
+ property Title: string read InvokeString(()->tb.Text) write Invoke(SetTitleP, value); virtual;
+ /// Видим ли заголовок
+ property TitleVisible: boolean read InvokeBoolean(()->tb.Visibility <> System.Windows.Visibility.Collapsed)
+ write Invoke(SetTitleVisibilityP, value); virtual;
/// Высота элемента управления
property Height: real read InvokeReal(()->MainElement.ActualHeight) write Invoke(SetHP, value); override;
/// Размер шрифта
@@ -605,10 +643,10 @@ type
property Items[i: integer]: string read InvokeString(()->cb.Items[i] as string); default;
end;
- /// Элемент управления "Слайдер"
- SliderWPF = class(CommonControlWPF)
+ SliderBase = class(ControlWithTitleWPF)
private
- function sl: Slider := element as Slider;
+ titl: string; // часть заголовка без числа
+ function sl: Slider := MainElement as Slider;
function GetMinimum: real := InvokeReal(()->sl.Minimum);
procedure SetMinimumP(r: real) := sl.Minimum := r;
procedure SetMinimum(r: real) := Invoke(SetMinimumP, r);
@@ -621,11 +659,18 @@ type
function GetFrequency: real := InvokeReal(()->sl.TickFrequency);
procedure SetFrequencyP(r: real) := sl.TickFrequency := r;
procedure SetFrequency(r: real) := Invoke(SetFrequencyP, r);
- protected
- procedure CreatePXY(x,y: real; min, max, val, freq: real; width: real);
+ private
+ procedure CreatePXY(x,y: real; title: string; min, max, val, freq: real; width: real);
begin
- Init0(new Slider,width,x,y);
- sl.ValueChanged += procedure(o, e) -> ValueChangedP;
+ Init1(new Slider,title,width,x,y);
+ Remainder(title,min, max, val, freq);
+ end;
+ procedure Remainder(tit: string; min, max, val, freq: real);
+ begin
+ titl := tit;
+ sl.ValueChanged += procedure(o, e) -> if ValueChanged <> nil then ValueChanged;
+ sl.ValueChanged += procedure(o, e) -> if title <> '' then tb.Text := Title + ' ' + sl.Value;
+ if titl <> '' then tb.Text := Title + ' ' + sl.Value;
sl.TickPlacement := System.Windows.Controls.Primitives.TickPlacement.BottomRight;
sl.Minimum := min;
sl.Maximum := max;
@@ -634,15 +679,62 @@ type
sl.TickFrequency := (max-min)/10
else sl.TickFrequency := freq;
sl.Foreground := Brushes.Black;
+ sl.IsSnapToTickEnabled := True;
+ end;
+ procedure CreateP(title: string; min, max, val, freq: real) := CreatePXY(-1, -1, title, min, max, val, freq, 0);
+ procedure SetTitleP1(tit: string);
+ begin
+ titl := tit;
+ SetTitleP(tit +' ' + sl.Value);
end;
- procedure CreateP(min, max, val, freq: real) := CreatePXY(-1,-1,min, max, val, freq, 0);
-
- procedure ValueChangedP := if ValueChanged <> nil then ValueChanged;
public
/// Событие, возникающее при изменении значения
ValueChanged: procedure;
- constructor Create(min, max: real; val: real := real.MinValue; freq: real := 0) := Invoke(CreateP, min, max, val, freq);
- constructor Create(x,y: real; min, max: real; width: real; val: real := real.MinValue; freq: real := 0) := Invoke(CreatePXY, x,y,min, max, val, freq, width);
+ /// Заголовок
+ property Title: string read InvokeString(()->titl) write Invoke(SetTitleP1, value); override;
+ end;
+
+ /// Элемент управления "Слайдер" с целыми значениями
+ SliderWPF = class(SliderBase)
+ private
+ procedure CreatePXYI(x,y: real; title: string; min, max, val, freq: integer; width: integer);
+ begin
+ Init1(new Slider,title,width,x,y);
+ if freq<=0 then
+ freq := (max-min) div 10;
+ if freq = 0 then
+ freq := 1;
+ Remainder(title,min, max, val, freq);
+ end;
+ procedure CreatePI(title: string; min, max, val, freq: integer) := CreatePXYI(-1, -1, title, min, max, val, freq, 0);
+ public
+ constructor Create(min, max: integer; val: integer := integer.MinValue; freq: integer := 0)
+ := Invoke(CreatePI, '', min, max, val, freq);
+ constructor Create(title: string := '');
+ begin
+ Create(title, 0, 10, 0);
+ end;
+ constructor Create(title: string; min, max: integer; val: integer := integer.MinValue; freq: integer := 0)
+ := Invoke(CreatePI, title, min, max, val, freq);
+ constructor Create(x,y: real; title: string; min, max: integer; width: integer; val: integer := integer.MinValue; freq: integer := 0)
+ := Invoke(CreatePXYI, x,y,title,min, max, val, freq, width);
+ /// Минимальное значение
+ property Minimum: integer read GetMinimum.Round write SetMinimum(value);
+ /// Максимальное значение
+ property Maximum: integer read GetMaximum.Round write SetMaximum(value);
+ /// Текущее значение
+ property Value: integer read GetValue.Round write SetValue(value);
+ /// Интервал между делениями
+ property Frequency: integer read GetFrequency.Round write SetFrequency(value);
+ end;
+
+ /// Элемент управления "Слайдер" с вещественными значениями
+ SliderRealWPF = class(SliderBase)
+ public
+ constructor Create(min, max: real; val: real := real.MinValue; freq: real := 0) := Invoke(CreateP, '', min, max, val, freq);
+ constructor Create(title: string := '') := Create(title, 0, 10, 0);
+ constructor Create(title: string; min, max: real; val: real := real.MinValue; freq: real := 0) := Invoke(CreateP, title, min, max, val, freq);
+ constructor Create(x,y: real; title: string; min, max: real; width: real; val: real := real.MinValue; freq: real := 0) := Invoke(CreatePXY, x,y,title,min, max, val, freq, width);
/// Минимальное значение
property Minimum: real read GetMinimum write SetMinimum;
/// Максимальное значение
@@ -1029,12 +1121,23 @@ function ListBox(title: string := ''; height: real := 150): ListBoxWPF;
/// Элемент управления "Список" с заданными координатами
function ListBox(x,y: real; title: string := ''; width: real := 150; height: real := 150): ListBoxWPF;
+/// Элемент управления "Слайдер с вещественными значениями"
+function SliderReal(title: string := ''): SliderRealWPF;
+/// Элемент управления "Слайдер с вещественными значениями" с заданным диапазоном значений и заголовком
+function SliderReal(title: string; min,max: real; val: real := real.MinValue; freq: real := 0): SliderRealWPF;
+/// Элемент управления "Слайдер с вещественными значениями" с заданным диапазоном значений
+function SliderReal(min, max: real; val: real := real.MaxValue; freq: real := 0): SliderRealWPF;
+/// Элемент управления "Слайдер с вещественными значениями" с заданными координатами
+function SliderReal(x,y: real; title: string; min,max: real; width: real; val: real := real.MinValue; freq: real := 0): SliderRealWPF;
+
/// Элемент управления "Слайдер"
-function Slider(): SliderWPF;
+function Slider(title: string := ''): SliderWPF;
+/// Элемент управления "Слайдер" с заданным диапазоном значений и заголовком
+function Slider(title: string; min,max: integer; val: integer := integer.MinValue; freq: integer := 0): SliderWPF;
/// Элемент управления "Слайдер" с заданным диапазоном значений
-function Slider(min,max: real; val: real := real.MinValue; freq: real := 0): SliderWPF;
+function Slider(min, max: integer; val: integer := integer.MinValue; freq: integer := 0): SliderWPF;
/// Элемент управления "Слайдер" с заданными координатами
-function Slider(x,y: real; min,max: real; width: real; val: real := real.MinValue; freq: real := 0): SliderWPF;
+function Slider(x,y: real; title: string; min,max: integer; width: integer; val: integer := integer.MinValue; freq: integer := 0): SliderWPF;
/// Элемент управления "Изображение"
function Image(name: string): ImageWPF;
@@ -1111,18 +1214,34 @@ function IntegerBox(x, y: real; title: string; min,max: integer; width: real) :=
function ListBox(title: string; height: real): ListBoxWPF := ListBoxWPF.Create(title,height);
function ListBox(x,y: real; title: string; width: real; height: real): ListBoxWPF := ListBoxWPF.Create(x,y,title,width,height);
-function Slider: SliderWPF := SliderWPF.Create(0, 10, 0, 0);
-function Slider(min, max, val, freq: real): SliderWPF;
+function SliderReal(title: string): SliderRealWPF := SliderRealWPF.Create(title,0, 10, 0, 0);
+function SliderReal(title: string; min, max, val, freq: real): SliderRealWPF;
begin
if val = real.MinValue then
val := min;
- Result := SliderWPF.Create(min, max, val, freq);
+ Result := SliderRealWPF.Create(title, min, max, val, freq);
+end;
+function SliderReal(min, max, val, freq: real): SliderRealWPF := SliderReal('',min, max, val, freq);
+function SliderReal(x,y: real; title: string; min,max,width,val,freq: real): SliderRealWPF;
+begin
+ if val = real.MinValue then
+ val := min;
+ Result := SliderRealWPF.Create(x, y, title, min, max, width, val, freq);
end;
-function Slider(x,y,min,max,width,val,freq: real): SliderWPF;
+
+function Slider(title: string): SliderWPF := SliderWPF.Create(title);
+function Slider(title: string; min, max, val, freq: integer): SliderWPF;
begin
if val = real.MinValue then
val := min;
- Result := SliderWPF.Create(x, y, min, max, width, val, freq);
+ Result := SliderWPF.Create(title, min, max, val, freq);
+end;
+function Slider(min, max, val, freq: integer): SliderWPF := Slider('',min, max, val, freq);
+function Slider(x,y: real; title: string; min,max,width,val,freq: integer): SliderWPF;
+begin
+ if val = real.MinValue then
+ val := min;
+ Result := SliderWPF.Create(x, y, title, min, max, width, val, freq);
end;
function Image(name: string): ImageWPF := new ImageWPF(name);
diff --git a/bin/Lib/Graph3D.pas b/bin/Lib/Graph3D.pas
index bc33b6b0a..9ab008773 100644
--- a/bin/Lib/Graph3D.pas
+++ b/bin/Lib/Graph3D.pas
@@ -2206,15 +2206,15 @@ type
procedure SetN(n: integer);
function GetN: integer;
protected
- function CreateObject: Object3D; override := new PrismT(X, Y, Z, N, Radius, Height, Material.Clone);
+ function CreateObject: Object3D; override := new PrismT(X, Y, Z, Sides, Radius, Height, Material.Clone);
public
constructor(x, y, z: real; N: integer; r, h: real; m: Gmaterial);
/// Радиус правильной призмы
property Radius: real read GetR write SetR;
/// Высота правильной призмы
property Height: real read GetH write SetH;
-/// Количество углов правильной призмы
- property N: integer read GetN write SetN;
+/// Количество боковых граней правильной призмы
+ property Sides: integer read GetN write SetN;
/// Возвращает клон правильной призмы
function Clone := (inherited Clone) as PrismT;
end;
@@ -2226,15 +2226,15 @@ type
PyramidT = class(PrismT)
private
protected
- function CreateObject: Object3D; override := new PyramidT(X, Y, Z, N, Radius, Height, Material.Clone);
+ function CreateObject: Object3D; override := new PyramidT(X, Y, Z, Sides, Radius, Height, Material.Clone);
public
constructor(x, y, z: real; N: integer; r, h: real; m: GMaterial);
/// Радиус правильной пирамиды
property Radius: real read GetR write SetR;
/// Высота правильной пирамиды
property Height: real read GetH write SetH;
-/// Количество углов правильной пирамиды
- property N: integer read GetN write SetN;
+/// Количество боковых граней правильной пирамиды
+ property Sides: integer read GetN write SetN;
/// Возвращает клон правильной пирамиды
function Clone := (inherited Clone) as PyramidT;
end;
@@ -2288,8 +2288,8 @@ type
begin
var pc := new Point3DCollection;
- var a := PartitionPoints(0, 2 * Pi, N).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).ToArray;
- var b := PartitionPoints(0, 2 * Pi, N).Select(x -> P3D(fr * cos(x), fr * sin(x), fh)).ToArray;
+ var a := PartitionPoints(0, 2 * Pi, Sides).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).ToArray;
+ var b := PartitionPoints(0, 2 * Pi, Sides).Select(x -> P3D(fr * cos(x), fr * sin(x), fh)).ToArray;
for var i := 0 to a.High - 1 do
begin
pc.Add(a[i]);
@@ -2320,12 +2320,12 @@ type
end;
protected
- function CreateObject: Object3D; override := new PrismTWireframe(X, Y, Z, N, Radius, Height, (model as LinesVisual3D).Thickness, (model as LinesVisual3D).Color);
+ function CreateObject: Object3D; override := new PrismTWireframe(X, Y, Z, Sides, Radius, Height, (model as LinesVisual3D).Thickness, (model as LinesVisual3D).Color);
public
function Points: Point3DCollection; virtual;
begin
- var a := PartitionPoints(0, 2 * Pi, N).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).SkipLast;
- var b := PartitionPoints(0, 2 * Pi, N).Select(x -> P3D(fr * cos(x), fr * sin(x), fh)).SkipLast;
+ var a := PartitionPoints(0, 2 * Pi, Sides).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).SkipLast;
+ var b := PartitionPoints(0, 2 * Pi, Sides).Select(x -> P3D(fr * cos(x), fr * sin(x), fh)).SkipLast;
var pc := new Point3DCollection(a + b);
Result := pc;
@@ -2338,8 +2338,8 @@ type
property Radius: real read fr write SetR;
/// Высота проволочной правильной призмы
property Height: real read fh write SetH;
-/// Количество углов проволочной правильной призмы
- property N: integer read fn write SetN;
+/// Количество боковых граней проволочной правильной призмы
+ property Sides: integer read fn write SetN;
/// Цвет проволоки правильной призмы
property Color: GColor read GetC write SetC; override;
/// Толщина проволоки правильной призмы
@@ -2352,13 +2352,13 @@ type
/// Класс проволочной правильной пирамиды
PyramidTWireframe = class(PrismTWireframe)
protected
- function CreateObject: Object3D; override := new PyramidTWireframe(X, Y, Z, N, Radius, Height, (model as LinesVisual3D).Thickness, (model as LinesVisual3D).Color);
+ function CreateObject: Object3D; override := new PyramidTWireframe(X, Y, Z, Sides, Radius, Height, (model as LinesVisual3D).Thickness, (model as LinesVisual3D).Color);
private
function CreatePoints: Point3DCollection; override;
begin
var pc := new Point3DCollection;
- var a := PartitionPoints(0, 2 * Pi, N).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).ToArray;
+ var a := PartitionPoints(0, 2 * Pi, Sides).Select(x -> P3D(fr * cos(x), fr * sin(x), 0)).ToArray;
var b := P3D(0, 0, fh);
for var i := 0 to a.High - 1 do
begin
@@ -2377,8 +2377,8 @@ type
property Radius: real read fr write SetR;
/// Высота проволочной правильной пирамиды
property Height: real read fh write SetH;
-/// Количество углов проволочной правильной пирамиды
- property N: integer read fn write SetN;
+/// Количество боковых граней проволочной правильной пирамиды
+ property Sides: integer read fn write SetN;
/// Цвет проволоки правильной пирамиды
property Color: GColor read GetC write SetC; override;
/// Толщина проволоки правильной пирамиды
@@ -3373,15 +3373,15 @@ function FileModel3D(p: Point3D; fname: string; m: Material): FileModelT := File
function Prism(x, y, z: real; Sides: integer; Height, Radius: real; m: Material): PrismT := Inv(()->PrismT.Create(x, y, z, Sides, Radius, Height, m));
-function Prism(p: Point3D; Sides: integer; Height, Radius: real; m: Material): PrismT := Prism(p.X, p.Y, p.Z, Sides, Radius, Height, m);
+function Prism(p: Point3D; Sides: integer; Height, Radius: real; m: Material): PrismT := Prism(p.X, p.Y, p.Z, Sides, Height, Radius, m);
function PrismWireFrame(x, y, z: real; Sides: integer; Height, Radius: real; Thickness: real; c: Color): PrismTWireFrame := Inv(()->PrismTWireFrame.Create(x, y, z, Sides, Radius, Height, thickness, c));
-function PrismWireFrame(p: Point3D; Sides: integer; Height, Radius: real; Thickness: real; c: Color): PrismTWireFrame := PrismWireFrame(p.x, p.y, p.z, Sides, Radius, Height, thickness, c);
+function PrismWireFrame(p: Point3D; Sides: integer; Height, Radius: real; Thickness: real; c: Color): PrismTWireFrame := PrismWireFrame(p.x, p.y, p.z, Sides, Height, Radius, thickness, c);
function Pyramid(x, y, z: real; Sides: integer; Height, Radius: real; m: Material): PyramidT := Inv(()->PyramidT.Create(x, y, z, Sides, Radius, Height, m));
-function Pyramid(p: Point3D; Sides: integer; Height, Radius: real; m: Material): PyramidT := Pyramid(p.X, p.Y, p.Z, Sides, Radius, Height, m);
+function Pyramid(p: Point3D; Sides: integer; Height, Radius: real; m: Material): PyramidT := Pyramid(p.X, p.Y, p.Z, Sides, Height, Radius, m);
function PyramidWireFrame(x, y, z: real; Sides: integer; Height, Radius: real; Thickness: real; c: Color): PyramidTWireFrame := Inv(()->PyramidTWireFrame.Create(x, y, z, Sides, Radius, Height, thickness, c));
diff --git a/bin/Lng/Eng/SemanticErrors_nv.dat b/bin/Lng/Eng/SemanticErrors_nv.dat
index 3fda3ed18..658b656ab 100644
--- a/bin/Lng/Eng/SemanticErrors_nv.dat
+++ b/bin/Lng/Eng/SemanticErrors_nv.dat
@@ -3,6 +3,9 @@
NAME_CANNOT_HAVE_GENERIC_PARAMETERS_{0}=Name {0} can not have generic parameters
AUTO_CLASS_MUST_NOT_HAVE_POINTERS=Auto class can not have fields of pointer type
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Auto class can not have parents
+AUTO_CLASS_MUST_NOT_HAVE_UNNAMED_ENUMS=Auto class can not have fields with unnamed enums type
+AUTO_CLASS_MUST_NOT_HAVE_EVENTS=Auto class can not have events
+AUTO_CLASS_MUST_NOT_HAVE_PROPERTIES=Auto class can not have properties
UNDEFINED_NAME_REFERENCE_{0}=Undefined name reference '{0}'
TWO_TYPE_CONVERTIONS_POSSIBLE_FIRST_TYPE_{0}_SECOND_TYE_{1}=Two type of convertions are possible: to type '{0}' and to type '{1}'
CAN_NOT_CONVERT_TYPES_FROM_{0}_TO_{1}=Incompatible types: '{0}' and '{1}'
diff --git a/bin/Lng/Rus/SemanticErrors_nv.dat b/bin/Lng/Rus/SemanticErrors_nv.dat
index 11093f963..5eb1601a8 100644
--- a/bin/Lng/Rus/SemanticErrors_nv.dat
+++ b/bin/Lng/Rus/SemanticErrors_nv.dat
@@ -5,6 +5,7 @@ AUTO_CLASS_MUST_NOT_HAVE_POINTERS=Авто класс не может иметь
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Авто класс не может иметь предков
AUTO_CLASS_MUST_NOT_HAVE_UNNAMED_ENUMS=Авто класс не может иметь полей с неименованными перечислимыми типами
AUTO_CLASS_MUST_NOT_HAVE_EVENTS=Авто класс не может иметь поля, являющиеся событиями
+AUTO_CLASS_MUST_NOT_HAVE_PROPERTIES=Авто класс не может иметь свойства
UNDEFINED_NAME_REFERENCE_{0}=Неизвестное имя '{0}'
TWO_TYPE_CONVERTIONS_POSSIBLE_FIRST_TYPE_{0}_SECOND_TYE_{1}=Возможны два преобразования типа: к типу {0} и к типу {1}
CAN_NOT_CONVERT_TYPES_FROM_{0}_TO_{1}=Нельзя преобразовать тип {0} к {1}
From 077950e5ebb177f45895cfcabc61a96097b5c211 Mon Sep 17 00:00:00 2001
From: SunSerega
Date: Tue, 4 Aug 2020 02:26:50 +0300
Subject: [PATCH 11/18] update OpenCLABC
---
.../OpenGL и OpenCL/OpenCL/MatrMlt.cl | 6 +-
.../OpenGL и OpenCL/OpenCL/MatrMlt.pas | 15 +-
.../OpenCL/SimpleAddition.pas | 15 +-
.../MatrMlt.cl | 6 +-
.../MatrMlt.pas | 20 +-
.../SimpleAddition.pas | 11 +-
.../OpenCLABC/Wait очереди/2.pas | 20 +-
.../0.cl | 11 +
.../Использовать.pas | 24 +
.../Прекомпилировать.pas | 8 +
...ользованию OpenGL и OpenCL.html | 87 +-
.../Справка OpenCLABC.html | 919 +-
.../Справка OpenGLABC.html | 27 +-
ReleaseGenerators/sect_Core.nsh | 9 +-
bin/Lib/Internal/OpenCLABCBase.pas | 7679 +++++++++++++++++
bin/Lib/Internal/OpenGLABCBase.pas | 4 +
bin/Lib/OpenCL.pas | 1330 ++-
bin/Lib/OpenCLABC.pas | 4089 +--------
bin/Lib/OpenGL.pas | 3326 ++++---
bin/Lib/OpenGLABC.pas | 4 +-
20 files changed, 11624 insertions(+), 5986 deletions(-)
create mode 100644 InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl
create mode 100644 InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas
create mode 100644 InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas
create mode 100644 bin/Lib/Internal/OpenCLABCBase.pas
create mode 100644 bin/Lib/Internal/OpenGLABCBase.pas
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl b/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl
index 4d0836be0..1481c2b62 100644
--- a/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCL/MatrMlt.cl
@@ -1,11 +1,10 @@
-__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, __global int* gW)
+__kernel void MatrMltMatr(__global double* A, __global double* B, __global double* C, int W)
{
int cX = get_global_id(0);
int cY = get_global_id(1);
- int W = *gW;
double sum = 0.0;
for (int i=0; i,
- B.NewQueue.AddWriteArray(B_Mart) as CommandQueue,
+ A.NewQueue.AddWriteArray2&(A_Matr),
+ B.NewQueue.AddWriteArray2&(B_Mart),
C,
- N.NewQueue.AddWriteValue(MatrW) as CommandQueue
+ W
) as CommandQueue;
var Otp_C_Q :=
- C.NewQueue.AddReadArray(A_Matr) as CommandQueue +
+ C.NewQueue.AddReadArray2&(A_Matr) +
HPQ(()->
lock output do
begin
@@ -74,13 +74,13 @@ begin
var Calc_V2_Q :=
code['MatrMltVec'].NewQueue.AddExec1(MatrW,
C,
- V1.NewQueue.AddWriteArray(V1_Arr) as CommandQueue,
+ V1.NewQueue.AddWriteArray1&(V1_Arr),
V2,
- N // значение записывается в Calc_C_Q, тут можно использовать уже готовое
+ W
) as CommandQueue;
var Otp_V2_Q :=
- V2.NewQueue.AddReadArray(V1_Arr) as CommandQueue +
+ V2.NewQueue.AddReadArray1&(V1_Arr) +
HPQ(()->
lock output do
begin
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas
index b7816a2c6..500a05763 100644
--- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/0Простейшие примеры/SimpleAddition.pas
@@ -4,23 +4,24 @@ begin
// Чтение и компиляция .cl файла
- var prog := new ProgramCode(ReadAllText('SimpleAddition.cl'));
+ var prog := new ProgramCode(Context.Default, ReadAllText('SimpleAddition.cl'));
// Подготовка параметров
- var A := new Buffer( 10 * sizeof(integer) ); // Буфер достаточно размера, чтоб хранить 10 элементов типа "integer"
+ var A := new Buffer( 10 * sizeof(integer) ); // Буфер достаточного размера, чтобы хранить 10 элементов типа "integer"
// Выполнение
prog['TEST'].Exec1(10, // используем 10 ядер
- A.NewQueue.AddFillValue(1) // заполняем весь буфер значениями (1), прямо перед выполнением. Тип значения integer, потому что это тип по-умолчанию для целых чисел
- as CommandQueue //ToDo нужно только из за issue компилятора #1981, иначе получаем странную ошибку. Когда исправят - можно будет убрать
+ // Заполняем весь буфер значениями (1), прямо перед выполнением
+ // Тип значения integer, потому что это тип по-умолчанию для целых чисел
+ A.NewQueue.AddFillValue(1)
);
// Чтение и вывод результата
- A.GetArray1&.Println; // читаем всё содержимое как одномерный массив с элементами типа "integer"
+ A.GetArray1&.Println; // Читаем всё содержимое как одномерный массив с элементами типа "integer"
end.
\ No newline at end of file
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas
index 91b799f6e..b498002f8 100644
--- a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Wait очереди/2.pas
@@ -4,24 +4,28 @@ uses NamedQData;
begin
// График выполнения очередей:
//
- // A1--B1--C1------D1
+ // A1--B1--C1------E1
// \ /
// \ /
- // A2------B2--C2--D2
+ // A2------C2--D2--E2
//
var A1 := NamedQ('A1');
- var B1 := NamedQ('B1');
- var C1 := NamedQ('C1');
- var D1 := NamedQ('D1');
var A2 := NamedQ('A2');
- var B2 := NamedQ('B2');
+
+ var B1 := NamedQ('B1');
+
+ var C1 := NamedQ('C1');
var C2 := NamedQ('C2');
+
var D2 := NamedQ('D2');
+ var E1 := NamedQ('E1');
+ var E2 := NamedQ('E2');
+
Context.Default.SyncInvoke(
- ( A1 + B1 + C1 + WaitFor(C2) + D1 ) *
- ( A2 + WaitFor(B1) + B2 + C2 + D2 )
+ ( A1 + B1 + C1 + WaitFor(D2) + E1 ) *
+ ( A2 + WaitFor(B1) + C2 + D2 + E2 )
);
end.
\ No newline at end of file
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl
new file mode 100644
index 000000000..938330885
--- /dev/null
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/0.cl
@@ -0,0 +1,11 @@
+
+
+
+__kernel void TEST(__global int* message)
+{
+ int gid = get_global_id(0); // номер текущего вызова TEST
+
+ message[gid] += gid;
+}
+
+
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas
new file mode 100644
index 000000000..006c47b33
--- /dev/null
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Использовать.pas
@@ -0,0 +1,24 @@
+uses OpenCLABC;
+
+begin
+
+ // Запустите "Прекомпилировать.pas", чтобы создать этот файл
+ {$resource 0.cl.temp_bin}
+
+ var prog := ProgramCode.DeserializeFrom(Context.Default,
+ System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream('0.cl.temp_bin')
+ );
+
+ // Дальше всё так же как в "0Простейшие примеры\SimpleAddition"
+
+ var A := new Buffer( 10 * sizeof(integer) );
+
+ prog['TEST'].Exec1(10,
+
+ A.NewQueue.AddFillValue(1)
+
+ );
+
+ A.GetArray1&.Println;
+
+end.
\ No newline at end of file
diff --git a/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas
new file mode 100644
index 000000000..bd770ff96
--- /dev/null
+++ b/InstallerSamples/OpenGL и OpenCL/OpenCLABC/Прекомпиляция ProgramCode/Прекомпилировать.pas
@@ -0,0 +1,8 @@
+uses OpenCLABC;
+
+begin
+ var prog := new ProgramCode(Context.Default, ReadAllText('0.cl'));
+ var f := System.IO.File.Create('0.cl.temp_bin');
+ prog.SerializeTo(f);
+ f.Close;
+end.
\ No newline at end of file
diff --git a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html
index b6edac128..d4f0bb17f 100644
--- a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html
+++ b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html
@@ -71,13 +71,27 @@ body {
}
.ps-page-name {
cursor: pointer;
- padding: 1;
+ padding: 1;
}
/* ============================== *\
page display
\* ============================== */
+blockquote > *:first-child {
+ margin-top: 0;
+}
+blockquote > *:last-child {
+ margin-bottom: 0;
+}
+blockquote {
+ margin-left: 0;
+ margin-right: 0;
+ padding: 12px;
+ border-left: 5px solid #d0d0d0;
+ background-color: #f7f7f7;
+}
+
.smart-link {
color: blue;
cursor: pointer;
@@ -99,7 +113,6 @@ body {
.code-block {
display: inline-block;
cursor: text;
- background: #F0F0F0;
border-radius: 3px;
padding: 4px;
@@ -121,9 +134,13 @@ body {
box-shadow: -2px 2px 3px #0000004a;
background: linear-gradient(0deg, #f0f0f0, white);
}
-.inline-code {
+.inline-code, .code-block {
background: #F0F0F0;
}
+blockquote .inline-code,
+blockquote .code-block {
+ background: #DEDEDE;
+}
.code-keyword {
font-weight: bold;
@@ -903,7 +920,8 @@ window.onload = ()=>{
Если в кратце:
Есть платформа .Net, объединяющая много языков программирования. В том числе C# и PascalABC.NET.
.exe и .dll созданные такими языками содержат код в особом виде, позволяющем легко подключать
-.dll (и теоретически .exe, но это плохо) созданные на 1 .Net языке к программе на любом другом .Net языке.
+.dll (и теоретически .exe, но это плохо) созданные на 1 .Net языке к программе на любом другом .Net языке.
+(в паскале это делается с помощью $reference)
Такие .exe и .dll называются управляемыми. .exe и .dll созданные на любом другом (то есть не .Net) языке называются неуправляемыми.
OpenCL.dll и OpenGL.dll созданы на- и для языков C/C++, поэтому являются неуправляемыми.
@@ -911,7 +929,7 @@ window.onload = ()=>{
Большинство функций из н.у. модулей требует какой-либо чистки. В основном потому что
при переводе с C++ тип int* может оказаться и указателем, и var-параметром, и массивом.
-
При автоматическом переводе кода с C++ на паскаль - создаются все возможные перегркзки.
+
При автоматическом переводе кода с C++ на паскаль - создаются все возможные перегрузки.
А те перегрузки, которые не подходят конкретным подпрограммам - надо убирать вручную.
В этом и состоит чистка подпрограмм.
Все разом функции не почистишь, в одном только OpenGL их >3000. Но сделать это, всё же, надо.
@@ -920,9 +938,9 @@ window.onload = ()=>{
Чтоб чистить подпрограммы было проще - я написал несколько инструментов.
Вся упаковка н.у. модулей находится тут.
-Откройте папку CL или GL. Они устроены одинаково, поэтому объяснять можно на любой из них.
-
Все файлы (кроме .exe и .pdb, которые создаёт паскаль) в этих папках
-открываются любым текстовым редактором (но я рекомендую Notepad++).
+Откройте папку
OpenCL или
OpenGL. Они устроены одинаково, поэтому объяснять можно на любой из них.
+
Все файлы (кроме .exe и .pdb, которые создаёт паскаль) в
+этих папках открываются любым текстовым редактором.
Fixers
Контроль содержимого модуля находится в папке Fixers. В этой папке есть следующие подпапки:
@@ -985,6 +1003,7 @@ window.onload = ()=>{
public constructor(val: UInt32) := self.val := val;
public static property Zero: BufferName read default(BufferName);
public static property Size: integer read Marshal.SizeOf&<UInt32>;
+ public function ToString: string; override := $'BufferName[{val}]';
end;
Такой подход не замедляет готовую программу, но позволяет отловить некоторые ошибки на этапе компиляции.
@@ -1020,7 +1039,7 @@ MyProc(default(BufferName));
-
Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum's).
+
Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).
Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.
В качестве примера:
procedure gl.BeginQuery(target: QueryTarget; id: QueryName);
@@ -1068,8 +1087,8 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
procedure gl.Clear(mask: ClearBufferMask);
gl.Clear(
- ClearBufferMask.COLOR_BUFFER_BIT or // очистка поверхности рисования одним цветом
- ClearBufferMask.DEPTH_BUFFER_BIT // очистка буфера глубины - обязательна при рисовании 3D
+ ClearBufferMask.COLOR_BUFFER_BIT or // очистка поверхности рисования одним цветом
+ ClearBufferMask.DEPTH_BUFFER_BIT // очистка буфера глубины - обязательна при рисовании 3D
);
or, в данном случае, побитовое, а не логическое.
@@ -1155,7 +1174,7 @@ glDebugOutputAMD.DebugMessageEnableAMD(...);
Каждый тип вектора берёт по 1 из значений, перечисленных в [], через запятую.
К примеру, есть типы Vec2d и Vec4ui64.
Число в первых скобках - значит кол-во измерений вектора.
-
Буква (буквы) в следующих скобках - значит тип координат вектора:
+
Буква (буквы) в следующих скобках - значат тип координат вектора:
b=shortint, s=smallint, i=integer, i64=int64: Все 4 типа - целые числа, имеющие бит знака (±) и занимающие 1, 2, 4 и 8 байт соответственно;
@@ -1171,9 +1190,9 @@ glDebugOutputAMD.DebugMessageEnableAMD(...);
и возвращает или задаёт значение вектора для соответствующего измерения.
К примеру:
var v: Vec4d;
-v[0] := 123.456; // записываем 123.456 по индексу 0
-v[1].Println; // читаем и выводим значение по индексу 1
-v.val[2] := 1; // можно так же писать и имя свойства
+v[0] := 123.456; // Записываем 123.456 по индексу 0
+v[1].Println; // Читаем и выводим значение по индексу 1
+v.val[2] := 1; // Можно так же писать и имя свойства
Но использование этого свойства не рекомендуется. Прямое обращение
к полю всегда будет быстрее. То есть аналогично предыдущему коду:
@@ -1189,7 +1208,7 @@ v.val2 := 1;
// v1 будет иметь ту же длину, но
// противоположное v0 направление
var v1 := -v0;
-// а унарный + не делает ничего, он только
+// А унарный + не делает ничего, он только
// для красоты. То есть v2 будет =v0
var v2 := +v0;
@@ -1197,29 +1216,29 @@ var v2 := +v0;
var v1: Vec3d;
var v2: Vec3i;
...
-// выведет вектор, имеющий то же
+// Выведет вектор, имеющий то же
// направление что v1, но в 2 раза длиннее
(v1*2).Println;
-// выведет вектор, имеющий то же
+// Выведет вектор, имеющий то же
// направление что v1, но в 2 раза короче
(v1/2).Println;
-// к целочисленным векторам вместо
+// К целочисленным векторам вместо
// обычного деления надо применять div
(v2 div 2).Println;
Операции с 2 векторами
var v1, v2: Vec3d;
...
-// скалярное произведение векторов
+// Скалярное произведение векторов
(v1*v2).Println;
-// сумма векторов, складывает
+// Сумма векторов, складывает
// отдельно каждый элемент вектора
(v1+v2).Println;
-// разность векторов, тоже работает
+// Разность векторов, тоже работает
// отдельно на каждый элемент вектора
(v1-v2).Println;
@@ -1236,8 +1255,8 @@ var v2: Vec2i;
Каким образом находить корень полученного значения - дело программиста.
var v1: Vec3d;
...
-v1.SqrLength.Println; // квадрат длины
-v1.SqrLength.Sqrt.Println; // сама длина
+v1.SqrLength.Println; // Квадрат длины
+v1.SqrLength.Sqrt.Println; // Сама длина
Normalized
Метод .Normalized возвращает нормализированную (с длиной =1) версию вектора.
@@ -1248,7 +1267,7 @@ v1.Println;
v1.SqrLength.Sqrt.Println;
var v2 := v1.Normalized;
v2.Println;
-v2.SqrLength.Sqrt.Println; // обязательно будет 1
+v2.SqrLength.Sqrt.Println; // Обязательно будет 1
Cross
Статичный метод .Cross возвращает произведение векторов (Cross product, не путать со скалярным произведением).
@@ -1273,7 +1292,7 @@ v2.SqrLength.Sqrt.Println; // обязательно будет 1
Превращение в строку
var v1: Vec4d;
...
-v1.Println; // вывод вектора
+v1.Println; // Вывод вектора
// s присвоит ту же строку, что выводит .Println
var s := v1.ToString;
@@ -1311,7 +1330,7 @@ m.val31 := 1;
Но у матриц так же есть свойства для столбцов и строк:
var m: Mtr3d;
...
-m.Row0.Println; // вывод нулевой строчки в виде вектора
+m.Row0.Println; // Вывод нулевой строчки в виде вектора
m.Row1 := new Vec3d(1,2,3);
m.Col2.Println;
@@ -1319,7 +1338,7 @@ m.Col2.Println;
получать по динамическому индексу (но, опять же, это медленнее):
var m: Mtr3d;
...
-m.Row[0].Println; // вывод нулевой строчки в виде вектора
+m.Row[0].Println;
m.Row[1] := new Vec3d(1,2,3);
m.Col[2].Println;
@@ -1340,7 +1359,7 @@ var ptr2 := m.ColPtr[3];
Identity создаёт новую единичную матрицу. То есть матрицу, у
которой главная диагональ заполнена 1, а всё останое заполнено 0.
Mtr3d.Identity.Println;
-// работает и для не_квадратных матриц
+// Работает и для не_квадратных матриц
Mtr2x3d.Identity.Println;
UseColPtr*
@@ -1378,8 +1397,8 @@ var v := new Vec3d(1,2,3);
умножении на которую к вектору добавляется заданное значение.
var m := Mtr4d.Translate(1,2,3);
-// последний элемент должен быть 1,
-// чтоб матрица из .Translate правильно работала
+// Последний элемент должен быть 1,
+// чтобы матрица из .Translate правильно работала
var v := new Vec4d(0,0,0,1);
(m*v).Println; // (1;2;3)
@@ -1407,7 +1426,7 @@ var v := new Vec4d(0,0,0,1);
1,2,3,
4,5,6
);
-m.Transpose.Println; // выводит:
+m.Transpose.Println; // Выводит:
// 1 4
// 2 5
// 3 6
@@ -1423,7 +1442,7 @@ m.Transpose.Println; // выводит:
Как и у векторов - матрицы можно выводить и превращать в строку
var m: Mtr4d;
...
-m.Println; // вывод матрицы
+m.Println; // Вывод матрицы
// s присвоит ту же строку, что выводит .Println
var s := m.ToString;
@@ -1828,7 +1847,7 @@ begin
cl.SetEventCallback(ev, CommandExecutionStatus.COMPLETE, cb,IntPtr.Zero).RaiseIfError;
end.
-
Этот код будет может время от времени вылетать, потому что:
+
Этот код может время от времени вылетать, потому что:
cl.SetEventCallback вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов cl.SetEventCallback завершился);
diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html b/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html
index 8948e512b..38c9f884d 100644
--- a/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html
+++ b/InstallerSamples/OpenGL и OpenCL/Справка OpenCLABC.html
@@ -71,13 +71,27 @@ body {
}
.ps-page-name {
cursor: pointer;
- padding: 1;
+ padding: 1;
}
/* ============================== *\
page display
\* ============================== */
+blockquote > *:first-child {
+ margin-top: 0;
+}
+blockquote > *:last-child {
+ margin-bottom: 0;
+}
+blockquote {
+ margin-left: 0;
+ margin-right: 0;
+ padding: 12px;
+ border-left: 5px solid #d0d0d0;
+ background-color: #f7f7f7;
+}
+
.smart-link {
color: blue;
cursor: pointer;
@@ -99,7 +113,6 @@ body {
.code-block {
display: inline-block;
cursor: text;
- background: #F0F0F0;
border-radius: 3px;
padding: 4px;
@@ -121,9 +134,13 @@ body {
box-shadow: -2px 2px 3px #0000004a;
background: linear-gradient(0deg, #f0f0f0, white);
}
-.inline-code {
+.inline-code, .code-block {
background: #F0F0F0;
}
+blockquote .inline-code,
+blockquote .code-block {
+ background: #DEDEDE;
+}
.code-keyword {
font-weight: bold;
@@ -901,52 +918,382 @@ window.onload = ()=>{
+
Сам модуль OpenCLABC - оболочка модуля OpenCL. Это значит, что внутри он использует
+содержимое OpenCL, но при подключении - показывает только свой личный функционал.
+
Так же множество типов из OpenCLABC являются оболочками типов из OpenCL.
+
Тип CommandQueue использует тип cl_command_queue, но предоставляет очень много не связанного с cl_command_queue функционала.
+
"Простые" типы-оболочки модуля OpenCLABC предоставляют только функционал соответствующего
+типа из модуля OpenCL... в более презентабельном виде. Из общего - у таких типов есть:
+
+Свойство .Native, возвращающее внутренний объект из модуля OpenCL.
+Если вам не пришлось, по какой-либо причине, использовать OpenCLABC и OpenCL вместе - это свойство может понадобится только для дебага.
+
+Свойство .Properties, возвращающее объект свойств внутреннего объекта.
+Свойства неуправляемого объекта никак не обрабатываются и не имеют описаний.
+Но типы этих свойств всё равно преобразуются в управляемые (особо заметно на строках и массивах).
+
+
+
+
Список простых типов-оболочек:
+
+- Platform - Платформа, объединяющая несколько совместимых устройств;
+- Device - Устройство, поддерживающее OpenCL;
+- Context - Контекст выполнения;
+- Buffer - Область памяти GPU;
+- Kernel - Подпрограмма, выполняемая на GPU;
+- ProgramCode - Контейнер kernel'ов.
+
+
+
+
+
В списке устройств контекста могут быть только совместимые друг с другом устройства.
+Совместимые устройства объединяются в общих платформах (объектах типа Platform).
+
+
Обычно платформы получают из статического свойства Platform.All:
+
uses OpenCLABC;
+
+begin
+ var pls := Platform.All;
+ pls.PrintLines;
+end.
+
+
+
+
+
+
Обычно устройства получают статическим методом Device.GetAllFor:
+
uses OpenCLABC;
+
+begin
+ foreach var pl in Platform.All do
+ begin
+ Writeln(pl);
+ var dvcs := Device.GetAllFor(pl, DeviceType.DEVICE_TYPE_ALL);
+ if dvcs<>nil then dvcs.PrintLines;
+ Writeln('='*30);
+ end;
+end.
+
+
И в большинстве случаев - это всё что вам понадобится.
+
+
Но если где то нужен более тонкий контроль - можно создать несколько виртуальных
+под-устройств, каждому из которых даётся часть ядер изначального устройства.
+Для этого используются методы .Split*:
+
uses OpenCLABC;
+
+begin
+ var dvc := Context.Default.MainDevice;
+
+ Writeln('Поддерживаемые типы .Spilt-ов:');
+ // Пустой список, или DEVICE_PARTITION_BY_COUNTS_LIST_END, если ни 1 не поддерживается
+ dvc.Properties.PartitionProperties.PrintLines;
+ Writeln('='*30);
+
+ Writeln('Виртуальные устройства, по 1 ядру каждое:');
+ // Если упадёт потому что слишком много
+ // устройств - пожалуйста, напишите в issue
+ dvc.SplitEqually(1).PrintLines;
+ Writeln('='*30);
+
+ Writeln('Два устройства, 1 и 2 ядра соответственно:');
+ dvc.SplitByCounts(1,2).PrintLines;
+
+end.
+
+
+
+
+
Для отправки команд в GPU необходим контекст (объект типа Context):
-Он содержит информацию о том, какое устройство будет использоваться при выполнении программ и хранении содержимого буферов.
+Он содержит информацию о том, какие устройства будут использоваться для выполнения кода на GPU и хранения содержимого буферов.
Создать контекст можно конструктором (new Context(...)).
-Контекст можно и не создавать, используя везде свойство Context.Default.
-
Изначально этому свойству присваивается контекст, использующий один любой GPU, если таковой имеется,
-или одно любое другое устройство, поддерживающее OpenCL, если GPU отсутствует.
+Контекст можно и не создавать, используя везде свойство
Context.Default.
+Неявные очереди всегда используют
Context.Default.
+
Изначально этому свойству присваивается контекст, использующий GPU, если оно имеется,
+или любое другое устройство, поддерживающее OpenCL, если GPU отсутствует.
Если устройств поддерживающих OpenCL нет - Context.Default будет nil.
Однако такая ситуация теоретически невозможна, потому что OpenCL поддерживается
всеми современными устройствами, занимающимися выводом изображения на экран.
Если Context.Default = nil - переустановите графические драйверы.
-
Context.Default можно перезаписывать.
-
Используйте эту возможность только если во всей программе нужен общий контекст, но не стандартный.
-
Частая перезапись Context.Default может привести к созданию сложно-ловимых багов в ваших программах.
-
-
Операции, у которых невозможно указать контекст, всегда используют Context.Default.
-
Контекст используется только для
-инициализации буферов
-и
-выполнения команд
-на GPU.
+
Context.Default можно перезаписывать.
+Используйте эту возможность только если во всей программе нужен общий контекст, но не стандартный.
+
Если ваша программа достаточно сложная чтобы нуждаться в нескольких контекстах - лучше не использовать
+Context.Default. И присвоить ему nil, чтобы не использовать случайно (к примеру, неявной очередью).
-
+
-
+
+
Программам, выпоняемые на GPU, не удобно использовать оперативную память.
+Поэтому обычно надо выделять память на самом GPU.
+Объекты типа Buffer представляют такую область памяти.
+
+
Буфер создаётся конструктором (new Buffer(...)).
+
Но если не передавать контекст в конструктор - память на GPU выделится только при вызове метода Buffer.Init.
+Если вызвать Buffer.Init 2 раза - память освободится и выделится заново.
+
Когда на GPU выделяется память - она НЕ очищается нулями, а значит содержит мусорные данные.
+
Если метод Buffer.Init не был вызван до первой операции чтения/записи - он будет вызван автоматически.
+В таком случае в качестве контекста в котором выделяется память берётся тот,
+на котором вызвали .BeginInvoke, который запустил команду чтения/записи буфера.
+
Память на GPU можно моментально освободить, вызвав метод Buffer.Dispose.
+Но если снова использовать буфер, у которого освободили память - память выделится заново.
+
Если сборщик мусора удаляет объект типа Buffer - .Dispose вызывается автоматически.
+
+
Но кроме выделения памяти GPU - OpenCL так же позволяет выделять память внутри другого буфера.
+Для этого используется тип SubBuffer:
+
uses OpenCLABC;
+
+begin
+ var c := Context.Default;
+
+ // Не обязательно MainDevice, можно взять любое устройство из контекста
+ var align := c.MainDevice.Properties.MemBaseAddrAlign;
+
+ var b := new Buffer(align*2, c);
+ // size может быть любым, но origin
+ // должно быть align*N, где N - целое
+ var b1 := new SubBuffer(b, 0, Min(123,align));
+ var b2 := new SubBuffer(b, align, align);
+
+ Writeln(b1);
+ Writeln(b2);
+end.
+
+
+
+
+
+
Объект типа Kernel представляет одну подпрограмму в OpenCL-C коде,
+объявленную с ключевым словом __kernel.
+
+
Обычно Kernel создаётся через индексное свойтсво ProgramCode:
+
var code: ProgramCode;
+...
+var k := code['KernelName'];
+
+
Тут 'KernelName' — имя подпрограммы-kernel'а в исходном коде (регистр важен!).
+
+
Так же можно получить список всех kernel'ов объекта ProgramCode, методом ProgramCode.GetAllKernels:
+
var code: ProgramCode;
+...
+var ks := code.GetAllKernels;
+ks.PrintLines;
+
+
+
Методы, запускающие Kernel принимают специальные аргументы типа KernelArg, которые передаются в OpenCL-C код.
+Экземпляр KernelArg может быть создан из нескольких типов значений, а точнее:
+
uses OpenCLABC;
+
+begin
+ var k: Kernel;
+ var val1 := 3;
+ var val2 := 5;
+
+ k.Exec1(1,
+ // Передавать можно:
+
+ // Буфер
+ new Buffer(1),
+ // Очередь возвращающую буфер
+ HFQ(()->new Buffer(1)),
+ // В том числе BufferCommandQueue
+ Buffer.Create(1).NewQueue as CommandQueue<Buffer>,
+
+ // Размерное значение
+ val1,
+ HFQ(()->val1),
+
+ // И указатель на размерное значение
+ // (в kernel попадёт само значение, не указатель)
+ @val2,
+ // Так нельзя, потому что val1 уже захвачена лямбдой HFQ
+// @val1,
+ // Расширенный набор параметров
+ KernelArg.FromPtr(new System.IntPtr(@val2), new System.UIntPtr(sizeof(integer)))
+
+ );
+end.
+
+
Обратите внимание, KernelArg из указателя на val2 будет немного эффективнее
+чем KernelArg из самого значения val2. Но эту возможность стоит использовать
+только как тонкую оптимизацию, потому что много чего может пойти не так.
+Если передавать @val2 в качестве KernelArg - надо знать все тонкости.
+
+
Если @val2 передали вкачестве KernelArg:
+
+val2 не может быть глобальной переменной или полем класса:
+uses OpenCLABC;
+
+type
+ t1 = class
+ val1 := 1; // Не подходит, потому что поле класса
+ static val2 := 2; // И статичных полей это тоже касается
+ end;
+
+var
+ val3 := 3; // Глобальные переменные - тоже статические поля
+ k: Kernel; // k не важно где объявлена
+
+procedure p1;
+// Теоретически подходит, но вообще это плохой стиль кода
+var val4 := 4;
+begin
+
+ // А val5 однозначно подходит, потому что объявлена не только в той же
+ // подпрограмме, но и прямо перед использованием в k.Exec*
+ var val5 := 5;
+
+ k.Exec1(1,
+
+ // Это единственные 2 переменные, которые можно передавать адресом
+ @val4,
+ @val5
+
+ );
+
+end;
+
+begin end.
+
+
+val2 не должно быть захвачего лямбдой.
+Хотя указатель на val2 уже можно захватывать:
+uses OpenCLABC;
+
+begin
+ var k: Kernel;
+ var val1 := 3;
+ var val2 := 5;
+
+ // На val1 всё ещё накладываются все ограничени,
+ // когда val1_ptr использована в качестве KernelArg
+ // Но к самой val1_ptr эти ограничения не применяются
+ var val1_ptr := @val1;
+
+ k.Exec1(1,
+
+ val1,
+ HFQ(()->val1_ptr^), // захватили val1_ptr, а не val1
+
+ // val1 нигде не захвачена, поэтому теперь так можно
+ @val1,
+ val1_ptr // то же самое
+
+ );
+
+end.
+
+
+Выходить из подпрограммы, где объявили val2 нельзя, пока .Exec не закончит выполнятся.
+Это так же значит, что возвращать очередь, содержащую KernelArg из @val2 обычно нельзя.
+Но это можно обойти, если объявлять переменную в другой подпрограмме, а дальше передавать только её адрес:
+uses OpenCLABC;
+
+var k: Kernel; // Вообще лучше передавать параметром в p2
+
+// Обратите внимание - val принимает var-параметром
+// То есть, p2 принимает адрес val
+// (можно так же принимать указатель, но это не так удобно)
+// Иначе переменная будет копироваться при передаче
+// То есть без var перед параметром - val тут
+// будет новой переменной, объявленной в p2 а не в p1
+function p2(var val: integer): CommandQueueBase;
+begin
+
+ Result := k.NewQueue.AddExec1(1,
+
+ @val
+
+ );
+
+end;
+
+procedure p1;
+begin
+ var val: integer;
+
+ var q := p2(val);
+ // Опять же, q не должна продолжать выпоняться
+ // после выхода из p1, потому что тут объявлена val
+ Context.Default.SyncInvoke(q);
+
+end;
+
+begin
+ p1;
+end.
+
+
+
+
Компилятор не заставит вас следовать этим ограничениям. И программа может даже работать, игнорируя большинство сказанного тут.
+Но потом вы добавите что то в совсем другой части программы, или запустите её на
+другом компьютере и она вдруг начнёт выводить мусорные значения, или падать с ошибками
+вроде AccessViolationException, которые совершенно не объясняют в чём проблема.
+
Если очень интересно откуда берутся эти ограничения - начните с применения .Net декомпилятора к .exe файлам,
+получаемым при компиляции программ с данной страницы. Что останется непонятно - можете спрашивать в issue.
+
+
+
+
+
Обычные программы невозможно запустить на GPU. Для этого надо писать особые программы.
+В контексте OpenCL - эти программы обычно пишутся на языке "OpenCL C" (основанном на языке "C").
+
Язык OpenCL-C это часть библиотеки OpenCL, поэтому его справку можно найти там же, где и справку OpenCL.
+
В OpenCLABC код на языке "OpenCL C" хранится в объектах типа ProgramCode.
+Объекты этого типа используются только как контейнеры.
+Один объект ProgramCode может содержать любое количествово подпрограмм-kernel'ов.
+
+
Есть 2 способа создать объект типа ProgramCode:
+
+
+
+
+
Конструктор ProgramCode (new ProgramCode(...)) принимает тексты исходников программы на языке OpenCL-C.
+Именно тексты исходников, не имена файлов!
+
Так же, как исходники паскаля хранят в .pas файлах, исходники OpenCL-C кода хранят в .cl файлах.
+Но вообще, это не принципиально, потому что код даже не обязательно должен быть в файле.
+
Так как конструктор ProgramCode принимает текст - исходники программы на OpenCL-C можно хранить даже в
+строке в .pas программе. Тем не менее, храненить исходники OpenCL-C кода в .cl файлах обычно удобнее всего.
+
+
+
+
После создания объекта типа ProgramCode из исходников можно вызвать
+метод ProgramCode.SerializeTo, чтобы сохранить код в бинарном и прекомпилированном виде.
+Обычно это делается отдельной программой (не той же самой, которая будет использовать этот бинарный код).
+
После этого основная программа может создать объект ProgramCode,
+используя статический метод ProgramCode.DeserializeFrom.
+
Пример можно найти в папке Прекомпиляция ProgramCode или тут.
+
+
+
+
+
Передавать команды для GPU по одной не эффективно.
Гораздо эффективнее передавать несколько команд сразу.
Для этого существуют очереди (типы, наследующие от CommandQueue<T> и CommandQueueBase).
Они хранят произвольное количество команд для GPU.
А при необходимости также и части кода, выполняемые на CPU.
+
Страницы:
-
-
-
У каждого типа-очереди есть свой тип возвращаемого значение.
+
+
+
У каждого типа-очереди есть свой тип возвращаемого значения.
К примеру, так объявляется переменная в которую можно будет сохранить очередь, возвращающую integer:
var Q1: CommandQueue<integer>;
@@ -983,19 +1330,54 @@ end.
После выполнения очереди метод Context.SyncInvoke возвращает то, что вернула очередь.
А если использовать метод Context.BeginInvoke - возвращаемое значение можно получить с помощью метода CLTask.WaitRes.
-
Бывает необходимо хранить несколько очередей, с разными возвращаемыми значениями,
-вместе, к примеру, в переменной типа List<>.
+
Бывает необходимо хранить несколько очередей, с разными возвращаемыми значениями, вместе. К примеру, в переменной типа List<>.
Но в переменной типа CommandQueue<SomeT> можно хранить только очередь с конкретным типом возвращаемого значения SomeT.
-
Для того, чтобы хранить очереди с разными возвращаемыми значениями в одной переменной, надо использовать CommandQueueBase.
+
Для того, чтобы хранить очереди с разными возвращаемыми значениями в одной переменной - используется CommandQueueBase.
CommandQueueBase это особый тип очереди, у которого не указывается возвращаемое значение.
От него наследует CommandQueue<>, поэтому переменной типа CommandQueueBase можно присвоить любую очередь.
Если попытаться выполнить такую очередь,
или применять операции преобразования очередей, как .ThenConvert,
то тип возвращаемого значения будет восприниматься как Object.
-
+
-
+
+
Самый простой способ выполнить очередь - вызвать метод Context.SyncInvoke.
+Он синхронно выполняет очередь и вызвращает её результат.
+
Но если надо выполнить очередь асинхронно - лучше использовать метод Context.BeginInvoke.
+Он запускает асинхронное выполнение очереди и как только очередь была полностью запущена - возвращает объект типа CLTask<>, у которого есть:
+
+- Event'ы (но реализованы методами), позволяющие указать что должно выполнятся когда выполнение
CLTask завершится.
+- Свойства, возвращающие оригинальную очередь и контекст выполнения.
+- Методы для ожидания окончания выполнения и получения результата очереди.
+
+
Метод Context.SyncInvoke реализован как .BeginInvoke(...).WaitRes.
+Поэтому, везде где сказано "... происходит при вызове .BeginInvoke", это же относится и к .SyncInvoke.
+
У CLTask, как и у очереди - в <>, указывается тип возвращаемого значения. То есть:
+
var t: CLTask<integer>;
+
+
В такую переменную можно сохранить только результат Context.BeginInvoke для очереди типа CommandQueue<integer>.
+
И как и у CommandQueue:
+
+- Существует так же и тип
CLTaskBase, у которого типа возвращаемого значения не указывается.
+- Переменной типа
CLTaskBase можно присвоить CLTask с любым возвращаемым значением.
+Context.BeginInvoke для очереди типа CommandQueueBase возвращает CLTaskBase.
+
+
Если при выполнении возникла ошибка, о ней выведет не полную информацию. Чтобы получить всю информацию - используется try:
+
try
+
+ //ToDo ваш код, вызывающий ошибку
+
+except
+ // Writeln выводит все внутренние исключения. "e.ToString" тоже.
+ on e: Exception do Writeln(e);
+end;
+
+
Для этого кода есть стандартный снипет. Чтобы активировать его - напишите tryo и нажмите Shift+Пробел.
+
+
+
+
Есть всего 10 базовых способов создать очередь:
Из буфера / kernel'а
@@ -1020,8 +1402,8 @@ end.
-
-
+
+
Самый просто способ создать очередь — выбрать объект типа Buffer или Kernel и вызвать для него метод .NewQueue.
Полученная очередь будет иметь особый тип: BufferCommandQueue/KernelCommandQueue для буфера/kernel'а соответственно.
К такой очереди можно добавлять команды, вызывая её методы, имена которых начинаются с .Add....
@@ -1041,8 +1423,7 @@ begin
// Методы, добавляющие команду в очередь - возвращают очередь, для которой их вызвали (не копию а ссылку на оригинал)
// Поэтому можно добавлять по несколько команд в 1 строчке:
q.AddWriteValue(5, 1*sizeof(integer) ).AddWriteValue(7, 2*sizeof(integer) );
- // Все команды в q будут выполнятся последовательно, что не всегда хорошо
- // Если надо выполнять параллельно - создавайте несколько "b.NewQueue" и умножайте друг на друга
+ // Все команды в q будут выполняться последовательно
// В данной версии надо писать "as CommandQueue<...>" при использовании [Buffer/Kernel]CommandQueue там,
// где принимает CommandQueue<...>, из за бага компилятора #1981
@@ -1059,8 +1440,8 @@ end.
var q := new BufferCommandQueue(q0);
-
-
+
+
Переменной очереди можно присвоить значение, тип которого совпадает с возвращаемым значением очереди:
var q: CommandQueue<integer> := 5;
@@ -1069,10 +1450,10 @@ var q := new BufferCommandQueue(q0);
var cq := q as ConstQueue<integer>;
if cq=nil then
Writeln('Очередь не константная') else
- Writeln($'Очередь была создана из значения {cq.Val}');
+ Writeln($'Очередь была создана из значения ({cq.Val})');
-
CommandQueueBase также можно создать из значения, но для этого тип значения должен быть Object:
+
CommandQueueBase также можно создать из возвращаемого значения, но для этого тип значения должен быть Object:
var q: CommandQueueBase := 5 as object;
Чтобы получить значение, из которого создали константную очередь, когда не знаете его тип - используйте интерфейс IConstQueue:
@@ -1082,8 +1463,8 @@ if cq=nil then
Writeln($'Очередь была создана из значения ({cq.GetConstVal})');
-
-
+
+
Иногда между командами для GPU надо вставить выполнение обычного кода на CPU.
А разрывать для этого очередь на две части - плохо, потому что
одна целая очередь всегда выполнится быстрее двух её частей.
@@ -1092,14 +1473,62 @@ if cq=nil then
HPQ — Host Procedure Queue
(Хост в контексте OpenCL - это CPU, потому что с него посылаются команды для GPU)
Они возвращают очередь, выполняющую код (функцию/процедуру соотвественно) на CPU.
-Подробнее уже описано
+Пример применения приведён
на странице выше
-.
+.
+
+
Если во время выполнения очереди возникает какая-либо ошибка - весь пользовательский код,
+выполняемый на CPU в этой очереди получает ThreadAbortException:
+
uses OpenCLABC;
+
+begin
+ var t := Context.Default.BeginInvoke(
+ HPQ(()->
+ begin
+ try
+ Sleep(1000);
+ except
+ on e: Exception do lock output do
+ begin
+ Writeln('Ошибка во время выполнения первого HPQ:');
+ Writeln(e);
+ Writeln;
+ end;
+ end;
+ // Это никогда не выполнится, потому что
+ // ThreadAbortException кидает себя ещё раз в конце try
+ Writeln(1);
+ end)
+ *
+ HPQ(()->
+ begin
+ Sleep(500);
+ raise new Exception('abc');
+ end)
+ );
+
+ try
+ t.Wait;
+ except
+ on e: Exception do lock output do
+ begin
+ Writeln('Ошибка во время выполнения очереди:');
+ Writeln(e);
+ end;
+ end;
+
+end.
+
+
Исключение ThreadAbortException во многом опасно.
+Подробнее можно прочитать в справке от microsoft.
+
А в кратце, если в вашем коде была кинута ThreadAbortException - становится очень сложно сказать что-либо о его состоянии.
+Даже потокобезопастный код, как вызов Buffer.Dispose, может привести к утечкам памяти, если посреди него кинут ThreadAbortException.
+
Считайте получение ThreadAbortException критической ошибкой, после которой очень желателен перезапуск всего .exe файла.
-
-
+
+
Если сложить две очереди A и B (var C := A+B) — получится очередь C, в которой сначала выполнится A, а затем B.
Очередь C будет считаться выполненной тогда, когда выполнится очередь B.
Если умножить две очереди A и B (var C := A*B) — получится очередь C, в которой одновременно начнут выполняться A и B.
@@ -1167,36 +1596,40 @@ begin
end.
-
-
+
+
Если надо с минимальными затратами изменить представление компилятора об очереди - лучше всего использовать .Cast.
Но он ограничен примерно так же, как метод последовательностей .Cast. То есть:
-
type t1 = class ... end;
-type t2 = class(t1) ... end;
-...
-var Q1: CommandQueue<integer> := 5;
-var Q2: CommandQueueBase := Q1;
-var Q3: CommandQueue<t1> := (new t2) as t1;
-var Q4: CommandQueue<t1> := new t1;
-var Q5: CommandQueue<t2> := new t2;
+uses OpenCLABC;
-// Можно, потому что к object можно преобразовать всё
-Context.Default.SyncInvoke( Q1.Cast&<object> );
+type t1 = class end;
+type t2 = class(t1) end;
-// Нельзя, преобразование из integer в byte - изменяет внутреннее представление данных
-Context.Default.SyncInvoke( Q1.Cast&<byte> );
-
-// Можно, Q2 и так имеет тип CommandQueue<integer>, а значит тут Cast вернёт (Q2 as CommandQueue<integer>)
-Context.Default.SyncInvoke( Q2.Cast&<integer> );
-
-// Можно, потому что Q3 возвращает t2
-Context.Default.SyncInvoke( Q3.Cast&<t2> );
-
-// Нельзя, Q4 возвращает не t2 а t1, поэтому к t2 преобразовать не получится
-Context.Default.SyncInvoke( Q4.Cast&<t2> );
-
-// Можно, потому что t2 наследует от t1
-Context.Default.SyncInvoke( Q5.Cast&<t1> );
+begin
+ var Q1: CommandQueue<integer> := 5;
+ var Q2: CommandQueueBase := Q1;
+ var Q3: CommandQueue<t1> := (new t2) as t1;
+ var Q4: CommandQueue<t1> := new t1;
+ var Q5: CommandQueue<t2> := new t2;
+
+ // Можно, потому что к object можно преобразовать всё
+ Context.Default.SyncInvoke( Q1.Cast&<object> );
+
+ // Нельзя, преобразование между 2 записями, как из integer в byte - это сложный алгоритм
+ Context.Default.SyncInvoke( Q1.Cast&<byte> );
+
+ // Можно, Q2 и так имеет тип CommandQueue<integer>, а значит тут Cast вернёт (Q2 as CommandQueue<integer>)
+ Context.Default.SyncInvoke( Q2.Cast&<integer> );
+
+ // Можно, потому что Q3 возвращает t2
+ Context.Default.SyncInvoke( Q3.Cast&<t2> );
+
+ // Нельзя, Q4 возвращает не t2 а t1, поэтому к t2 преобразовать не получится
+ Context.Default.SyncInvoke( Q4.Cast&<t2> );
+
+ // Можно, потому что t2 наследует от t1
+ Context.Default.SyncInvoke( Q5.Cast&<t1> );
+end.
Ну а если эти ограничения не подходят - остаётся только .ThenConvert.
Он позволяет указать любой алгоритм преобразования, но работает медленнее:
@@ -1212,12 +1645,12 @@ begin
end.
-
-
+
+
В данный момент всё ещё не работает... Но уже совсем скоро, правда-правда!
-
-
+
+
Одну и ту же очередь можно использовать несколько раз, в том числе одновременно:
uses OpenCLABC;
@@ -1277,8 +1710,7 @@ end.
у которых будет общий результат.
Каждый вызов .Multiusable создаёт именно новую функцию.
Это значит, что если использовать результаты двух вызовов .Multiusable - исходная очередь выполнится два раза.
-.Multiusable не работает между вызовами Context.BeginInvoke,
-потому что каждый следующий Context.BeginInvoke может быть вызван на новом объекте типа Context:
+.Multiusable не работает между вызовами Context.BeginInvoke:
uses OpenCLABC;
begin
@@ -1301,8 +1733,8 @@ end.
А если контекст разный - надо сохранять результат в переменную и использовать Wait очереди
(подробнее на странице ниже).
-
-
+
+
Между командами для GPU (хранимыми в очередях типов BufferCommandQueue и KernelCommandQueue)
бывает надо вставить выполнение другой очереди или кода для CPU.
Это можно сделать, используя несколько .NewQueue:
@@ -1334,11 +1766,10 @@ var q := b.NewQueue
q.AddQueue(q);
Все .Add* методы добавляют команды в существующую очередь, а не создают новую.
-Поэтому очередь, созданная предыдущим кодом при попытке выполнения начнёт циклически запускать саму себя.
-Но это вызовет скорее не зависание, а переполнение стека (что, впрочем, не лучше).
+Поэтому очередь, созданная предыдущим кодом при попытке выполнения начнёт циклически запускать саму себя.
-
-
+
+
Есть всего 3 группы подпрограмм, создающих очереди для ожидания других очередей:
Глобальные, WaitFor*:
@@ -1352,8 +1783,8 @@ q.AddQueue(q);
Так же не имеет незаменимых применений, но ещё полезнее.
Q.ThenWaitFor(...) работает как Q + WaitFor(...), за исключением того, что возвращает результат Q.
То есть, правильнее будет:
- var Qs := Q.Multiusable;
- Result := Qs() + WaitFor(...) + Qs();
+var Qs := Q.Multiusable;
+Result := Qs() + WaitFor(...) + Qs();
Но это уже даже в одну строчку не напишешь.
@@ -1364,19 +1795,18 @@ q.AddQueue(q);
- На
All: Ожидание всех указанных очередей.
- На
Any: Ожидание любой из указанных очередей (какая раньше выполнится).
-
То есть, к примеру, WaitForAny создаёт очередь, которая ничего не делает и ожидает выполнения любой из указанных очередей.
+
То есть, к примеру, WaitForAny создаёт очередь, которая сама ничего не выполняет, но ожидает выполнения любой из указанных очередей.
Wait очереди делают реализацию некоторых сложных деревьев выполнения очередей возможными.
-Примеры можно найти в папке C:\PABCWork.NET\Samples\OpenCLABC\Wait очереди.
+Примеры можно найти в папке
PABCWork.NET\Samples\OpenCLABC\Wait очереди.
Но они наиболее полезны благодаря одному особенному свойству:
Wait очереди работают даже между вызовами Context.BeginInvoke, в отличии от всего остального в OpenCLABC.
Это не всегда безопастно:
Context.Default.BeginInvoke(Q1);
Context.Default.BeginInvoke(WaitFor(Q1) + Q2);
-
Проблема этого кода в том, что Q1 может закончить выполнятся ещё до того как WaitFor(Q1) начнёт ожидать.
-
Чтоб такое не происходило - надо всегда запускать ожидаемую очередь
-в том же или, хотя бы, следующем вызове Context.BeginInvoke что и ожидающая:
+
Проблема этого кода в том, что Q1 может закончить выполняться ещё до того как WaitFor(Q1) начнёт ожидать.
+
Чтоб такое не происходило - надо всегда запускать ожидающую очередь раньше ожидаемой:
Context.Default.BeginInvoke(WaitFor(Q1) + Q2);
Context.Default.BeginInvoke(Q1);
@@ -1386,8 +1816,8 @@ Context.Default.BeginInvoke(Q1);
( WaitFor(Q1) + Q2 )
);
-
Если ожидаемая и ожидающая очереди находятся в общем Context.BeginInvoke - не важно в каком порядке они написаны.
-OpenCLABC гарантирует что ожидающие очереди начнут ожидать до начала выполнения ожидаемых.
+
Все ожидающие очереди начинают ожидать в самом начале вызова Context.BeginInvoke, перед тем как очередь начнёт выполнятся.
+Поэтому если ожидающая и ожидаемая очереди находятся в общем Context.BeginInvoke - о их порядке можно не волноваться.
Множественное ожидание несколько раз выполнившейся очереди
Когда начинает выполняться Context.BeginInvoke - для каждой ожидающей очереди в соответствующей
@@ -1398,7 +1828,7 @@ Context.Default.BeginInvoke(Q1);
begin
var Q1 := HPQ(()->
begin
- Sleep(200);
+ Sleep(1000);
lock output do Writeln('Выполнилась Q1');
end);
@@ -1409,9 +1839,9 @@ begin
(WaitFor(Q1)+Q2) *
(WaitFor(Q1)+Q3)
);
- Context.Default.BeginInvoke(Q1+Q1);
+ Context.Default.SyncInvoke(Q1+Q1);
- t1.Wait;
+ t1.Wait; // Чтобы вывести ошибки, если возникнут при выполнении
end.
Ну и, конечно, лучше совместить вызовы Context.BeginInvoke, раз контекст общий:
@@ -1420,7 +1850,7 @@ end.
begin
var Q1 := HPQ(()->
begin
- Sleep(200);
+ Sleep(1000);
lock output do Writeln('Выполнилась Q1');
end);
@@ -1447,7 +1877,7 @@ begin
WaitFor(Q1) +
WaitFor(Q1) // второй запуск Q1 никогда не произойдёт, поэтому это зависнет
);
- Context.Default.BeginInvoke(Q1);
+ Context.Default.SyncInvoke(Q1);
t1.Wait;
end.
@@ -1460,7 +1890,7 @@ end.
begin
var Q1 := HPQ(()->
begin
- Sleep(200);
+ Sleep(1000);
lock output do Writeln('Выполнилась Q1');
end);
@@ -1471,14 +1901,15 @@ begin
var Q5 := HPQ(()->lock output do Writeln('Выполнилась Q5'));
var t1 := Context.Default.BeginInvoke(
- (WaitFor(Q1)+Q2) *
- (WaitFor(Q1)+Q3)
+ ( WaitFor(Q1)+Q2 ) *
+ ( WaitFor(Q1)+Q3 )
);
var t2 := Context.Default.BeginInvoke(
- (WaitFor(Q1)+Q4) *
- (WaitFor(Q1)+Q5)
+ ( WaitFor(Q1)+Q4 ) *
+ ( WaitFor(Q1)+Q5 )
);
- Context.Default.BeginInvoke(Q1+Q1);
+ // Каждый вызов Q1 тут - активирует по 1 WaitFor(Q1) в каждом CLTask
+ Context.Default.SyncInvoke(Q1+Q1);
t1.Wait;
t2.Wait;
@@ -1490,30 +1921,29 @@ end.
begin
var Q1 := HPQ(()->
begin
- Sleep(200);
+ Sleep(1000);
lock output do Writeln('Выполнилась Q1');
end);
var Q2 := HPQ(()->lock output do Writeln('Выполнилась Q2'));
var Q3 := HPQ(()->lock output do Writeln('Выполнилась Q3'));
+ var Q4 := HPQ(()->lock output do Writeln('Выполнилась Q4'));
var t1 := Context.Default.BeginInvoke(
- (WaitFor(Q1)+Q2) *
- (WaitFor(Q1)+Q3)
+ ( WaitFor(Q1)+Q3 ) *
+ ( WaitFor(Q1)+Q4 )
);
- Context.Default.BeginInvoke(WaitFor(Q1)+Q1);
- Context.Default.BeginInvoke(Q1);
+ var t2 := Context.Default.BeginInvoke(WaitFor(Q1)+Q2+Q1);
+ Context.Default.SyncInvoke(Q1);
t1.Wait;
+ t2.Wait;
end.
-
-
-
И последнее что надо знать - Wait-Any очередь хоть и ожидает выполнения любой одной очереди из списка,
-но отнимает 1 от счётчиков всех ожидаемых очередей из своего списка.
+
-
-
-
Передавать команды по одной, когда их несколько - ужасно медленно!
+
+
+
Передавать команды по одной, когда их несколько - ужасно не эффективно!
Но нередко бывает так, что команда всего одна. Или для отладки надо одноразово выполнить одну команду.
Для таких случаев можно создавать очередь неявно:
У каждого .Add* метода есть дублирующий метод в оригинальном объекте. Такие методы сами создают
@@ -1525,13 +1955,14 @@ begin
var b := new Buffer( 3*sizeof(integer) );
var A := new integer[3];
- var Q_BuffWrite :=
- ( b.NewQueue.AddWriteValue(1, 0*sizeof(integer) ) as CommandQueue<Buffer> ) *
- ( b.NewQueue.AddWriteValue(5, 1*sizeof(integer) ) as CommandQueue<Buffer> ) *
- ( b.NewQueue.AddWriteValue(7, 2*sizeof(integer) ) as CommandQueue<Buffer> )
+ var Q_BuffWrite := b.NewQueue
+ .AddWriteValue(1, 0*sizeof(integer) )
+ .AddWriteValue(5, 1*sizeof(integer) )
+ .AddWriteValue(7, 2*sizeof(integer) )
+ as CommandQueue<Buffer>
;
- var Q_BuffRead := b.NewQueue.AddReadArray(A) as CommandQueue<Buffer>;
+ var Q_BuffRead := b.NewQueue.AddReadArray1&<integer>(A) as CommandQueue<Buffer>;
var Q_Otp := HPQ(()->
begin
@@ -1554,65 +1985,22 @@ begin
var A := new integer[3];
// Аналог Q_BuffWrite
- System.Threading.Tasks.Parallel.Invoke(
- ()->b.WriteValue(1, 0*sizeof(integer) ),
- ()->b.WriteValue(5, 1*sizeof(integer) ),
- ()->b.WriteValue(7, 2*sizeof(integer) )
- );
+ b.WriteValue(1, 0*sizeof(integer) );
+ b.WriteValue(5, 1*sizeof(integer) );
+ b.WriteValue(7, 2*sizeof(integer) );
// Аналог Q_BuffRead
- b.ReadArray(A);
+ b.ReadArray1&<integer>(A);
// Аналог Q_Otp
A.Println;
end.
-
-
Кроме того, у типа Buffer есть дополнительные методы Buffer.Get*.
-Соответствующих методов у очередей — нет (ToDo возможно, в будущем появятся).
-
Методы .Get* создают новый объект типа записи, массива или выделяют область неуправляемой памяти,
-читают в полученный объект содержимое буфера и возвращают этот объект.
-Они также используют неявную очередь (для чтения буфера).
+
-
+
-
-
Самый простой способ выполнить очередь - вызвать метод Context.SyncInvoke.
-Он синхронно выполняет очередь и вызвращает её результат.
-
Но если надо выполнить очередь асинхронно - лучше использовать метод Context.BeginInvoke.
-Он запускает асинхронное выполнение очереди и как только очередь была полностью запущена - возвращает объект типа CLTask<>, у которого есть:
-
-- Event'ы (но реализованы методами), позволяющие указать что должно выполнятся когда выполнение
CLTask завершится.
-- Свойство, возвращающие оригинальную очередь.
-- Методы для ожидания окончания выполнения и получения результата очереди.
-
-
Метод Context.SyncInvoke реализован как .BeginInvoke(...).WaitRes.
-Поэтому, везде где сказано "... происходит при вызове .BeginInvoke", это же относится и к .SyncInvoke.
-
У CLTask, как и у очереди - в <>, указывается тип возвращаемого значения. То есть:
-
var t: CLTask<integer>;
-
-
В такую переменную можно сохранить только результат Context.BeginInvoke для очереди типа CommandQueue<integer>.
-
И как и у CommandQueue:
-
-- Существует так же и тип
CLTaskBase, у которого типа возвращаемого значения не указывается.
-- Переменной типа
CLTaskBase можно присвоить CLTask с любым возвращаемым значением.
-Context.BeginInvoke для очереди типа CommandQueueBase возвращает CLTaskBase.
-
-
Если при выполнении возникла ошибка, о ней выведет не полную информацию. Чтобы получить всю информацию - используется try:
-
try
-
- //ToDo ваш код, вызывающий ошибку
-
-except
- // Writeln выводит все внутренние исключения. "e.ToString" тоже.
- on e: Exception do Writeln(e);
-end;
-
-
Для этого кода есть стандартный снипет. Чтобы активировать его - напишите tryo и нажмите Shift+Пробел.
-
-
-
-
+
Все методы создающие одну команду (.Add* методы и все методы неявных очередей)
могут принимать очередь вместо значения в качестве любого параметра. Но в таком случае
возвращаемый тип очереди должен совпадать с типом параметра. К примеру:
@@ -1641,159 +2029,70 @@ begin
end.
-
Все вложенные очереди начинают выполнятся сразу при вызове метода Context.BeginInvoke, не ожидая других очередей.
+
Все вложенные очереди начинают выполняться сразу при вызове метода Context.BeginInvoke, не ожидая других очередей.
Обычно вложенные очереди используются при вызове kernel'а,
когда надо записать что-то в буфер прямо перед вызовом kernel'а.
-
+
-
-
Программы, выпоняемые на GPU, не могут использовать оперативную память (без определённых расширений).
-Поэтому приходится выделять память на самом GPU.
-
Объекты типа Buffer содержат информацию об области памяти,
-выделенной на GPU, а также предоставляют методы для работы с этой памятью.
+
+
В данной справке в нескольких местах можно встретить утверждения вроде
+
+Вызовы Context.BeginInvoke стоит, по возможности, объединять.
+
+
Данный раздел подпробнее объясняет устройство модуля, что делает подобные утверждения более понятными.
+
Читать его не необходимо для написания работающего кода, но желательно для написания качественного кода.
+
Но стоит сказать заранее - это не полное объяснение внутренностей модуля. Объясняется только то, что скорее всего окажется нужным.
+Если хотите ещё более полное понимание - используйте Ctrl+клик в IDE по именам, чтоб смотреть исходный код.
-
Буфер создаётся конструктором (new Buffer(...)).
-
Но если не передавать контекст в конструктор - память на GPU выделится только при вызове метода Buffer.Init.
-Если вызвать Buffer.Init 2 раза - память освободится и выделится заново.
-
Когда на GPU выделяется память - она НЕ очищается, а значит содержит мусорные данные.
-
Если метод Buffer.Init не был вызван до первой операции чтения/записи - он будет вызван автоматически.
-В таком случае в качестве контекста в котором выделяется память берётся тот,
-на котором вызвали .BeginInvoke, который запустил команду чтения/записи буфера.
-
Память на GPU можно моментально освободить, вызвав метод Buffer.Dispose.
-Но если снова использовать буфер, у которого освободили память - память заново выделится.
-
Если сборщик мусора удаляет объект типа Buffer - .Dispose вызывается автоматически.
-
-
-
-
-
Обычные программы невозможно запустить на GPU. Для этого надо писать особые программы.
-В контексте OpenCL - эти программы обычно пишутся на языке "OpenCL C" (основанном на языке "C").
-
Язык OpenCL-C это часть библиотеки OpenCL, поэтому его справку можно найти там же где и справку OpenCL.
-
В OpenCLABC код на языке "OpenCL C" хранится в объектах типа ProgramCode.
-Объекты этого типа используются только как контейнеры.
-Один объект ProgramCode может содержать любое количествово подпрограмм-kernel'ов.
-
Есть 2 способа создать объект типа ProgramCode:
+
Страницы:
-
-
-
Конструктор ProgramCode (new ProgramCode(...)) принимает тексты исходников программы на языке OpenCL-C.
-Именно тексты исходников, не имена файлов
-
Так же, как исходники паскаля хранят в .pas файлах, исходники OpenCL-C кода хранят в .cl файлах.
-Но вообще, это не принципиально, потому что код даже не обязательно должен быть в файле.
-
Так как конструктор ProgramCode принимает текст - исходники программы на OpenCL-C можно хранить даже в строке в .pas программе.
-Тем не менее, хранение исходников OpenCL-C кода в .cl файлах упрощает жизнь, потому что тогда их легко найти.
-
-
-
-
ToDo в данный момент наблюдаются некоторые проблемы, возможно ProgramCode.DeserializeFrom реализован неправильно.
-
После создания объекта типа ProgramCode из исходников можно вызвать
-метод ProgramCode.SerializeTo, чтобы сохранить код в бинарном и прекомпилированном виде.
-Обычно это делается отдельной программой (не той же самой, которая будет использовать этот бинарный код).
-
После этого основная программа может создать объект ProgramCode,
-используя статический метод ProgramCode.DeserializeFrom.
-
К примеру, имеем следующий файл 0.cl:
-
__kernel void TEST(__global int* message)
-{
- int gid = get_global_id(0);
-
- message[gid] += gid;
-}
-
-
Для начала используем такую программу чтобы прекомпилировать его в бинарный файл:
-
uses OpenCLABC;
-
-begin
- var code := new ProgramCode(ReadAllText('0.cl'));
-
- var nf := System.IO.File.Create('0.bin');
- code.SerializeTo(nf);
- nf.Close;
-
-end.
-
-
Затем готовый бинарный файл можно загрузить так:
-
uses OpenCLABC;
-
-begin
- {$resource '0.bin'} // добавляет 0.bin внутрь готового .exe файла
-
- var code := ProgramCode.DeserializeFrom(Context.Default, GetResourceStream('0.bin'));
-
- var A := new Buffer( 10 * sizeof(integer) );
-
- code['TEST'].Exec1(10,
-
- A.NewQueue.AddFillValue(1)
- as CommandQueue<Buffer>
-
- );
-
- A.GetArray1&<integer>(10).Println;
-
-end.
-
-
-
-
-
-
Объект типа Kernel представляет одну подпрограмму в OpenCL-C коде,
-объявленную с ключевым словом __kernel.
+
+
+
Кроме самого выполнения очередей - им так же необходима инициализация и финализация.
-
Kernel создаётся через индексное свойтсво ProgramCode:
-
var k := code['KernelName'];
+Инициализация
+Для начала, перед тем как любая из под-очередей в BeginInvoke начнёт выполняться - необходимо инициалировать Wait очереди.
+Иначе у ожидаемой очереди всегда будет шанс выполнится до того как ожидающая начнёт ожидать.
+Инициализация Wait очередей заключается в обходе всего дерева под-очередей. Для каждой Wait очереди, ожидающей уникальную очередь,
+создаётся пара ключ-значения (CLTask и счётчик для него) и добавляется обработчик CLTask.WhenDone с удалением этой пары.
+
+Запуск очередей
+Тоже заключается в обходе дерева под-очередей.
+Но в этот раз очереди по которым прошлись - уже начали выполнятся, не ожидая окончания обхода всего дерева.
+Как только этот обход закончен - метод BeginInvoke возвращает свой CLTask коду, вызвавшему его.
+Единственное исключение - если очередь, каким то образом, уже завершила выполняться, к моменту как обход дерева закончился.
+Такое возможно, к примеру, если все под-очереди - константные. В таком случае финализация выполняется до выхода из BeginInvoke.
+
+Финализация
+В основном заключается в вызове обработчиков события, как CLTask.WhenDone.
+Обработчики созданные Wait очередями ничем не особенны, поэтому они тоже выполняются тут.
+
+Основное преимущество объединения вызовов BeginInvoke состоит в различии следующих 2 случаев:
+Context.Default.SyncInvoke(A+B);
-Где code имеет тип ProgramCode, а 'KernelName' — имя подпрограммы-kernel'а в исходном коде (регистр важен!).
-Пример выполнения kernel'а:
-uses OpenCLABC;
-
-begin
-
- // проще всего напрямую читать текст исходника из файла:
-// var code_text := ReadAllText('0.cl');
-
- // но лучше добавить .cl файл внутрь .exe и загружать оттуда:
- {$resource '0.cl'}
- var code_text := System.IO.StreamReader.Create( GetResourceStream('0.cl') ).ReadToEnd;
- // так не нужно таскать .cl файл вместе с .exe
-
- var code := new ProgramCode(code_text);
-
- var A := new Buffer( 10 * sizeof(integer) ); // буфер на 10 чисел типа "integer"
-
- // 'TEST' - имя подпрограммы-kernel'а из .cl файла. Регистр важен!
- var kernel := code['TEST'];
-
- kernel.Exec1(10, // используем 10 потоков
-
- A.NewQueue.AddFillValue(1) // заполняем весь буфер единичками, прямо перед выполнением
- //ToDo нужно только из за issue компилятора #1981
- as CommandQueue<Buffer>
-
- );
-
- // читаем весь буфер как одномерный массив с элементами типа "integer" и сразу выводим
- A.GetArray1&<integer>.Println;
-
-end.
+Context.Default.SyncInvoke(A);
+Context.Default.SyncInvoke(B);
-Файл 0.cl:
-__kernel void TEST(__global int* message)
-{
- int gid = get_global_id(0);
-
- message[gid] += gid;
-}
-
+В первом случае пока выполнится A - B уже, скорее всего, окажется полностью запущено.
+А значит как только A закончит выполнятся - ход выполнения перейдёт на B.
+А во втором случае - между окончанием выполнения A и запуском B - будет произведено множество проверок,
+а так же выходов/входов в объёмные (что значит JIT их не инлайнит) подпрограммы, как конструктор CLTask.
+Да, всё это мелочи. Но нулевая задержка всегда лучше ненулевой.
+
+Ну а когда всё же приходится вызывать 2 отдельных BeginInvoke, к примеру на 2 разных
+контекстах - можно использовать Wait очереди, чтоб добится того же эффекта:
+c2.BeginInvoke(WaitFor(A)+B);
+c1.BeginInvoke(A);
+
+Внутренние оптимизации OpenCLABC делают этот код практически не отличимым по скорости, от BeginInvoke(A+B).
+Единственное различие - время инициализации. Потому что A не запустится, пока не закончится обход дерева c2.BeginInvoke.
-
+