Попытка частично заставить работать одновременно #2277 и #2265

This commit is contained in:
Mikhalkovich Stanislav 2020-07-11 17:11:27 +03:00
parent b24c527c7e
commit 2eddbb8f15
17 changed files with 90 additions and 96 deletions

View file

@ -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;

View file

@ -1,4 +1,4 @@
%COREVERSION%=3
%REVISION%=2570
%MINOR%=6
%REVISION%=2573
%COREVERSION%=3
%MAJOR%=3

View file

@ -1,3 +1,4 @@
{$platformtarget x86}
// Вызов функции из обычной dll
function add(a,b: integer): integer; external 'NativeDll.dll' name 'add'; // объявление внешней функции

View file

@ -26,6 +26,7 @@
<param name="Keyword" value="region">
<param name="Keyword" value="endregion">
<param name="Keyword" value="string_nullbased">
<param name="Keyword" value="platformtarget">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
@ -77,6 +78,11 @@
ссылочной семантикой. </p>
<p><b>{$string_nullbased+}</b> - включение строк, индексируемых с 0.</p>
<p><b>{$string_nullbased-}</b> - выключение строк, индексируемых с 0.</p>
<p><strong>{$</strong><span class="highlight-strong"><strong>platformtarget</strong></span><strong>
x86}</strong> - êîìïèëÿöèÿ äëÿ 32-áèòíîé ïëàòôîðìû (òðåáóåòñÿ äëÿ ïîäêëþ÷åíèÿ
32-áèòíûõ dll)</p>
<p><strong>{$</strong><span class="highlight-strong"><strong>platformtarget</strong></span><strong>
x64}</strong> - êîìïèëÿöèÿ äëÿ 64-áèòíîé ïëàòôîðìû</p>
<p>Директивы <b>$ifdef</b>, <b>$ifndef</b> совместно с директивами <b>$else</b>
и <b>$endif</b> управлют условной компиляцией частей исходного файла. Каждой
директиве <b>$ifdef</b>, <b>$ifndef</b> должна соответствовать завершающая ее

View file

@ -6,6 +6,8 @@
<param name="Keyword" value="Inc">
<param name="Keyword" value="Ord">
<param name="Keyword" value="Pred">
<param name="Keyword" value="SeekEof">
<param name="Keyword" value="SeekEoln">
<param name="Keyword" value="Succ">
<param name="Keyword" value="Swap"></object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
@ -40,6 +42,10 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå</td></tr>
<tr><td><code><b>function</b> Pred(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå</td></tr>
<tr><td><code><b>function</b> SeekEof: boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Пропускает пробельные символы, после чего возвращает True, если достигнут конец потока ввода</td></tr>
<tr><td><code><b>function</b> SeekEoln: boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Пропускает пробельные символы, после чего возвращает True, если достигнут конец строки</td></tr>
<tr><td><code><b>function</b> Succ(x: öåëîå): öåëîå;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëåäóþùåå çà x çíà÷åíèå</td></tr>
<tr><td><code><b>function</b> Succ(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;</code>

View file

@ -1,5 +1,6 @@
<HTML><HEAD><object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="Center">
<param name="Keyword" value="ClientRect">
<param name="Keyword" value="Fill">
<param name="Keyword" value="GraphWindowType">
<param name="Keyword" value="Height">
@ -24,6 +25,8 @@
<tr><tr><td><code><b>function</b> Center: Point;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Öåíòð ãðàôè÷åñêîãî îêíà</td></tr>
<tr><td><code><b>function</b> ClientRect: GRect;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Êëèåíòñêèé ïðÿìîóãîëüíèê ãðàôè÷åñêîãî îêíà</td></tr>
</tr>
<tr><tr><td><code><b>procedure</b> Fill(fname: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïîëíÿåò ñîäåðæèìîå ãðàôè÷åñêîãî îêíà îáîÿìè èç ôàéëà ñ èìåíåì fname</td></tr>

View file

@ -271,5 +271,6 @@ script=

View file

@ -1 +1 @@
3.6.3.2570
3.6.3.2573

View file

@ -1 +1 @@
!define VERSION '3.6.3.2570'
!define VERSION '3.6.3.2573'

View file

@ -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);

View file

@ -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<procedure_definition> lpd = new List<procedure_definition>();
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);
}
}
}

View file

@ -224,43 +224,49 @@ namespace SyntaxVisitors.SugarVisitors
Debug.Assert(GetAscendant<statement_list>(isPatternExpr) != null, "Couldn't find statement list in upper nodes");
var l = new List<statement>();
//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<statement>();
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<statement>(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<statement>(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); // тут нельзя.

4
TestSuite/isVar.pas Normal file
View file

@ -0,0 +1,4 @@
begin
var b := ('abc' is string(var s)) and (s = 'abc');
Assert(b);
end.

View file

@ -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.

View file

@ -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.

View file

@ -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.

Binary file not shown.