diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 5de3e0463..cf4ab7a04 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 = "2570";
+ public const string Revision = "2573";
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 e554e129f..be9e428a6 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%COREVERSION%=3
-%REVISION%=2570
%MINOR%=6
+%REVISION%=2573
+%COREVERSION%=3
%MAJOR%=3
diff --git a/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas b/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas
index 294747533..937a70769 100644
--- a/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas
+++ b/InstallerSamples/!MainFeatures/04_Units/NativeDll/CallNative.pas
@@ -1,3 +1,4 @@
+{$platformtarget x86}
// Вызов функции из обычной dll
function add(a,b: integer): integer; external 'NativeDll.dll' name 'add'; // объ�вление внешней функции
diff --git a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html
index c1d886bdf..d3ef2edba 100644
--- a/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html
+++ b/PABCNetHelp/LangGuide/CompilerDirectives/index_directives.html
@@ -26,6 +26,7 @@
+
@@ -77,6 +78,11 @@
ññûëî÷íîé ñåìàíòèêîé.
{$string_nullbased+} - âêëþ÷åíèå ñòðîê, èíäåêñèðóåìûõ ñ 0.
{$string_nullbased-} - âûêëþ÷åíèå ñòðîê, èíäåêñèðóåìûõ ñ 0.
+{$platformtarget
+x86} - êîìïèëÿöèÿ äëÿ 32-áèòíîé ïëàòôîðìû (òðåáóåòñÿ äëÿ ïîäêëþ÷åíèÿ
+32-áèòíûõ dll)
+{$platformtarget
+x64} - êîìïèëÿöèÿ äëÿ 64-áèòíîé ïëàòôîðìû
Äèðåêòèâû $ifdef, $ifndef ñîâìåñòíî ñ äèðåêòèâàìè $else
è $endif óïðàâëþò óñëîâíîé êîìïèëÿöèåé ÷àñòåé èñõîäíîãî ôàéëà. Êàæäîé
äèðåêòèâå $ifdef, $ifndef äîëæíà ñîîòâåòñòâîâàòü çàâåðøàþùàÿ åå
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html
index 660d0e647..37c86e028 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Common subroutines.html
@@ -6,6 +6,8 @@
+
+
@@ -40,6 +42,10 @@
Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå
function Pred(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;
Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå |
+function SeekEof: boolean;
+ Ïðîïóñêàåò ïðîáåëüíûå ñèìâîëû, ïîñëå ÷åãî âîçâðàùàåò True, åñëè äîñòèãíóò êîíåö ïîòîêà ââîäà |
+function SeekEoln: boolean;
+ Ïðîïóñêàåò ïðîáåëüíûå ñèìâîëû, ïîñëå ÷åãî âîçâðàùàåò True, åñëè äîñòèãíóò êîíåö ñòðîêè |
function Succ(x: öåëîå): öåëîå;
Âîçâðàùàåò ñëåäóþùåå çà x çíà÷åíèå |
function Succ(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;
diff --git a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html
index 81fdaaf6b..563fa43fb 100644
--- a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html
+++ b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF GraphWindowType class.html
@@ -1,5 +1,6 @@
|
|
procedure Fill(fname: string);
Çàïîëíÿåò ñîäåðæèìîå ãðàôè÷åñêîãî îêíà îáîÿìè èç ôàéëà ñ èìåíåì fname |
diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
index ef840bcb5..97257f394 100644
--- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc
+++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc
@@ -271,5 +271,6 @@ script=
+
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index f9a1f9676..99f74c384 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2570
+3.6.3.2573
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 47547ce07..c9ff917aa 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2570'
+!define VERSION '3.6.3.2573'
diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs
index 5a17e2746..ce270598f 100644
--- a/SyntaxTreeConverters/StandardSyntaxConverter.cs
+++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs
@@ -20,8 +20,8 @@ namespace PascalABCCompiler.SyntaxTreeConverters
// FillParentNodeVisitor ра�положен в SyntaxTree/tree как базовый визитор, отвечающий за по�троение дерева
//FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не в�ё. � �ледующий вызов - в�ё
root.FillParentsInAllChilds();
- // new range - до в�его! До выно�а выражени� � л�мбдой из foreach
- NewRangeDesugarVisitor.New.ProcessNode(root);
+ // new range - до в�его! До выно�а выражени� � л�мбдой из foreach. 11.07 добавил пои�к yields и при�ваивание pd.HasYield
+ NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root);
// Unnamed Records перенё� �юда
UnnamedRecordsCheckVisitor.New.ProcessNode(root);
diff --git a/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs
index 08d709caa..7915d2d75 100644
--- a/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs
+++ b/SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs
@@ -10,11 +10,11 @@ using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
- public class NewRangeDesugarVisitor : BaseChangeVisitor
+ public class NewRangeDesugarAndFindHasYieldVisitor : BaseChangeVisitor
{
- public static NewRangeDesugarVisitor New
+ public static NewRangeDesugarAndFindHasYieldVisitor New
{
- get { return new NewRangeDesugarVisitor(); }
+ get { return new NewRangeDesugarAndFindHasYieldVisitor(); }
}
public override void visit(diapason_expr_new diap)
@@ -97,5 +97,28 @@ namespace SyntaxVisitors.SugarVisitors
}*/
else base.visit(fe);
}
+
+ List lpd = new List();
+
+ public override void visit (procedure_definition pd)
+ {
+ lpd.Add(pd);
+ base.visit(pd);
+ lpd.RemoveAt(lpd.Count - 1);
+ }
+ public override void visit(yield_node yn)
+ {
+ if (lpd.Count > 0)
+ lpd[lpd.Count - 1].has_yield = true;
+ base.visit(yn);
+ }
+
+ public override void visit(yield_sequence_node yn)
+ {
+ if (lpd.Count > 0)
+ lpd[lpd.Count - 1].has_yield = true;
+ base.visit(yn);
+ }
+
}
}
\ No newline at end of file
diff --git a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs
index cbc1cb65a..3750ed268 100644
--- a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs
+++ b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs
@@ -224,43 +224,49 @@ namespace SyntaxVisitors.SugarVisitors
Debug.Assert(GetAscendant(isPatternExpr) != null, "Couldn't find statement list in upper nodes");
- var l = new List();
- //l.Add(stat);
- var pp = isPatternExpr.right?.parameters;
- if (pp != null)
+ syntax_tree_node stn = isPatternExpr;
+ while (stn != null && !(stn is procedure_definition) && !(stn is function_lambda_definition))
+ stn = stn.Parent;
+ if (stn is procedure_definition pd && pd.has_yield)
{
- foreach (var p in pp)
+ var l = new List();
+ var pp = isPatternExpr.right?.parameters;
+ if (pp != null)
{
- if (p is var_deconstructor_parameter vdp)
+ foreach (var p in pp)
{
- var idClone = vdp.identifier.TypedClone();
- var idNew = vdp.identifier.TypedClone();
- idNew.name = GenerateNewName(idNew.name);
- var vs = new var_statement(idClone, idNew, idClone.source_context);
- vdp.identifier.name = idNew.name;
- l.Add(vs);
+ if (p is var_deconstructor_parameter vdp)
+ {
+ var idClone = vdp.identifier.TypedClone();
+ var idNew = vdp.identifier.TypedClone();
+ idNew.name = GenerateNewName(idNew.name);
+ var vs = new var_statement(idClone, idNew, idClone.source_context);
+ vdp.identifier.name = idNew.name;
+ l.Add(vs);
+ }
}
}
+
+ var stat = GetAscendant(isPatternExpr);
+ if (stat is if_node ifn)
+ {
+ //l.Add(ifn.then_body);
+ if (!(ifn.then_body is statement_list))
+ {
+ ifn.then_body = new statement_list(ifn.then_body);
+ }
+ (ifn.then_body as statement_list).list.InsertRange(0, l);
+ }
+ else
+ {
+ l.Insert(0, stat);
+ foreach (var x in l)
+ x.Parent = stat.Parent;
+ var stl = stat.Parent as statement_list;
+ stl.ReplaceInList(stat, l);
+ }
}
- var stat = GetAscendant(isPatternExpr);
- if (stat is if_node ifn)
- {
- //l.Add(ifn.then_body);
- if (!(ifn.then_body is statement_list))
- {
- ifn.then_body = new statement_list(ifn.then_body);
- }
- (ifn.then_body as statement_list).list.InsertRange(0, l);
- }
- else
- {
- l.Insert(0, stat);
- foreach (var x in l)
- x.Parent = stat.Parent;
- var stl = stat.Parent as statement_list;
- stl.ReplaceInList(stat, l);
- }
//ReplaceStatement(stat, l); // тут нельз�.
diff --git a/TestSuite/isVar.pas b/TestSuite/isVar.pas
new file mode 100644
index 000000000..a79533683
--- /dev/null
+++ b/TestSuite/isVar.pas
@@ -0,0 +1,4 @@
+begin
+ var b := ('abc' is string(var s)) and (s = 'abc');
+ Assert(b);
+end.
\ No newline at end of file
diff --git a/TestSuite/isvar2.pas b/TestSuite/isvar2.pas
deleted file mode 100644
index 4808ebbc9..000000000
--- a/TestSuite/isvar2.pas
+++ /dev/null
@@ -1,18 +0,0 @@
-function f1(o: object): sequence of object;
-begin
-
- //var c := o is object(var a);
- if o is object(var a) then
- begin
- // var b := a;
- // Writeln(a); // object
- yield a;
- Assert(a <> nil); // nil
- // Writeln(b); // object
- // b := b;
- end;
-end;
-
-begin
- foreach var o in f1(new object) do
-end.
\ No newline at end of file
diff --git a/TestSuite/isvar3.pas b/TestSuite/isvar3.pas
deleted file mode 100644
index 4f10e0e48..000000000
--- a/TestSuite/isvar3.pas
+++ /dev/null
@@ -1,19 +0,0 @@
-function f1(o: object): sequence of object;
-begin
-
- //var c := o is object(var a);
- if o is object(var a) then
- //begin
- // var b := a;
- // Writeln(a); // object
- yield a;
- //Assert(a <> nil); // nil
- // Writeln(b); // object
- // b := b;
- //end;
-end;
-
-begin
- foreach var o in f1(new object) do
- Assert(o<>nil)
-end.
\ No newline at end of file
diff --git a/TestSuite/isvar4.pas b/TestSuite/isvar4.pas
deleted file mode 100644
index 3d54646af..000000000
--- a/TestSuite/isvar4.pas
+++ /dev/null
@@ -1,19 +0,0 @@
-function f1(o: object): sequence of object;
-begin
-
- var c := o is object(var a);
- //if o is object(var a) then
- //begin
- // var b := a;
- // Writeln(a); // object
- yield a;
- Assert(a <> nil); // nil
- // Writeln(b); // object
- // b := b;
- //end;
-end;
-
-begin
- foreach var o in f1(new object) do
-
-end.
\ No newline at end of file
diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm
index 6a00647bf..86bfda65d 100644
Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ