foreach по a..b преобразуется в for - для эффективности
This commit is contained in:
parent
1c4b7b7636
commit
838dddf8b1
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "5";
|
||||
public const string Build = "1";
|
||||
public const string Revision = "2297";
|
||||
public const string Revision = "2299";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=5
|
||||
%REVISION%=2297
|
||||
%REVISION%=2299
|
||||
%COREVERSION%=1
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
begin
|
||||
var diap := 'a'..'z';
|
||||
Println(diap);
|
||||
var g := 3 in 1..5;
|
||||
Println(g);
|
||||
foreach var x in 1..10 do
|
||||
Print(x);
|
||||
var a := Arr(1..5);
|
||||
var h := HSet(1..5);
|
||||
Println(a,h);
|
||||
(1..9).Select(x->x*x).Println;
|
||||
end.
|
||||
Binary file not shown.
|
|
@ -9,6 +9,7 @@
|
|||
<param name="Keyword" value="shr">
|
||||
<param name="Keyword" value="xor">
|
||||
<param name="Keyword" value="in">
|
||||
<param name="Keyword" value="Îïåðàöèÿ ..">
|
||||
</object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||
<title></title>
|
||||
|
|
@ -16,6 +17,7 @@
|
|||
<body><H1>Âûðàæåíèÿ è îïåðàöèè</H1>
|
||||
<p><strong>// óñòàðåëî è îòñóòñòâóåò â ñïðàâêå</strong></p>
|
||||
Ëþáîå âûðàæåíèå èìååò îïðåäåëåííûé òèï è ïîñëå âû÷èñëåíèÿ âîçâðàùàåò íåêîòîðîå çíà÷åíèå. Ïðîñòåéøèìè âûðàæåíèÿìè ÿâëÿþòñÿ ïåðåìåííûå è êîíñòàíòû. Áîëåå ñëîæíûå âûðàæåíèÿ ñòðîÿòñÿ èç áîëåå ïðîñòûõ ñ èñïîëüçîâàíèåì îïåðàöèé, ñêîáîê, âûçîâîâ ôóíêöèé, èíäåêñîâ è ïðèâåäåíèé òèïîâ. Äàííûå, ê êîòîðûì ïðèìåíÿþòñÿ îïåðàöèè, íàçûâàþòñÿ <i>îïåðàíäàìè</i>. <p> <b>Pascal ABC</b> èìåþòñÿ ñëåäóþùèå îïåðàöèè: <code>@</code>, </span></span></span></span><b><code>not</code></b>, <code>^</code>, <code>*</code>, <code>/</code>, <b><code>div</code></b>, <code><b>mod</b></code>, <code><b>and</b></code>, <code><b>shl</b></code>, <code><b>shr</b></code>, <code>+</code>, <code>-</code>, <code><b>or</b></code>, <code><b>xor</b></code>,
|
||||
<code><b>..</b></code>,
|
||||
<code><b>in</b></code>, <code>=></code>, <code>=</code>, <code>></code>, <code><</code>, <code><></code>, <code><=</code> è <code>>=</code>.</p>
|
||||
<h2>Àðèôìåòè÷åñêèå îïåðàöèè</h2><p>Ê <i>àðèôìåòè÷åñêèì</i> îòíîñÿòñÿ áèíàðíûå îïåðàöèè
|
||||
<code>+</code> <code>-</code> <code>*</code> <code>/</code> äëÿ âåùåñòâåííûõ è öåëûõ ÷èñåë, áèíàðíûå îïåðàöèè
|
||||
|
|
@ -88,18 +90,40 @@ b=1</code>,
|
|||
<p><code>1 <b>in</b> [2..5] // False<br>
|
||||
3 <b>in</b> [2..5] // True</code></p>
|
||||
</blockquote>
|
||||
<h2>Îïåðàöèÿ ..</h2><p>Îïåðàöèÿ .. ôîðìèðóåò äèàïàçîí çíà÷åíèé è ÿâëÿåòñÿ
|
||||
ñèíîíèì ôóíêöèè Range:</p>
|
||||
<blockquote>
|
||||
<p><code><strong>foreach var</strong> x <strong>in</strong> 2..5 <strong>do</strong>
|
||||
// <strong>foreach var</strong> x <strong>in</strong> Range(2,5) <strong>do</strong><br>
|
||||
Print(x);<br>(2..5).Select(x -> x*x).Println;<br>
|
||||
<strong>var</strong> a := Arr(2..5);<br><strong>var</strong> h :=
|
||||
HSet('2'..'5');</code></p>
|
||||
</blockquote>
|
||||
<p> êà÷åñòâå ãðàíèö äèàïàçîíà ìîãóò âûñòóïàòü öåëûå èëè ñèìâîëüíûå çíà÷åíèÿ.</p>
|
||||
<p>Âûðàæåíèå </p>
|
||||
<blockquote>
|
||||
<p><code>x <strong>in</strong> 2..5</code></p>
|
||||
</blockquote>
|
||||
<p>ïðåäåëüíî ýôôåêòèâíî, ïîñêîëüêó ïðåîáðàçóåòñÿ íà ýòàïå êîìïèëÿöèè â </p>
|
||||
<blockquote>
|
||||
<p><code>(x >= 2) <strong>and</strong> (x <= 5)</code></p>
|
||||
</blockquote>
|
||||
<h2>Ïðèîðèòåò îïåðàöèé</h2>
|
||||
<p>Ïðèîðèòåò îïðåäåëÿåò ïîðÿäîê âûïîëíåíèÿ îïåðàöèé â âûðàæåíèè.
|
||||
Ïåðâûìè âûïîëíÿþòñÿ îïåðàöèè, èìåþùèå âûñøèé ïðèîðèòåò. Îïåðàöèè, èìåþùèå
|
||||
îäèíàêîâûé ïðèîðèòåò, âûïîëíÿþòñÿ ñëåâà íàïðàâî.</p>
|
||||
<p style="margin-bottom: 3pt"><b>Ňŕáëčöŕ ďđčîđčňĺňîâ îďĺđŕöčé</b></p>
|
||||
<table border="0" width="382">
|
||||
<p><b>Òàáëèöà ïðèîðèòåòîâ îïåðàöèé</b></p>
|
||||
<table border="0" width="444" id="table1">
|
||||
<tr>
|
||||
<td><code>@</code>,
|
||||
<b><code>not</code></b>,
|
||||
^
|
||||
<code>^</code>, <code>+</code>, <code>-</code> (óíàðíûå), <code>new</code>
|
||||
</td>
|
||||
<td width="131">1 (íŕčâűńřčé)</td>
|
||||
<td>1 (íàèâûñøèé)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>**</code></td>
|
||||
<td style="width: 142px">2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>*</code>,
|
||||
|
|
@ -108,15 +132,21 @@ b=1</code>,
|
|||
<code><b>mod</b></code>,
|
||||
<code><b>and</b></code>,
|
||||
<code><b>shl</b></code>,
|
||||
<code><b>shr</b></code></td>
|
||||
<td width="131">2</td>
|
||||
<code><b>shr</b></code>,
|
||||
<code><b>as</b></code>,
|
||||
<code><b>is</b></code></td>
|
||||
<td>3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>+</code>,
|
||||
<code>-</code>,
|
||||
<code>-</code> (áèíàðíûå),
|
||||
<code><b>or</b></code>,
|
||||
<code><b>xor</b></code> </td>
|
||||
<td width="131">3</td>
|
||||
<td>4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>..</code></td>
|
||||
<td>5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>=</code>,
|
||||
|
|
@ -125,10 +155,12 @@ b=1</code>,
|
|||
<code>></code>,
|
||||
<code><=</code>,
|
||||
<code>>=</code>,
|
||||
<code><b>in</b></code>,
|
||||
<code>=></code>
|
||||
</td>
|
||||
<td width="131">4 (íčçřčé)</td>
|
||||
<code><b>in</b></code></td>
|
||||
<td>6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>?: </code> </td>
|
||||
<td>7 (íèçøèé)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<html><head>
|
||||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="Ïðèîðèòåò îïåðàöèé">
|
||||
</object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||
<title></title>
|
||||
|
|
@ -40,6 +41,10 @@
|
|||
<code><b>xor</b></code> </td>
|
||||
<td width="110">4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>..</code></td>
|
||||
<td width="110">5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>=</code>,
|
||||
<code><></code>,
|
||||
|
|
@ -48,11 +53,11 @@
|
|||
<code><=</code>,
|
||||
<code>>=</code>,
|
||||
<code><b>in</b></code></td>
|
||||
<td width="110">5</td>
|
||||
<td width="110">6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>?: </code> </td>
|
||||
<td width="110">6 (íčçřčé)</td>
|
||||
<td width="110">7 (íèçøèé)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,15 +1,17 @@
|
|||
<html><head>
|
||||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="in">
|
||||
</object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||
<title></title>
|
||||
<link rel="StyleSheet" href="../../default.css"></head>
|
||||
<body><H1>Îïåðàöèè ñ ìíîæåñòâàìè</H1>
|
||||
<p>Ê ìíîæåñòâàì ñ áàçîâûìè ýëåìåíòàìè îäíîãî òèïà ïðèìåíèìû
|
||||
îïåðàöèè <code>+</code> (îáúåäèíåíèå), <code>-</code>
|
||||
îïåðàöèè <code><b>in</b></code>
|
||||
(ïðèíàäëåæíîñòü) <code>+</code> (îáúåäèíåíèå), <code>-</code>
|
||||
(ðàçíîñòü) è <code>*</code> (ïåðåñå÷åíèå)<span lang="ru">, à òàêæå îïåðàòîðû </span><code>
|
||||
+=</code><span lang="ru">, </span><code>-=</code><span lang="ru"> è </span>
|
||||
<code>*=</code>:</p>
|
||||
<code>*=</code>: </p>
|
||||
<blockquote>
|
||||
<p><code><b>var</b> s1,s2,s: <b>set</b> <b>of</b> byte;<br>
|
||||
<b>begin<br>
|
||||
|
|
@ -25,7 +27,7 @@
|
|||
<span lang="ru"> </span>s -=<span lang="ru"> </span>[3];
|
||||
// s = [2,4..6] <br>
|
||||
<span lang="ru"> </span>s *=<span lang="ru"> </span>[1..5]; // s = [2,4..5]
|
||||
<br>
|
||||
<br> Print(3 <strong>in</strong> s1); // True<br>
|
||||
<b>end</b>.</code></p>
|
||||
</blockquote>
|
||||
<p>Ê ìíîæåñòâàì ñ áàçîâûìè ýëåìåíòàìè îäíîãî òèïà ïðèìåíèìû òàêæå îïåðàöèè
|
||||
|
|
@ -44,7 +46,19 @@
|
|||
<p>Íàêîíåö, îïåðàöèÿ <code><b>in</b></code>
|
||||
îïðåäåëÿåò, ïðèíàäëåæèò ëè ýëåìåíò ìíîæåñòâó: <code>3 <b>in</b> [2..5]</code>
|
||||
âåðíåò <code>True</code>, <code>1 <b>in</b> [2..5]</code> âåðíåò <code>False</code>.</p>
|
||||
<p><br>
|
||||
</p>
|
||||
<p>Ê ìíîæåñòâàì îòíîñÿòñÿ òàêæå òèïû HashSet<T> è SortedSet<T>. Ê ïåðåìåííûì
|
||||
ýòîãî òèïà ïðèìåíèìû òå æå îïåðàöèè, ÷òî è ê âñòðîåííûì ìíîæåñòâàì:</p>
|
||||
<blockquote>
|
||||
<p><code><b>begin<br>
|
||||
var
|
||||
</b>s1 := new HashSet<integer>;<br> s1 := HSet(Range(1,4));<br>
|
||||
<b> var
|
||||
</b>s2 := HSet(Range(2,5));<br>
|
||||
<strong>var </strong>s := s1 + s2; // s = [1..5]<br>
|
||||
<strong>var </strong>s := s1 - s2; // s = [1]<br>
|
||||
<strong>var </strong>s := s1 * s2; // s = [2..4]<br> Print(3
|
||||
<strong>in</strong> s1); // True<br><b>end</b>.</code></p>
|
||||
</blockquote>
|
||||
<p> </p>
|
||||
|
||||
</body></html>
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
<head>
|
||||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="foreach">
|
||||
<param name="Keyword" value="in">
|
||||
</object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||
<title></title>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
<HTML><HEAD><object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="Between">
|
||||
<param name="Keyword" value="Clamp">
|
||||
<param name="Keyword" value="ClampBottom">
|
||||
<param name="Keyword" value="ClampTop">
|
||||
<param name="Keyword" value="Downto">
|
||||
<param name="Keyword" value="InRange">
|
||||
<param name="Keyword" value="IsEven">
|
||||
|
|
@ -13,6 +16,12 @@
|
|||
</HEAD><body><H1>Ìåòîäû ðàñøèðåíèÿ òèïà integer</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code><b>function</b> Between(Self: integer; a, b: integer): boolean;</code>
|
||||
<br> Âîçâðàùàåò True åñëè çíà÷åíèå íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè</td></tr>
|
||||
<tr><td><code><b>function</b> Clamp(Self: integer; bottom,top: integer): integer;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå äèàïàçîíîì îò bottom äî top âêëþ÷èòåëüíî</td></tr>
|
||||
<tr><td><code><b>function</b> ClampBottom(Self: integer; bottom: integer): integer;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé bottom ñíèçó</td></tr>
|
||||
<tr><td><code><b>function</b> ClampTop(Self: integer; top: integer): integer;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé top ñâåðõó</td></tr>
|
||||
<tr><td><code><b>function</b> Downto(Self: integer; n: integer): <b>sequence </b> <b>of</b> integer;</code>
|
||||
<br> Ãåíåðèðóåò ïîñëåäîâàòåëüíîñòü öåëûõ îò òåêóùåãî çíà÷åíèÿ äî n â óáûâàþùåì ïîðÿäêå</td></tr>
|
||||
<tr><td><code><b>function</b> InRange(Self: integer; a,b: integer): boolean;</code>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
<HTML><HEAD><object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="Between">
|
||||
<param name="Keyword" value="Clamp">
|
||||
<param name="Keyword" value="ClampBottom">
|
||||
<param name="Keyword" value="ClampTop">
|
||||
<param name="Keyword" value="InRange">
|
||||
<param name="Keyword" value="Round">
|
||||
<param name="Keyword" value="RoundBigInteger">
|
||||
|
|
@ -12,6 +15,12 @@
|
|||
</HEAD><body><H1>Ìåòîäû ðàñøèðåíèÿ òèïà real</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code><b>function</b> Between(Self: real; a, b: real): boolean;</code>
|
||||
<br> Âîçâðàùàåò True åñëè çíà÷åíèå íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè</td></tr>
|
||||
<tr><td><code><b>function</b> Clamp(Self: real; bottom,top: real): real;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå äèàïàçîíîì îò bottom äî top âêëþ÷èòåëüíî</td></tr>
|
||||
<tr><td><code><b>function</b> ClampBottom(Self: real; bottom: real): real;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé bottom ñíèçó</td></tr>
|
||||
<tr><td><code><b>function</b> ClampTop(Self: real; top: real): real;</code>
|
||||
<br> Âîçâðàùàåò ÷èñëî, îãðàíè÷åííîå âåëè÷èíîé top ñâåðõó</td></tr>
|
||||
<tr><td><code><b>function</b> InRange(Self: real; a,b: real): boolean;</code>
|
||||
<br> Âîçâðàùàåò True åñëè çíà÷åíèå íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè</td></tr>
|
||||
<tr><td><code><b>function</b> Round(Self: real): integer;</code>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@
|
|||
<param name="Keyword" value="Reverse">
|
||||
<param name="Keyword" value="SetLength">
|
||||
<param name="Keyword" value="Shuffle">
|
||||
<param name="Keyword" value="Sort"></object>
|
||||
<param name="Keyword" value="Sort">
|
||||
<param name="Keyword" value="SortDescending"></object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
|
||||
</HEAD><body><H1>Ïîäïðîãðàììû äëÿ ðàáîòû ñ äèíàìè÷åñêèìè ìàññèâàìè</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code><b>function</b> Copy(a: <b>array</b> <b>of</b> T): <b>array</b> <b>of</b> T;</code>
|
||||
|
|
@ -27,6 +28,10 @@
|
|||
<br> Èçìåíÿåò ïîðÿäîê ýëåìåíòîâ â ñïèñêå íà ïðîòèâîïîëîæíûé</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reverse<T>(a: List<T>; index, count: integer);</code>
|
||||
<br> Èçìåíÿåò ïîðÿäîê ýëåìåíòîâ íà ïðîòèâîïîëîæíûé â äèàïàçîíå ñïèñêà äëèíû count, íà÷èíàÿ ñ èíäåêñà index</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reverse(<b>var</b> s: string);</code>
|
||||
<br> Èçìåíÿåò ïîðÿäîê ñèìâîëîâ â ñòðîêå íà ïðîòèâîïîëîæíûé</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reverse(<b>var</b> s: string; index, count: integer);</code>
|
||||
<br> Èçìåíÿåò ïîðÿäîê ñèìâîëîâ â ÷àñòè ñòðîêè äëèíû count íà ïðîòèâîïîëîæíûé, íà÷èíàÿ ñ èíäåêñà index</td></tr>
|
||||
<tr><td><code><b>procedure</b> SetLength(<b>var</b> a: <b>array</b> <b>of</b> T; n: integer);</code>
|
||||
<br> Óñòàíàâëèâàåò äëèíó îäíîìåðíîãî äèíàìè÷åñêîãî ìàññèâà. Ñòàðîå ñîäåðæèìîå ñîõðàíÿåòñÿ</td></tr>
|
||||
<tr><td><code><b>procedure</b> SetLength(<b>var</b> a: <b>array</b> [,...,] <b>of</b> T; n1,n2,...: integer);</code>
|
||||
|
|
@ -47,5 +52,9 @@
|
|||
<br> Ñîðòèðóåò ñïèñîê ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ cmp</td></tr>
|
||||
<tr><td><code><b>procedure</b> Sort<T>(l: List<T>; less: (T,T)->boolean);</code>
|
||||
<br> Ñîðòèðóåò ñïèñîê ïî êðèòåðèþ ñîðòèðîâêè, çàäàâàåìîìó ôóíêöèåé ñðàâíåíèÿ less</td></tr>
|
||||
<tr><td><code><b>procedure</b> SortDescending<T>(a: <b>array</b> <b>of</b> T);</code>
|
||||
<br> Ñîðòèðóåò äèíàìè÷åñêèé ìàññèâ ïî óáûâàíèþ</td></tr>
|
||||
<tr><td><code><b>procedure</b> SortDescending<T>(l: List<T>);</code>
|
||||
<br> Ñîðòèðóåò ñïèñîê ïî óáûâàíèþ</td></tr>
|
||||
</table>
|
||||
</body></HTML>
|
||||
|
|
@ -12,6 +12,8 @@
|
|||
</HEAD><body><H1>Ïîäïðîãðàììû äëÿ ñîçäàíèÿ äâóìåðíûõ äèíàìè÷åñêèõ ìàññèâîâ</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code><b>function</b> Matr<T>(m,n: integer; <b>params</b> data: <b>array</b> <b>of</b> T): <b>array</b> [,] <b>of</b> T;</code>
|
||||
<br> Âîçâðàùàåò äâóìåðíûé ìàññèâ ðàçìåðà m x n, çàïîëíåííûé óêàçàííûìè çíà÷åíèÿìè ïî ñòðîêàì</td></tr>
|
||||
<tr><td><code><b>function</b> Matr<T>(<b>params</b> aa: <b>array</b> <b>of</b> <b>array</b> <b>of</b> T): <b>array</b> [,] <b>of</b> T;</code>
|
||||
<br> Âîçâðàùàåò äâóìåðíûé ìàññèâ, çàïîëíåííûé çíà÷åíèÿìè èç îäíîìåðíûõ ìàññèâîâ</td></tr>
|
||||
<tr><td><code><b>function</b> MatrFill<T>(m, n: integer; x: T): <b>array</b> [,] <b>of</b> T;</code>
|
||||
<br> Âîçâðàùàåò äâóìåðíûé ìàññèâ ðàçìåðà m x n, çàïîëíåííûé ýëåìåíòàìè x</td></tr>
|
||||
<tr><td><code><b>function</b> MatrGen<T>(m, n: integer; gen: (integer,integer)->T): <b>array</b> [,] <b>of</b> T;</code>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
<head>
|
||||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||
<param name="Keyword" value="set">
|
||||
<param name="Keyword" value="HashSet">
|
||||
<param name="Keyword" value="SortedSet">
|
||||
<param name="Keyword" value="of">
|
||||
</object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||
|
|
@ -14,7 +16,13 @@
|
|||
<H1>Ìíîæåñòâà</H1>
|
||||
<p>Ìíîæåñòâî ïðåäñòàâëÿåò ñîáîé íàáîð ýëåìåíòîâ îäíîãî
|
||||
òèïà. Ýëåìåíòû ìíîæåñòâà ñ÷èòàþòñÿ íåóïîðÿäî÷åííûìè;
|
||||
каждый элемент может входить во множество не более одного раза. Тип множества
|
||||
каждый элемент может входить во множество не более одного раза. </p>
|
||||
<p>В PascalABC.NET имеются <strong>встроенные множества</strong> и множества
|
||||
библиотеки .NET: HashSet<T> (неупорядоченное, скорость операций вставки,
|
||||
удаления, принадлежности - O(1)) и SortedSet<T> (упорядоченное, скорость
|
||||
операций вставки, удаления, принадлежности - O(log(n))).</p>
|
||||
<p>Тип
|
||||
встроенного множества
|
||||
îïèñûâàåòñÿ ñëåäóþùèì îáðàçîì:</p>
|
||||
<blockquote>
|
||||
<p><code><b>set of </b></code><code class="codeit">áàçîâûé òèï</code></p>
|
||||
|
|
@ -35,7 +43,7 @@
|
|||
òèïîâ, ñòðîê è óêàçàòåëåé ñðàâíèâàþòñÿ çíà÷åíèÿ, ó ñòðóêòóðèðîâàííûõ è ó êëàññîâ
|
||||
- çíà÷åíèÿ âñåõ ýëåìåíòîâ èëè ïîëåé. Îäíàêî, åñëè ïîëÿ îòíîñÿòñÿ ê ññûëî÷íîìó
|
||||
òèïó, òî ñðàâíèâàþòñÿ òîëüêî èõ àäðåñà (íåãëóáîêîå ñðàâíåíèå). </p>
|
||||
<p>Чтобы сконструировать значение типа множество, используется так называемый конструктор
|
||||
<p>Чтобы сконструировать значение типа встроенное множество, используется так называемый конструктор
|
||||
ìíîæåñòâà, èìåþùèé âèä:</p>
|
||||
<blockquote>
|
||||
<p><code>[</code><code class="codeit">ñïèñîê çíà÷åíèé</code><code>]</code></p>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@
|
|||
<param name="Keyword" value="GPoint">
|
||||
<param name="Keyword" value="GRect">
|
||||
<param name="Keyword" value="GWindow">
|
||||
<param name="Keyword" value="Key"></object>
|
||||
<param name="Keyword" value="Key">
|
||||
<param name="Keyword" value="Point"></object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
|
||||
</HEAD><body><H1>Òèïû ìîäóëÿ GraphWPF</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code>Alignment = (LeftTop,CenterTop,RightTop,LeftCenter,Center,RightCenter,LeftBottom,CenterBottom,RightBottom);</code>
|
||||
|
|
@ -31,5 +32,7 @@
|
|||
<br> Òèï îêíà</td></tr>
|
||||
<tr><td><code>Key = System.Windows.Input.Key;</code>
|
||||
<br> Òèï êëàâèøè</td></tr>
|
||||
<tr><td><code>Point = System.Windows.Point;</code>
|
||||
<br> Òèï òî÷êè</td></tr>
|
||||
</table>
|
||||
</body></HTML>
|
||||
|
|
@ -9,7 +9,8 @@
|
|||
<param name="Keyword" value="GRect">
|
||||
<param name="Keyword" value="GSize">
|
||||
<param name="Keyword" value="GWindow">
|
||||
<param name="Keyword" value="Key"></object>
|
||||
<param name="Keyword" value="Key">
|
||||
<param name="Keyword" value="Point"></object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
|
||||
</HEAD><body><H1>Òèïû ìîäóëÿ WPFObjects</H1>
|
||||
<table border=0 cellpadding=5><tr><td><code>Color = System.Windows.Media.Color;</code>
|
||||
|
|
@ -34,5 +35,7 @@
|
|||
<br> Òèï îêíà</td></tr>
|
||||
<tr><td><code>Key = System.Windows.Input.Key;</code>
|
||||
<br> Òèï êëàâèøè</td></tr>
|
||||
<tr><td><code>Point = System.Windows.Point;</code>
|
||||
<br> Òèï òî÷êè</td></tr>
|
||||
</table>
|
||||
</body></HTML>
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
// This CSharp output file generated by Gardens Point LEX
|
||||
// Version: 1.1.3.301
|
||||
// Machine: DESKTOP-G8V08V4
|
||||
// DateTime: 04.01.2020 20:22:59
|
||||
// DateTime: 05.01.2020 12:29:53
|
||||
// UserName: ?????????
|
||||
// GPLEX input file <ABCPascal.lex>
|
||||
// GPLEX frame file <embedded resource>
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@
|
|||
%type <stn> typed_const_list1 typed_const_list optional_expr_list elem_list optional_expr_list_with_bracket expr_list const_elem_list1 /*const_func_expr_list*/ case_label_list const_elem_list optional_const_func_expr_list elem_list1
|
||||
%type <stn> enumeration_id expr_l1_list
|
||||
%type <stn> enumeration_id_list
|
||||
%type <ex> const_simple_expr term simple_term typed_const typed_const_plus typed_var_init_expression expr expr_with_func_decl_lambda const_expr elem range_expr const_elem array_const factor relop_expr expr_dq expr_l1 expr_l1_func_decl_lambda simple_expr range_term range_factor
|
||||
%type <ex> const_simple_expr term term1 simple_term typed_const typed_const_plus typed_var_init_expression expr expr_with_func_decl_lambda const_expr elem range_expr const_elem array_const factor relop_expr expr_dq expr_l1 expr_l1_func_decl_lambda simple_expr range_term range_factor
|
||||
%type <ex> external_directive_ident init_const_expr case_label variable var_reference /*optional_write_expr*/ optional_read_expr simple_expr_or_nothing var_question_point
|
||||
%type <ob> for_cycle_type
|
||||
%type <ex> format_expr format_const_expr const_expr_or_nothing
|
||||
|
|
@ -3122,13 +3122,6 @@ expr_l1
|
|||
{ $$ = $1; }
|
||||
| question_expr
|
||||
{ $$ = $1; }
|
||||
| expr_l1 tkDotDot expr_dq
|
||||
{
|
||||
if (parsertools.build_tree_for_formatter)
|
||||
$$ = new diapason_expr($1,$3,@$);
|
||||
else
|
||||
$$ = new diapason_expr_new($1,$3,@$);
|
||||
}
|
||||
;
|
||||
|
||||
expr_l1_func_decl_lambda
|
||||
|
|
@ -3681,9 +3674,21 @@ relop
|
|||
;
|
||||
|
||||
simple_expr
|
||||
: term1
|
||||
{ $$ = $1; }
|
||||
| simple_expr tkDotDot term1
|
||||
{
|
||||
if (parsertools.build_tree_for_formatter)
|
||||
$$ = new diapason_expr($1,$3,@$);
|
||||
else
|
||||
$$ = new diapason_expr_new($1,$3,@$);
|
||||
}
|
||||
;
|
||||
|
||||
term1
|
||||
: term
|
||||
{ $$ = $1; }
|
||||
| simple_expr addop term
|
||||
| term1 addop term
|
||||
{
|
||||
$$ = new bin_expr($1, $3, $2.type, @$);
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -22,7 +22,6 @@
|
|||
<name value="question_expr" />
|
||||
<name value="new_expr" />
|
||||
<name value="relop_expr" />
|
||||
<name value="simple_expr" />
|
||||
<name value="as_is_expr" />
|
||||
<name value="term" />
|
||||
<name value="default_expr" />
|
||||
|
|
|
|||
|
|
@ -254,5 +254,6 @@ script=
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.5.1.2297
|
||||
3.5.1.2299
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.5.1.2297'
|
||||
!define VERSION '3.5.1.2299'
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@ namespace PascalABCCompiler.SyntaxTreeConverters
|
|||
// FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева
|
||||
//FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не всё. А следующий вызов - всё
|
||||
root.FillParentsInAllChilds();
|
||||
// new range - до всего! До выноса выражения с лямбдой из foreach
|
||||
NewRangeDesugarVisitor.New.ProcessNode(root);
|
||||
|
||||
// Выносим выражения с лямбдами из заголовка foreach
|
||||
StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root);
|
||||
VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer.New.ProcessNode(root); // SSM bug fix #1147
|
||||
|
|
@ -26,8 +29,6 @@ namespace PascalABCCompiler.SyntaxTreeConverters
|
|||
#if DEBUG
|
||||
//new SimplePrettyPrinterVisitor("E:/projs/out.txt").ProcessNode(root);
|
||||
#endif
|
||||
// new range
|
||||
NewRangeDesugarVisitor.New.ProcessNode(root);
|
||||
|
||||
// loop
|
||||
LoopDesugarVisitor.New.ProcessNode(root);
|
||||
|
|
|
|||
81
SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs
Normal file
81
SyntaxVisitors/SugarVisitors/NewRangeDesugarVisitor.cs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
// Copyright (c) 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)
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using PascalABCCompiler.SyntaxTree;
|
||||
|
||||
namespace SyntaxVisitors.SugarVisitors
|
||||
{
|
||||
public class NewRangeDesugarVisitor : BaseChangeVisitor
|
||||
{
|
||||
public static NewRangeDesugarVisitor New
|
||||
{
|
||||
get { return new NewRangeDesugarVisitor(); }
|
||||
}
|
||||
|
||||
public override void visit(diapason_expr_new diap)
|
||||
{
|
||||
if (diap.Parent.Parent is pascal_set_constant)
|
||||
{
|
||||
// вернуть назад к diapason_expr
|
||||
var d = new diapason_expr(diap.left, diap.right, diap.source_context);
|
||||
ReplaceUsingParent(diap, d);
|
||||
visit(d);
|
||||
return;
|
||||
}
|
||||
|
||||
var el = new expression_list();
|
||||
el.Add(diap.left, diap.left.source_context);
|
||||
el.Add(diap.right, diap.right.source_context);
|
||||
|
||||
// Проблема в том, что тут тоже надо перепрошивать Parent!
|
||||
var mc = method_call.NewP(dot_node.NewP(new ident("PABCSystem", diap.source_context), new ident("Range", diap.source_context), diap.source_context), el, diap.source_context);
|
||||
|
||||
var sug = sugared_addressed_value.NewP(diap, mc, diap.source_context);
|
||||
|
||||
ReplaceUsingParent(diap, sug);
|
||||
visit(mc); // обойти заменённое на предмет наличия такого же синтаксического сахара
|
||||
}
|
||||
|
||||
public override void visit(bin_expr ex)
|
||||
{
|
||||
if (ex.operation_type == Operators.In && ex.right is diapason_expr_new diap && ex.left is addressed_value exl)
|
||||
{
|
||||
var el = new expression_list();
|
||||
el.Add(exl, exl.source_context);
|
||||
el.Add(diap.left, diap.left.source_context);
|
||||
el.Add(diap.right, diap.right.source_context);
|
||||
var mc = method_call.NewP(new ident("InRangeInternal", exl.source_context), el, exl.source_context);
|
||||
var sug = sugared_addressed_value.NewP(ex, mc, ex.source_context);
|
||||
ReplaceUsingParent(ex, sug);
|
||||
visit(mc); // обойти заменённое на предмет наличия такого же синтаксического сахара
|
||||
}
|
||||
else base.visit(ex);
|
||||
}
|
||||
|
||||
public override void visit(foreach_stmt fe)
|
||||
{
|
||||
if (fe.in_what is diapason_expr_new diap)
|
||||
{
|
||||
var from = diap.left;
|
||||
var typ = fe.type_name;
|
||||
if (typ != null && typ is no_type_foreach)
|
||||
typ = null;
|
||||
var cr = fe.type_name is no_type_foreach;
|
||||
var fn = new for_node(fe.identifier, diap.left, diap.right, fe.stmt, for_cycle_type.to, null, typ, cr);
|
||||
|
||||
var sl = new List<statement>();
|
||||
// надо проверить типы в диапазоне. Проверять соответствие типа переменной foreach возможно не надо - сообщение об ошибке и так будет хорошим. Посмотрим
|
||||
sl.Add(new semantic_check_sugared_statement_node(typeof(foreach_stmt), new List<syntax_tree_node> { diap, fe.type_name, fe.identifier }, fe.source_context));
|
||||
|
||||
sl.Add(fn);
|
||||
|
||||
ReplaceStatementUsingParent(fe, sl);
|
||||
}
|
||||
else base.visit(fe);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -10581,6 +10581,12 @@ begin
|
|||
Result := (a <= Self) and (Self <= b) or (b <= Self) and (Self <= a);
|
||||
end;
|
||||
|
||||
///--
|
||||
function InRangeInternal(Self: integer; a,b: integer): boolean; extensionmethod;
|
||||
begin
|
||||
Result := (a <= Self) and (Self <= b)
|
||||
end;
|
||||
|
||||
|
||||
// Дополнения февраль 2016: IsEven, IsOdd
|
||||
|
||||
|
|
|
|||
|
|
@ -587,7 +587,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
if (pct.first == null)
|
||||
throw new CanNotConvertTypes(en, en.type, to, loc);
|
||||
}
|
||||
|
||||
|
||||
public bool can_convert_type(expression_node en, type_node to)
|
||||
{
|
||||
if (en.type == to)
|
||||
|
|
@ -600,6 +600,18 @@ namespace PascalABCCompiler.TreeConverter
|
|||
return true;
|
||||
}
|
||||
|
||||
public bool can_convert_type(type_node from, type_node to)
|
||||
{
|
||||
if (from == to)
|
||||
return true;
|
||||
possible_type_convertions pct = type_table.get_convertions(from, to);
|
||||
if (pct.second != null)
|
||||
return false;
|
||||
if (pct.first == null)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void check_convert_type_with_inheritance(type_node from, type_node to, location loc)
|
||||
{
|
||||
if (from == to)
|
||||
|
|
@ -1876,7 +1888,7 @@ namespace PascalABCCompiler.TreeConverter
|
|||
bool is_alone_method_defined = (functions.Count() == 1);
|
||||
function_node first_function = functions.FirstOrDefault().sym_info as function_node;
|
||||
bool _is_assigment = first_function.name == compiler_string_consts.assign_name;
|
||||
bool is_op = compiler_string_consts.GetNETOperName(first_function.name) != null;
|
||||
bool is_op = compiler_string_consts.GetNETOperName(first_function.name) != null || first_function.name.ToLower() == "in";
|
||||
basic_function_node _tmp_bfn = functions.FirstOrDefault().sym_info as basic_function_node;
|
||||
|
||||
List<function_node> indefinits = new List<function_node>();
|
||||
|
|
|
|||
|
|
@ -126,21 +126,124 @@ namespace PascalABCCompiler.TreeConverter
|
|||
AddError(sem_ex.location, "INTEGER_VALUE_EXPECTED");
|
||||
}
|
||||
|
||||
|
||||
/*void common_diap_check(expression from, expression to)
|
||||
{
|
||||
|
||||
}*/
|
||||
|
||||
void semantic_check_method_call_as_diapason_expr(SyntaxTree.method_call mc)
|
||||
{
|
||||
var from = mc.parameters.expressions[0];
|
||||
var to = mc.parameters.expressions[1];
|
||||
var semfrom = convert_strong(from);
|
||||
|
||||
var semfrom = convert_strong(from);
|
||||
var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type);
|
||||
var b1 = false;
|
||||
if (!b)
|
||||
AddError(get_location(from), "INTEGER_VALUE_EXPECTED");
|
||||
b1 = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!b && !b1)
|
||||
AddError(get_location(from), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
var semto = convert_strong(to);
|
||||
b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
|
||||
if (!b)
|
||||
AddError(get_location(to), "INTEGER_VALUE_EXPECTED");
|
||||
var c = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
|
||||
var c1 = false;
|
||||
if (!c)
|
||||
c1 = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!c && !c1)
|
||||
AddError(get_location(to), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
if (b != c || c1 != b1)
|
||||
AddError(get_location(to), "INCOMPATIBLE_DIAPASON_BOUNDS_TYPES");
|
||||
}
|
||||
|
||||
void semantic_check_method_call_as_inrange_expr(SyntaxTree.method_call mc)
|
||||
{
|
||||
var v = mc.parameters.expressions[0];
|
||||
var from = mc.parameters.expressions[1];
|
||||
var to = mc.parameters.expressions[2];
|
||||
|
||||
var semv = convert_strong(v);
|
||||
var a = convertion_data_and_alghoritms.can_convert_type(semv, SystemLibrary.SystemLibrary.integer_type);
|
||||
var a1 = false;
|
||||
if (!a)
|
||||
a1 = convertion_data_and_alghoritms.can_convert_type(semv, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!a && !a1)
|
||||
AddError(get_location(v), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
var semfrom = convert_strong(from);
|
||||
var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type);
|
||||
var b1 = false;
|
||||
if (!b)
|
||||
b1 = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!b && !b1)
|
||||
AddError(get_location(from), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
var semto = convert_strong(to);
|
||||
var c = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
|
||||
var c1 = false;
|
||||
if (!c)
|
||||
c1 = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!c && !c1)
|
||||
AddError(get_location(to), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
if (b != c || c1 != b1)
|
||||
AddError(get_location(to), "INCOMPATIBLE_DIAPASON_BOUNDS_TYPES");
|
||||
if (a != b || a1 != b1)
|
||||
AddError(get_location(v), "INCOMPATIBLE_TYPES_OF_ELEMENT_AND_DIAPASON");
|
||||
}
|
||||
|
||||
void semantic_check_for_new_range(SyntaxTree.diapason_expr_new diap, type_definition td, ident id)
|
||||
{
|
||||
var from = diap.left;
|
||||
var to = diap.right;
|
||||
|
||||
var semfrom = convert_strong(from);
|
||||
var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type);
|
||||
var b1 = false;
|
||||
if (!b)
|
||||
b1 = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!b && !b1)
|
||||
AddError(get_location(from), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
var semto = convert_strong(to);
|
||||
var c = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
|
||||
var c1 = false;
|
||||
if (!c)
|
||||
c1 = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!c && !c1)
|
||||
AddError(get_location(to), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
if (b != c || c1 != b1)
|
||||
AddError(get_location(to), "INCOMPATIBLE_DIAPASON_BOUNDS_TYPES");
|
||||
|
||||
if (td != null && !(td is no_type_foreach))
|
||||
{
|
||||
// то мы определили тип явно в заголовке
|
||||
var semtype = convert_strong(td);
|
||||
var d = convertion_data_and_alghoritms.can_convert_type(semtype, SystemLibrary.SystemLibrary.integer_type);
|
||||
var d1 = false;
|
||||
if (!d)
|
||||
d1 = convertion_data_and_alghoritms.can_convert_type(semtype, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!d && !d1)
|
||||
AddError(get_location(td), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
if (b != d || b1 != d1)
|
||||
AddError(get_location(id), "INCOMPATIBLE_TYPES_OF_ELEMENT_AND_DIAPASON");
|
||||
}
|
||||
else if (td == null)
|
||||
{
|
||||
var semid = convert_strong(id);
|
||||
var e = convertion_data_and_alghoritms.can_convert_type(semid, SystemLibrary.SystemLibrary.integer_type);
|
||||
var e1 = false;
|
||||
if (!e)
|
||||
e1 = convertion_data_and_alghoritms.can_convert_type(semid, SystemLibrary.SystemLibrary.char_type);
|
||||
if (!e && !e1)
|
||||
AddError(get_location(id), "INTEGER_OR_CHAR_VALUE_EXPECTED");
|
||||
|
||||
if (b != e || b1 != e1)
|
||||
AddError(get_location(id), "INCOMPATIBLE_TYPES_OF_ELEMENT_AND_DIAPASON");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20305,6 +20305,13 @@ namespace PascalABCCompiler.TreeConverter
|
|||
var expr = st.lst[0] as SyntaxTree.expression;
|
||||
semantic_check_loop_stmt(expr);
|
||||
}
|
||||
else if (st.typ as System.Type == typeof(SyntaxTree.foreach_stmt)) // для NewRange Visitorа. Если будет перекрытие, то надоделать новые типы-маркеры
|
||||
{
|
||||
var expr = st.lst[0] as SyntaxTree.diapason_expr_new;
|
||||
var td = st.lst[1] as SyntaxTree.type_definition;
|
||||
var id = st.lst[2] as SyntaxTree.ident;
|
||||
semantic_check_for_new_range(expr,td,id);
|
||||
}
|
||||
// Patterns
|
||||
else if (st.typ is SemanticCheckType.MatchedExpression)
|
||||
{
|
||||
|
|
@ -20401,6 +20408,10 @@ namespace PascalABCCompiler.TreeConverter
|
|||
}
|
||||
semantic_check_dot_question(av.new_addr_value as SyntaxTree.question_colon_expression);
|
||||
}
|
||||
else if (av.sugared_expr is SyntaxTree.bin_expr) // Это пришло от i in (2..5). Плохо, что могут быть другие bin_expr
|
||||
{
|
||||
semantic_check_method_call_as_inrange_expr(av.new_addr_value as SyntaxTree.method_call);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(get_location(av), "MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}", av.sugared_expr.GetType().Name);
|
||||
|
|
|
|||
|
|
@ -2035,6 +2035,13 @@ function __WildCardsTupleEqual<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12
|
|||
elemsToCompare: sequence of integer): boolean;
|
||||
|
||||
|
||||
// Вспомогательные функции для a..b
|
||||
///--
|
||||
function InRangeInternal(x: integer; a,b: integer): boolean;
|
||||
|
||||
///--
|
||||
function InRangeInternal(x: char; a,b: char): boolean;
|
||||
|
||||
// -----------------------------------------------------
|
||||
// Стандартные классы исключений
|
||||
// -----------------------------------------------------
|
||||
|
|
@ -10581,6 +10588,17 @@ begin
|
|||
Result := (a <= Self) and (Self <= b) or (b <= Self) and (Self <= a);
|
||||
end;
|
||||
|
||||
///--
|
||||
function InRangeInternal(x: integer; a,b: integer): boolean;
|
||||
begin
|
||||
Result := (a <= x) and (x <= b)
|
||||
end;
|
||||
|
||||
///--
|
||||
function InRangeInternal(x: char; a,b: char): boolean;
|
||||
begin
|
||||
Result := (a <= x) and (x <= b)
|
||||
end;
|
||||
|
||||
// Дополнения февраль 2016: IsEven, IsOdd
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT=Too many elements on the left
|
|||
ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Tuple allows only base assignment :=
|
||||
TUPLE_TYPE_ERROR=Bad element in Tuple type
|
||||
INTEGER_VALUE_EXPECTED=Integer value expected
|
||||
INTEGER_OR_CHAR_VALUE_EXPECTED=Integer or char value expected
|
||||
INCOMPATIBLE_DIAPASON_BOUNDS_TYPES=Incompatible diapason bounds types
|
||||
INCOMPATIBLE_TYPES_OF_ELEMENT_AND_DIAPASON=Incompatible types of element and diapason
|
||||
BAD_SLICE_OBJECT=Slices are allowed for strings, dynamic arrays and lists only
|
||||
ONLY_IN_SHORT_FUNC_DEFS_RETURN_TYPE_CANBE_OMITTED=Only in short function definitions you can omit the return type
|
||||
ONE_TKIDENTIFIER=Type here must be identifier
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT=Слишком много э
|
|||
ONLY_BASE_ASSIGNMENT_FOR_TUPLE=Для кортежа допустимо только обычное присваивание :=
|
||||
TUPLE_TYPE_ERROR=Ошибочная конструкция при построении типа кортежа
|
||||
INTEGER_VALUE_EXPECTED=Ожидалось значение целого типа
|
||||
INTEGER_OR_CHAR_VALUE_EXPECTED=Ожидалось значение целого или символьного типа
|
||||
INCOMPATIBLE_DIAPASON_BOUNDS_TYPES=Несовместимые типы границ диапазона
|
||||
INCOMPATIBLE_TYPES_OF_ELEMENT_AND_DIAPASON=Тип элемента несовместим с типом диапазона
|
||||
BAD_SLICE_OBJECT=Срезы допустимы только для строк, динамических массивов и списков
|
||||
ONLY_IN_SHORT_FUNC_DEFS_RETURN_TYPE_CANBE_OMITTED=Только в коротких определениях функций можно не указывать тип возвращаемого значения
|
||||
ONE_TKIDENTIFIER=В качестве типа ожидался идентификатор
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in a new issue