parent
b24c527c7e
commit
2eddbb8f15
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=3
|
||||
%REVISION%=2570
|
||||
%MINOR%=6
|
||||
%REVISION%=2573
|
||||
%COREVERSION%=3
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
{$platformtarget x86}
|
||||
// Вызов функции из обычной dll
|
||||
function add(a,b: integer): integer; external 'NativeDll.dll' name 'add'; // объявление внешней функции
|
||||
|
||||
|
|
|
|||
|
|
@ -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> должна соответствовать завершающая ее
|
||||
|
|
|
|||
|
|
@ -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> Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå</td></tr>
|
||||
<tr><td><code><b>function</b> Pred(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;</code>
|
||||
<br> Âîçâðàùàåò ïðåäøåñòâóþùåå x çíà÷åíèå</td></tr>
|
||||
<tr><td><code><b>function</b> SeekEof: boolean;</code>
|
||||
<br> Пропускает пробельные символы, после чего возвращает True, если достигнут конец потока ввода</td></tr>
|
||||
<tr><td><code><b>function</b> SeekEoln: boolean;</code>
|
||||
<br> Пропускает пробельные символы, после чего возвращает True, если достигнут конец строки</td></tr>
|
||||
<tr><td><code><b>function</b> Succ(x: öåëîå): öåëîå;</code>
|
||||
<br> Âîçâðàùàåò ñëåäóþùåå çà x çíà÷åíèå</td></tr>
|
||||
<tr><td><code><b>function</b> Succ(x: ïåðå÷èñëèìûé òèï): ïåðå÷èñëèìûé òèï;</code>
|
||||
|
|
|
|||
|
|
@ -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> Öåíòð ãðàôè÷åñêîãî îêíà</td></tr>
|
||||
<tr><td><code><b>function</b> ClientRect: GRect;</code>
|
||||
<br> Êëèåíòñêèé ïðÿìîóãîëüíèê ãðàôè÷åñêîãî îêíà</td></tr>
|
||||
</tr>
|
||||
<tr><tr><td><code><b>procedure</b> Fill(fname: string);</code>
|
||||
<br> Çàïîëíÿåò ñîäåðæèìîå ãðàôè÷åñêîãî îêíà îáîÿìè èç ôàéëà ñ èìåíåì fname</td></tr>
|
||||
|
|
|
|||
|
|
@ -271,5 +271,6 @@ script=
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.6.3.2570
|
||||
3.6.3.2573
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.6.3.2570'
|
||||
!define VERSION '3.6.3.2573'
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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
4
TestSuite/isVar.pas
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
begin
|
||||
var b := ('abc' is string(var s)) and (s = 'abc');
|
||||
Assert(b);
|
||||
end.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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.
Loading…
Reference in a new issue