Реализован foreach index

Исправлена ошибка for step
Дополнена справка по for step и foreach index
J,yjdkty ntrcnjdsq htlfrnjh? gjlcdtxbdf.obq ыеуз b штвуч rjyntrcnyj d hfvrf[ jlyjq cnhjrb
This commit is contained in:
Mikhalkovich Stanislav 2022-02-26 12:33:53 +03:00
parent 6381b157af
commit 3240593d2e
33 changed files with 3052 additions and 2818 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "8";
public const string Build = "2";
public const string Revision = "3081";
public const string Revision = "3085";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=8
%REVISION%=3081
%REVISION%=3085
%COREVERSION%=2
%MAJOR%=3

View file

@ -350,6 +350,19 @@ namespace ICSharpCode.TextEditor.Document
}
}
}
var fe = words.FindIndex(tw => string.Compare(tw.Word, "foreach", true) == 0);
if (fe >= 0)
{
var index = words.FindIndex(tw => string.Compare(tw.Word, "index", true) == 0);
if (index >= 0)
{
var f = words[fe];
var ind = words[index];
ind.SyntaxColor = f.SyntaxColor;
}
}
if (currentSpanStack != null && currentSpanStack.IsEmpty) {
currentSpanStack = null;

View file

@ -0,0 +1,6 @@
begin
var index := 0;
var a := Arr(3, 5, 7);
foreach var x in a index i do
Println(i, x);
end.

Binary file not shown.

View file

@ -6,6 +6,7 @@
<param name="Keyword" value="to">
<param name="Keyword" value="downto">
<param name="Keyword" value="do">
<param name="Keyword" value="step">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
@ -65,6 +66,17 @@
<b>for</b> <strong>var </strong>i := 1 <b>to</b> 5 <b>do</b><br>
&nbsp; Print(i*i);</code></p>
</blockquote>
<p>Íàêîíåö, â çàãîëîâêå öèêëà for ìîæíî óêàçàòü øàã èçìåíåíèÿ öèêëà:</p>
<blockquote>
<p><code><b>for var</b> </code><code class="codeit">ïåðåìåííàÿ</code><code> :=
</code><code class="codeit">íà÷àëüíîå
çíà÷åíèå</code><code> <b>to</b> </code><code class="codeit">êîíå÷íîå
çíà÷åíèå</code><code> <b>step </b><code class="codeit">çíà÷åíèå<b> </b></code> <b>do</b><br>
&nbsp; </code><code class="codeit">îïåðàòîð</code></p>
</blockquote>
<p>Ïðè íàëè÷èè øàãà öèêëà ðàçðåøàåòñÿ èñïîëüçîâàòü òîëüêî íàïðàâëåíèå <code> <b>to</b></code>. </p>
<p>Øàã <code> <b>step</b></code> ìîæåò áûòü îòðèöàòåëüíûì. Åñëè øàã <code> <b>
step</b></code> ðàâåí íóëþ, âîçíèêàåò îøèáêà âðåìåíè âûïîëíåíèÿ ïðîãðàììû.</p>
<p>Òåêñò îò ñëîâà <code><b>for</b></code> äî ñëîâà <code><b>do</b></code>
âêëþ÷èòåëüíî íàçûâàåòñÿ <b><font color="#FF0000"> <i>çàãîëîâêîì öèêëà</i></font></b>, à
îïåðàòîð ïîñëå <code><b>do</b></code> - <i><b><font color="#FF0000">òåëîì öèêëà</font></b>.</i>
@ -86,7 +98,7 @@
...<br>
for</b> en := red <b>to</b> blue <b>do</b><br>
&nbsp; write(Ord(en):2);<br>
<b>for</b> <b>var</b> c := 'a' <b>to</b> 'z' <b>do</b><br>
<b>for</b> <b>var</b> c := 'a' <b>to</b> 'z' <b>step</b> 2 <b>do</b><br>
&nbsp; write(c);</code></p>
</blockquote>
<p>Åñëè äëÿ öèêëà <code><b>for</b></code> ... <code><b>to</b></code>

View file

@ -4,6 +4,7 @@
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
<param name="Keyword" value="foreach">
<param name="Keyword" value="in">
<param name="Keyword" value="index">
</object>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
@ -16,19 +17,22 @@
ôîðì:</p>
<blockquote>
<p><code><b>foreach</b> </code><code class="codeit">ïåðåìåííàÿ</code><code>
<b>in</b> </code><code class="codeit">ęîíňĺéíĺđ</code><code> <b>do</b><br>
<b>in</b> </code><code class="codeit">êîíòåéíåð</code><code> <b>[index </b>
<em>ïåðåìåííàÿ</em><strong>]</strong> <b>do</b><br>
&nbsp; </code><code class="codeit">îïåðàòîð</code></p>
</blockquote>
<p>èëè</p>
<blockquote>
<p><code><b>foreach</b> </code><code class="codeit">ïåðåìåííàÿ</code><code>:</code><code class="codeit">
òèï</code><code> <b>in</b> </code><code class="codeit">êîíòåéíåð</code><code>
<b>[index </b><em>ïåðåìåííàÿ</em><strong>]</strong>
<b>do</b><br>
&nbsp; </code><code class="codeit">îïåðàòîð</code></p>
</blockquote>
<p>èëè</p>
<blockquote>
<p><code><b>foreach</b> <strong>var</strong> </code><code class="codeit">ïåðåìåííàÿ</code><code> <b>in</b> </code><code class="codeit">êîíòåéíåð</code><code>
<b>[index </b><em>ïåðåìåííàÿ</em><strong>]</strong>
<b>do</b><br>
&nbsp; </code><code class="codeit">îïåðàòîð</code></p>
</blockquote>
@ -40,8 +44,11 @@
äîëæíà èìåòü òèï, <strong>ñîâïàäàþùèé</strong> ñ òèïîì ýëåìåíòîâ êîíòåéíåðà
(åñëè êîíòåéíåð óäîâëåòâîðÿåò èíòåðôåéñó
<code>IEnumerable</code>, òî ýòî òèï <code>object</code>). Â ïîñëåäíåé ôîðìå
<code>foreach</code> ňčď ďĺđĺěĺííîé öčęëŕ ŕâňîâűâîäčňń˙ ďî ňčďó ýëĺěĺíňîâ
<code><strong>foreach</strong></code> òèï ïåðåìåííîé öèêëà àâòîâûâîäèòñÿ ïî òèïó ýëåìåíòîâ
êîíòåéíåðà.</p>
<p>Íåîáÿçàòåëüíàÿ ÷àñòü <code>
<b>index </b><em>ïåðåìåííàÿ</em></code> ââîäèò ïåðåìåííóþ, êîòîðàÿ õðàíèò íà
êàæäîé èòåðàöèè èíäåêñ ýëåìåíòà êîíòåéíåðà (ýëåìåíòû èíäåêñèðóþòñÿ ñ íóëÿ).</p>
<p>Ïåðåìåííàÿ öèêëà ïðîáåãàåò âñå
çíà÷åíèÿ ýëåìåíòîâ êîíòåéíåðà è äëÿ êàæäîãî çíà÷åíèÿ ïåðåìåííîé
öèêëà âûïîëíÿåòñÿ òåëî öèêëà. Èçìåíåíèå ïåðåìåííîé öèêëà

View file

@ -8,9 +8,9 @@
<param name="Keyword" value="Rename"></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>procedure</b> Assign(f: ôàéë; name: string);</code>
<table border=0 cellpadding=5><tr><td><code><b>procedure</b> Assign(f: ôàéë; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ ôàéëîì íà äèñêå</td></tr>
<tr><td><code><b>procedure</b> AssignFile(f: ôàéë; name: string);</code>
<tr><td><code><b>procedure</b> AssignFile(f: ôàéë; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ ôàéëîì íà äèñêå</td></tr>
<tr><td><code><b>procedure</b> Close(f: ôàéë);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàêðûâàåò ôàéë</td></tr>

View file

@ -7,17 +7,17 @@
<param name="Keyword" value="ExtractFilePath"></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> ExpandFileName(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîëíîå èìÿ ôàéëà fname</td></tr>
<tr><td><code><b>function</b> ExtractFileDir(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò èìÿ äèñêà è ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
<tr><td><code><b>function</b> ExtractFileDrive(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
<tr><td><code><b>function</b> ExtractFileExt(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ðàñøèðåíèå èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
<tr><td><code><b>function</b> ExtractFileName(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò èìÿ ôàéëà èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
<tr><td><code><b>function</b> ExtractFilePath(fname: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
<table border=0 cellpadding=5><tr><td><code><b>function</b> ExpandFileName(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîëíîå èìÿ ôàéëà fileName</td></tr>
<tr><td><code><b>function</b> ExtractFileDir(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò èìÿ äèñêà è ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
<tr><td><code><b>function</b> ExtractFileDrive(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
<tr><td><code><b>function</b> ExtractFileExt(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ðàñøèðåíèå èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
<tr><td><code><b>function</b> ExtractFileName(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò èìÿ ôàéëà èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
<tr><td><code><b>function</b> ExtractFilePath(fileName: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
</table>
</body></HTML>

View file

@ -13,20 +13,20 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает количество элементов в двоичном файле</td></tr>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает двоичный файл на чтение и запись.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; name: string);</code>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; name: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; fileName: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое. Если файл существовал, он обнуляется.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; name: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое. Если файл существовал, он обнуляется.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; name: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; fileName: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
<tr><td><code><b>procedure</b> Seek(f: двоичный файл; n: int64);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Устанавливает текущую позицию файлового указателя в двоичном файле на элемент с данным номером</td></tr>
<tr><td><code><b>procedure</b> Truncate(f: двоичный файл);</code>

View file

@ -21,26 +21,26 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на дополнение в кодировке Windows</td></tr>
<tr><td><code><b>procedure</b> Append(f: Text; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на дополнение в указанной кодировке</td></tr>
<tr><td><code><b>procedure</b> Append(f: Text; name: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà äîïîëíåíèå â êîäèðîâêå Windows</td></tr>
<tr><td><code><b>procedure</b> Append(f: Text; name: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà äîïîëíåíèå â óêàçàííîé êîäèðîâêå</td></tr>
<tr><td><code><b>procedure</b> Append(f: Text; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на дополнение в кодировке Windows</td></tr>
<tr><td><code><b>procedure</b> Append(f: Text; fileName: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на дополнение в указанной кодировке</td></tr>
<tr><td><code><b>function</b> Eoln(f: Text): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает True, если в файле достигнут конец строки</td></tr>
<tr><td><code><b>procedure</b> Flush(f: Text);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Записывает содержимое буфера файла на диск</td></tr>
<tr><td><code><b>function</b> OpenAppend(fname: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà äîïîëíåíèå â êîäèðîâêå Windows</td></tr>
<tr><td><code><b>function</b> OpenAppend(fname: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà äîïîëíåíèå â óêàçàííîé êîäèðîâêå</td></tr>
<tr><td><code><b>function</b> OpenRead(fname: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà ÷òåíèå â êîäèðîâêå Windows</td></tr>
<tr><td><code><b>function</b> OpenRead(fname: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà ÷òåíèå â óêàçàííîé êîäèðîâêå</td></tr>
<tr><td><code><b>function</b> OpenWrite(fname: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà çàïèñü â êîäèðîâêå Windows</td></tr>
<tr><td><code><b>function</b> OpenWrite(fname: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà çàïèñü â óêàçàííîé êîäèðîâêå</td></tr>
<tr><td><code><b>function</b> OpenAppend(fileName: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на дополнение в кодировке Windows</td></tr>
<tr><td><code><b>function</b> OpenAppend(fileName: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на дополнение в указанной кодировке</td></tr>
<tr><td><code><b>function</b> OpenRead(fileName: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на чтение в кодировке Windows</td></tr>
<tr><td><code><b>function</b> OpenRead(fileName: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на чтение в указанной кодировке</td></tr>
<tr><td><code><b>function</b> OpenWrite(fileName: string): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на запись в кодировке Windows</td></tr>
<tr><td><code><b>function</b> OpenWrite(fileName: string; en: Encoding): Text;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возвращает текстовый файл с именем fileName, открытый на запись в указанной кодировке</td></tr>
<tr><td><code><b>function</b> ReadAllLines(path: string): <b>array</b> <b>of</b> string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает файл, считывает из него строки в кодировке Windows в виде массива строк, после чего закрывает файл</td></tr>
<tr><td><code><b>function</b> ReadAllLines(path: string; en: Encoding): <b>array</b> <b>of</b> string;</code>
@ -57,18 +57,18 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на чтение в кодировке Windows</td></tr>
<tr><td><code><b>procedure</b> Reset(f: Text; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на чтение в указанной кодировке</td></tr>
<tr><td><code><b>procedure</b> Reset(f: Text; name: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà ÷òåíèå â êîäèðîâêå Windows</td></tr>
<tr><td><code><b>procedure</b> Reset(f: Text; name: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà ÷òåíèå â óêàçàííîé êîäèðîâêå</td></tr>
<tr><td><code><b>procedure</b> Reset(f: Text; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на чтение в кодировке Windows</td></tr>
<tr><td><code><b>procedure</b> Reset(f: Text; fileName: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на чтение в указанной кодировке</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на запись в кодировке Windows.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Открывает текстовый файл на запись в указанной кодировке.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text; name: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë f íà çàïèñü â êîäèðîâêå Windows.Åñëè ôàéë ñóùåñòâîâàë - îí îáíóëÿåòñÿ, åñëè íåò - ñîçäàåòñÿ ïóñòîé</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text; name: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë f íà çàïèñü â óêàçàííîé êîäèðîâêå.Åñëè ôàéë ñóùåñòâîâàë - îí îáíóëÿåòñÿ, åñëè íåò - ñîçäàåòñÿ ïóñòîé</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text; fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную с именем файла fileName и открывает текстовый файл f на запись в кодировке Windows.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
<tr><td><code><b>procedure</b> Rewrite(f: Text; fileName: string; en: Encoding);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Связывает файловую переменную f с именем файла fileName и открывает текстовый файл f на запись в указанной кодировке.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
<tr><td><code><b>function</b> SeekEof(f: Text): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Пропускает пробельные символы, после чего возвращает True, если достигнут конец файла</td></tr>
<tr><td><code><b>function</b> SeekEoln(f: Text): boolean;</code>

View file

@ -37,8 +37,8 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûâîäèò â ñïåöèàëüíîì îêíå ñòåê âûçîâîâ ïîäïðîãðàìì åñëè óñëîâèå íå âûïîëíÿåòñÿ</td></tr>
<tr><td><code><b>procedure</b> Assert(cond: boolean; message: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âûâîäèò â ñïåöèàëüíîì îêíå äèàãíîñòè÷åñêîå ñîîáùåíèå è ñòåê âûçîâîâ ïîäïðîãðàìì åñëè óñëîâèå íå âûïîëíÿåòñÿ</td></tr>
<tr><td><code><b>function</b> ChangeFileNameExtension(name, newext: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Èçìåíÿåò ðàñøèðåíèå ôàéëà ñ èìåíåì name íà newext</td></tr>
<tr><td><code><b>function</b> ChangeFileNameExtension(fileName, newExt: string): string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Èçìåíÿåò ðàñøèðåíèå ôàéëà ñ èìåíåì fileName íà newExt</td></tr>
<tr><td><code><b>procedure</b> ChDir(s: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ìåíÿåò òåêóùèé êàòàëîã</td></tr>
<tr><td><code><b>function</b> CreateDir(s: string): boolean;</code>
@ -63,16 +63,16 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èìåí êàòàëîãîâ ïî çàäàííîìó ïóòè</td></tr>
<tr><td><code><b>function</b> EnumerateFiles(path: string; searchPattern: string := '*.*'): <b>sequence </b> <b>of</b> string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èìåí ôàéëîâ ïî çàäàííîìó ïóòè, ñîîòâåòñòâóþùèõ øàáëîíó ïîèñêà</td></tr>
<tr><td><code><b>procedure</b> Exec(filename: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename</td></tr>
<tr><td><code><b>procedure</b> Exec(filename: string; args: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
<tr><td><code><b>procedure</b> Execute(filename: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename</td></tr>
<tr><td><code><b>procedure</b> Execute(filename: string; args: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
<tr><td><code><b>function</b> FileExists(name: string): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò True, åñëè ôàéë ñ èìåíåì name ñóùåñòâóåò</td></tr>
<tr><td><code><b>procedure</b> Exec(fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName</td></tr>
<tr><td><code><b>procedure</b> Exec(fileName: string; args: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
<tr><td><code><b>procedure</b> Execute(fileName: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName</td></tr>
<tr><td><code><b>procedure</b> Execute(fileName: string; args: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
<tr><td><code><b>function</b> FileExists(fileName: string): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò True, åñëè ôàéë ñ èìåíåì fileName ñóùåñòâóåò</td></tr>
<tr><td><code><b>function</b> GetCurrentDir: string;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò òåêóùèé êàòàëîã</td></tr>
<tr><td><code><b>function</b> GetDir: string;</code>
@ -101,8 +101,8 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïðåîáðàçóåò óêàçàòåëü ê ñòðîêîâîìó ïðåäñòàâëåíèþ</td></tr>
<tr><td><code><b>function</b> RemoveDir(s: string): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Óäàëÿåò êàòàëîã. Âîçâðàùàåò True, åñëè êàòàëîã óñïåøíî óäàëåí</td></tr>
<tr><td><code><b>function</b> RenameFile(name, newname: string): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïåðåèìåíîâûâàåò ôàéë name, äàâàÿ åìó íîâîå èìÿ newname. Âîçâðàùàåò True, åñëè ôàéë óñïåøíî ïåðåèìåíîâàí</td></tr>
<tr><td><code><b>function</b> RenameFile(fileName, newfileName: string): boolean;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïåðåèìåíîâûâàåò ôàéë fileName, äàâàÿ åìó íîâîå èìÿ newfileName. Âîçâðàùàåò True, åñëè ôàéë óñïåøíî ïåðåèìåíîâàí</td></tr>
<tr><td><code><b>procedure</b> RmDir(s: string);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Óäàëÿåò êàòàëîã</td></tr>
<tr><td><code><b>function</b> SetCurrentDir(s: string): boolean;</code>

View file

@ -9,7 +9,7 @@
<param name="Keyword" value="WritelnFormat"></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> Deserialize(filename: string): object;</code>
<table border=0 cellpadding=5><tr><td><code><b>function</b> Deserialize(fileName: string): object;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Десериализует объект из файла</td></tr>
<tr><td><code><b>procedure</b> Print(a,b,...);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выводит значения a,b,... на экран, после каждого значения выводит пробел</td></tr>
@ -19,7 +19,7 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выводит значения a,b,... на экран, после каждого значения выводит пробел и переходит на новую строку</td></tr>
<tr><td><code><b>procedure</b> Println(f: Text; a,b,...);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выводит значения a,b,... в текстовый файл f, после каждого значения выводит пробел и переходит на новую строку</td></tr>
<tr><td><code><b>procedure</b> Serialize(filename: string; obj: object);</code>
<tr><td><code><b>procedure</b> Serialize(fileName: string; obj: object);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Сериализует объект в файл (объект должен иметь атрибут [Serializable])</td></tr>
<tr><td><code><b>procedure</b> Write(a,b,...);</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Выводит значения a,b,... на экран</td></tr>

View file

@ -35,7 +35,7 @@ uses using var where while with xor</code></b></p>
<p>Ряд слов является <i><b><font color="#ff0000">контекстно ключевыми </font></b></i>
(они являются ключевыми только в некотором контексте): </p>
<p><b><code>abstract default external forward internal on overload override
params private protected public read reintroduce unit virtual write</code></b></p>
params private protected public read reintroduce unit virtual write step index</code></b></p>
<p>Контекстно ключевые слова могут использоваться в качестве имен.</p>
<p>Некоторые ключевые слова совпадают с важнейшими именами платформы .NET.
Поэтому в <b>PascalABC.NET</b>

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-G8V08V4
// DateTime: 17.02.2022 17:47:15
// DateTime: 23.02.2022 10:29:10
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>
@ -1994,6 +1994,7 @@ string cur_yytext = yytext;
case (int)Tokens.tkInternal:
case (int)Tokens.tkRead:
case (int)Tokens.tkWrite:
case (int)Tokens.tkIndex:
yylval = new Union();
yylval.id = new ident(cur_yytext,currentLexLocation);
break;

View file

@ -408,6 +408,7 @@ UNICODEARROW \x890
case (int)Tokens.tkInternal:
case (int)Tokens.tkRead:
case (int)Tokens.tkWrite:
case (int)Tokens.tkIndex:
yylval = new Union();
yylval.id = new ident(cur_yytext,currentLexLocation);
break;

View file

@ -41,7 +41,8 @@
%token <ti> tkSequence tkYield tkShortProgram tkVertParen tkShortSFProgram
%token <id> tkNew
%token <id> tkOn
%token <id> tkName tkPrivate tkProtected tkPublic tkInternal tkRead tkWrite
%token <id> tkName tkPrivate tkProtected tkPublic tkInternal tkRead tkWrite
%token <id> tkIndex
%token <ti> tkParseModeExpression tkParseModeStatement tkParseModeType tkBegin tkEnd
%token <ti> tkAsmBody tkILCode tkError INVISIBLE
%token <ti> tkRepeat tkUntil tkDo tkComma tkFinally tkTry
@ -53,7 +54,7 @@
%token <id> tkAbstract tkForward tkOverload tkReintroduce tkOverride tkVirtual tkExtensionMethod
%token <ex> tkInteger tkBigInteger tkFloat tkHex
%token <id> tkUnknown
%token <ti> tkStep
%token <ti> tkStep
%type <ti> unit_key_word class_or_static
%type <stn> assignment
@ -185,6 +186,7 @@
%type <stn> const_pattern_expression pattern deconstruction_or_const_pattern pattern_optional_var collection_pattern tuple_pattern collection_pattern_list_item tuple_pattern_item collection_pattern_var_item match_with pattern_case pattern_cases pattern_out_param pattern_out_param_optional_var
%type <ob> pattern_out_param_list pattern_out_param_list_optional_var collection_pattern_expr_list tuple_pattern_item_list const_pattern_expr_list
%type <stn> var_with_init_for_expr_with_let var_with_init_for_expr_with_let_list
%type <id> index_or_nothing
%%
@ -3028,39 +3030,46 @@ lock_stmt
}
;
index_or_nothing
: tkIndex tkIdentifier
{ $$ = $2; }
|
{ $$ = null; }
;
foreach_stmt
: tkForeach identifier foreach_stmt_ident_dype_opt tkIn expr_l1 tkDo unlabelled_stmt
: tkForeach identifier foreach_stmt_ident_dype_opt tkIn expr_l1 index_or_nothing tkDo unlabelled_stmt
{
$$ = new foreach_stmt($2, $3, $5, $7 as statement, @$);
$$ = new foreach_stmt($2, $3, $5, $8 as statement, $6, @$);
if ($3 == null)
parsertools.AddWarningFromResource("USING_UNLOCAL_FOREACH_VARIABLE", $2.source_context);
}
| tkForeach tkVar identifier tkColon type_ref tkIn expr_l1 tkDo unlabelled_stmt
| tkForeach tkVar identifier tkColon type_ref tkIn expr_l1 index_or_nothing tkDo unlabelled_stmt
{
$$ = new foreach_stmt($3, $5, $7, $9 as statement, @$);
$$ = new foreach_stmt($3, $5, $7, $10 as statement, $8, @$);
}
| tkForeach tkVar identifier tkIn expr_l1 tkDo unlabelled_stmt
| tkForeach tkVar identifier tkIn expr_l1 index_or_nothing tkDo unlabelled_stmt
{
$$ = new foreach_stmt($3, new no_type_foreach(), $5, (statement)$7, @$);
$$ = new foreach_stmt($3, new no_type_foreach(), $5, (statement)$8, $6, @$);
}
| tkForeach tkVar tkRoundOpen ident_list tkRoundClose tkIn expr_l1 tkDo unlabelled_stmt // ñàõàðíîå ïðàâèëî
| tkForeach tkVar tkRoundOpen ident_list tkRoundClose tkIn expr_l1 index_or_nothing tkDo unlabelled_stmt // ñàõàðíîå ïðàâèëî
{
if (parsertools.build_tree_for_formatter)
{
var il = $4 as ident_list;
il.source_context = LexLocation.MergeAll(@4,@5); // íóæíî äëÿ ôîðìàòèðîâàíèÿ
$$ = new foreach_stmt_formatting(il,$7,$9 as statement,@$);
$$ = new foreach_stmt_formatting(il,$7,$10 as statement,$8,@$);
}
else
{
// Åñòü ïðîáëåìà - íåïîíÿòíî, ãäå çäåñü ñäåëàòü ñåìàíò÷åñêèé óçåä äëÿ ïðîâåðêè
// Åñòü ïðîáëåìà - íåïîíÿòíî, ãäå çäåñü ñäåëàòü ñåìàíò÷åñêèé óçåë äëÿ ïðîâåðêè
// Ïðîâåðèòü ìîæíî è â foreach, íî ãäå-òî äîëæåí áûòü ìàðêåð, ÷òî ýòî ñàõàðíûé óçåë
// Íàïðèìåð, èäåíòèôèêàòîð #fe - íî ýòî ïëîõàÿ èäåÿ
var id = NewId("#fe",@4);
var tttt = new assign_var_tuple($4 as ident_list, id, @$);
statement_list nine = $9 is statement_list ? $9 as statement_list : new statement_list($9 as statement,@9);
statement_list nine = $10 is statement_list ? $10 as statement_list : new statement_list($10 as statement,@9);
nine.Insert(0,tttt);
var fe = new foreach_stmt(id, new no_type_foreach(), $7, nine, @$);
var fe = new foreach_stmt(id, new no_type_foreach(), $7, nine, $8, @$);
fe.ext = $4 as ident_list;
$$ = fe;
}
@ -4477,6 +4486,8 @@ identifier
{ $$ = $1; }
| tkStep
{ $$ = new ident($1.text, @$); }
| tkIndex
{ $$ = $1; }
;
identifier_or_keyword

File diff suppressed because it is too large Load diff

View file

@ -146,6 +146,7 @@ namespace GPPGParserScanner
keywords.Add(Convert("namespace"), (int)Tokens.tkNamespace);
keywords.Add(Convert("static"), (int)Tokens.tkStatic);
keywords.Add(Convert("step"), (int)Tokens.tkStep);
keywords.Add(Convert("index"), (int)Tokens.tkIndex);
}
static Keywords()

View file

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

View file

@ -1 +1 @@
3.8.2.3081
3.8.2.3085

View file

@ -1 +1 @@
!define VERSION '3.8.2.3081'
!define VERSION '3.8.2.3085'

View file

@ -3310,6 +3310,7 @@ namespace PascalABCCompiler.SyntaxTree
visit(foreach_stmt.type_name);
visit(foreach_stmt.in_what);
visit(foreach_stmt.stmt);
visit(foreach_stmt.index);
post_do_visit(_foreach_stmt);
}
@ -4270,6 +4271,7 @@ namespace PascalABCCompiler.SyntaxTree
visit(foreach_stmt_formatting.il);
visit(foreach_stmt_formatting.in_what);
visit(foreach_stmt_formatting.stmt);
visit(foreach_stmt_formatting.index);
post_do_visit(_foreach_stmt_formatting);
}

View file

@ -2729,6 +2729,7 @@ namespace PascalABCCompiler.SyntaxTree
_foreach_stmt.type_name = _read_node() as type_definition;
_foreach_stmt.in_what = _read_node() as expression;
_foreach_stmt.stmt = _read_node() as statement;
_foreach_stmt.index = _read_node() as ident;
}
@ -4477,6 +4478,7 @@ namespace PascalABCCompiler.SyntaxTree
_foreach_stmt_formatting.il = _read_node() as ident_list;
_foreach_stmt_formatting.in_what = _read_node() as expression;
_foreach_stmt_formatting.stmt = _read_node() as statement;
_foreach_stmt_formatting.index = _read_node() as ident;
}

View file

@ -4019,6 +4019,15 @@ namespace PascalABCCompiler.SyntaxTree
bw.Write((byte)1);
_foreach_stmt.stmt.visit(this);
}
if (_foreach_stmt.index == null)
{
bw.Write((byte)0);
}
else
{
bw.Write((byte)1);
_foreach_stmt.index.visit(this);
}
}
@ -7009,6 +7018,15 @@ namespace PascalABCCompiler.SyntaxTree
bw.Write((byte)1);
_foreach_stmt_formatting.stmt.visit(this);
}
if (_foreach_stmt_formatting.index == null)
{
bw.Write((byte)0);
}
else
{
bw.Write((byte)1);
_foreach_stmt_formatting.index.visit(this);
}
}

View file

@ -30344,24 +30344,26 @@ namespace PascalABCCompiler.SyntaxTree
///<summary>
///Конструктор с параметрами.
///</summary>
public foreach_stmt(ident _identifier,type_definition _type_name,expression _in_what,statement _stmt)
public foreach_stmt(ident _identifier,type_definition _type_name,expression _in_what,statement _stmt,ident _index)
{
this._identifier=_identifier;
this._type_name=_type_name;
this._in_what=_in_what;
this._stmt=_stmt;
this._index=_index;
FillParentsInDirectChilds();
}
///<summary>
///Конструктор с параметрами.
///</summary>
public foreach_stmt(ident _identifier,type_definition _type_name,expression _in_what,statement _stmt,SourceContext sc)
public foreach_stmt(ident _identifier,type_definition _type_name,expression _in_what,statement _stmt,ident _index,SourceContext sc)
{
this._identifier=_identifier;
this._type_name=_type_name;
this._in_what=_in_what;
this._stmt=_stmt;
this._index=_index;
source_context = sc;
FillParentsInDirectChilds();
}
@ -30369,6 +30371,7 @@ namespace PascalABCCompiler.SyntaxTree
protected type_definition _type_name;
protected expression _in_what;
protected statement _stmt;
protected ident _index;
///<summary>
///
@ -30438,6 +30441,23 @@ namespace PascalABCCompiler.SyntaxTree
}
}
///<summary>
///
///</summary>
public ident index
{
get
{
return _index;
}
set
{
_index=value;
if (_index != null)
_index.Parent = this;
}
}
/// <summary> Создает копию узла </summary>
public override syntax_tree_node Clone()
@ -30471,6 +30491,11 @@ namespace PascalABCCompiler.SyntaxTree
copy.stmt = (statement)stmt.Clone();
copy.stmt.Parent = copy;
}
if (index != null)
{
copy.index = (ident)index.Clone();
copy.index.Parent = copy;
}
return copy;
}
@ -30493,6 +30518,8 @@ namespace PascalABCCompiler.SyntaxTree
in_what.Parent = this;
if (stmt != null)
stmt.Parent = this;
if (index != null)
index.Parent = this;
}
///<summary> Заполняет поля Parent во всем поддереве </summary>
@ -30504,6 +30531,7 @@ namespace PascalABCCompiler.SyntaxTree
type_name?.FillParentsInAllChilds();
in_what?.FillParentsInAllChilds();
stmt?.FillParentsInAllChilds();
index?.FillParentsInAllChilds();
}
///<summary>
@ -30513,7 +30541,7 @@ namespace PascalABCCompiler.SyntaxTree
{
get
{
return 4;
return 5;
}
}
///<summary>
@ -30523,7 +30551,7 @@ namespace PascalABCCompiler.SyntaxTree
{
get
{
return 4;
return 5;
}
}
///<summary>
@ -30545,6 +30573,8 @@ namespace PascalABCCompiler.SyntaxTree
return in_what;
case 3:
return stmt;
case 4:
return index;
}
return null;
}
@ -30566,6 +30596,9 @@ namespace PascalABCCompiler.SyntaxTree
case 3:
stmt = (statement)value;
break;
case 4:
index = (ident)value;
break;
}
}
}
@ -54535,28 +54568,31 @@ namespace PascalABCCompiler.SyntaxTree
///<summary>
///Конструктор с параметрами.
///</summary>
public foreach_stmt_formatting(ident_list _il,expression _in_what,statement _stmt)
public foreach_stmt_formatting(ident_list _il,expression _in_what,statement _stmt,ident _index)
{
this._il=_il;
this._in_what=_in_what;
this._stmt=_stmt;
this._index=_index;
FillParentsInDirectChilds();
}
///<summary>
///Конструктор с параметрами.
///</summary>
public foreach_stmt_formatting(ident_list _il,expression _in_what,statement _stmt,SourceContext sc)
public foreach_stmt_formatting(ident_list _il,expression _in_what,statement _stmt,ident _index,SourceContext sc)
{
this._il=_il;
this._in_what=_in_what;
this._stmt=_stmt;
this._index=_index;
source_context = sc;
FillParentsInDirectChilds();
}
protected ident_list _il;
protected expression _in_what;
protected statement _stmt;
protected ident _index;
///<summary>
///
@ -54609,6 +54645,23 @@ namespace PascalABCCompiler.SyntaxTree
}
}
///<summary>
///
///</summary>
public ident index
{
get
{
return _index;
}
set
{
_index=value;
if (_index != null)
_index.Parent = this;
}
}
/// <summary> Создает копию узла </summary>
public override syntax_tree_node Clone()
@ -54637,6 +54690,11 @@ namespace PascalABCCompiler.SyntaxTree
copy.stmt = (statement)stmt.Clone();
copy.stmt.Parent = copy;
}
if (index != null)
{
copy.index = (ident)index.Clone();
copy.index.Parent = copy;
}
return copy;
}
@ -54657,6 +54715,8 @@ namespace PascalABCCompiler.SyntaxTree
in_what.Parent = this;
if (stmt != null)
stmt.Parent = this;
if (index != null)
index.Parent = this;
}
///<summary> Заполняет поля Parent во всем поддереве </summary>
@ -54667,6 +54727,7 @@ namespace PascalABCCompiler.SyntaxTree
il?.FillParentsInAllChilds();
in_what?.FillParentsInAllChilds();
stmt?.FillParentsInAllChilds();
index?.FillParentsInAllChilds();
}
///<summary>
@ -54676,7 +54737,7 @@ namespace PascalABCCompiler.SyntaxTree
{
get
{
return 3;
return 4;
}
}
///<summary>
@ -54686,7 +54747,7 @@ namespace PascalABCCompiler.SyntaxTree
{
get
{
return 3;
return 4;
}
}
///<summary>
@ -54706,6 +54767,8 @@ namespace PascalABCCompiler.SyntaxTree
return in_what;
case 2:
return stmt;
case 3:
return index;
}
return null;
}
@ -54724,6 +54787,9 @@ namespace PascalABCCompiler.SyntaxTree
case 2:
stmt = (statement)value;
break;
case 3:
index = (ident)value;
break;
}
}
}

View file

@ -1884,6 +1884,7 @@
<SyntaxField Name="type_name" SyntaxType="type_definition" />
<SyntaxField Name="in_what" SyntaxType="expression" />
<SyntaxField Name="stmt" SyntaxType="statement" />
<SyntaxField Name="index" SyntaxType="ident" />
</Fields>
<Methods />
<Tags>
@ -3306,6 +3307,7 @@
<SyntaxField Name="il" SyntaxType="ident_list" />
<SyntaxField Name="in_what" SyntaxType="expression" />
<SyntaxField Name="stmt" SyntaxType="statement" />
<SyntaxField Name="index" SyntaxType="ident" />
</Fields>
<Methods />
<Tags>
@ -3888,11 +3890,13 @@
<HelpData Key="foreach_stmt.ext" Value="" />
<HelpData Key="foreach_stmt.identifier" Value="" />
<HelpData Key="foreach_stmt.in_what" Value="" />
<HelpData Key="foreach_stmt.index" Value="" />
<HelpData Key="foreach_stmt.stmt" Value="" />
<HelpData Key="foreach_stmt.type_name" Value="" />
<HelpData Key="foreach_stmt_formatting" Value="// для форматирования только" />
<HelpData Key="foreach_stmt_formatting.il" Value="" />
<HelpData Key="foreach_stmt_formatting.in_what" Value="" />
<HelpData Key="foreach_stmt_formatting.index" Value="" />
<HelpData Key="foreach_stmt_formatting.stmt" Value="" />
<HelpData Key="foreach_stmt_formatting.type_name" Value="" />
<HelpData Key="formal_parameters" Value="" />

View file

@ -55,6 +55,8 @@ namespace SyntaxVisitors.SugarVisitors
var un = UniqueNumStr();
var a = new ident("#a" + un, fn.initial_value.source_context);
var b = new ident("#b" + un, fn.finish_value.source_context);
var oa = new ident("#oa" + un, a.source_context);
var ob = new ident("#ob" + un, b.source_context);
var h = new ident("#h" + un, fn.increment_value.source_context);
var n = new ident("#n" + un, a.source_context);
var i = fn.loop_variable; //new ident(iname, a.source_context);
@ -70,7 +72,19 @@ namespace SyntaxVisitors.SugarVisitors
var mcOrdb = new method_call(new dot_node(new ident("PABCSystem"), new ident("Ord")), new expression_list(b), b.source_context);
var mcOrda = new method_call(new dot_node(new ident("PABCSystem"), new ident("Ord")), new expression_list(a), a.source_context);
var sub = new bin_expr(mcOrdb, mcOrda, Operators.Minus, b.source_context);
var oavar = new var_statement(oa, mcOrda, oa.source_context);
var obvar = new var_statement(ob, mcOrdb, ob.source_context);
var bexhg0 = new bin_expr(h.TypedClone(), new int32_const(0), Operators.Greater, h.source_context);
var bexhl0 = new bin_expr(h.TypedClone(), new int32_const(0), Operators.Less, h.source_context);
var bexbla = new bin_expr(b.TypedClone(), a.TypedClone(), Operators.Less, b.source_context);
var bexalb = new bin_expr(a.TypedClone(), b.TypedClone(), Operators.Less, a.source_context);
var bexand1 = new bin_expr(bexhg0, bexbla, Operators.LogicalAND, h.source_context);
var bexand2 = new bin_expr(bexhl0, bexalb, Operators.LogicalAND, h.source_context);
var bexor = new bin_expr(bexand1, bexand2, Operators.LogicalOR, h.source_context);
var assn0 = new assign(n.TypedClone(), new int32_const(0), Operators.Assignment, n.source_context);
var ifn = new if_node(bexor, assn0, null, bexor.source_context);
var sub = new bin_expr(ob.TypedClone(), oa.TypedClone(), Operators.Minus, b.source_context);
var div = new bin_expr(sub, h, Operators.IntegerDivision, b.source_context);
var nexpr = new bin_expr(div, new int32_const(1), Operators.Plus, b.source_context);
var nvar = new var_statement(n, nexpr, n.source_context);
@ -86,7 +100,7 @@ namespace SyntaxVisitors.SugarVisitors
var semCheck1 = new semantic_check_sugared_statement_node(typeof(for_node), new List<syntax_tree_node> { a,b }, a.source_context);
var for_st = new for_node(j, new int32_const(1), n, stlist, fn.statements.source_context);
var mainstlist = new statement_list(avar, bvar, semCheck1, hvar, nvar, ivar, for_st);
var mainstlist = new statement_list(avar, bvar, semCheck1, oavar, obvar, hvar, nvar, ifn, ivar, for_st);
mainstlist.source_context = avar.source_context;
ReplaceUsingParent(fn, mainstlist);
@ -111,7 +125,11 @@ namespace SyntaxVisitors.SugarVisitors
// семантика - b приводится к типу a
/* if h = 0 then
raise new ZeroStepException;
var n := (Ord(b) - Ord(a)) div h + 1;
var ob := Ord(b);
var oa := Ord(a);
var n := (ob - oa) div h + 1;
if h > 0 and b < a or h < 0 and b > a then
n := 0;
var i := a;
for var j := 1 to n do
begin
@ -135,5 +153,23 @@ namespace SyntaxVisitors.SugarVisitors
visit(fn);*/
//}
public override void visit(foreach_stmt fe)
{
if (fe.index != null && !fe.index.name.StartsWith("##")) // Повторно обходить ## не надо - он для семантики
{
var newindex = new ident("##" + fe.index, fe.index.source_context); // нам нужно это имя на семантике для контроля неизменения переменной внутри цикла
var indexvar = new var_statement(fe.index, new int32_const(0), fe.index.source_context);
var IncIndex = new assign(fe.index.TypedClone(), new int32_const(1), Operators.AssignmentAddition);
var forstat = new statement_list(fe.stmt, IncIndex);
var fe2 = new foreach_stmt(fe.identifier, fe.type_name, fe.in_what, forstat, newindex, fe.source_context);
var stat = new statement_list(indexvar,fe2);
ReplaceUsingParent(fe, stat);
ProcessNode(fe2.in_what);
ProcessNode(forstat.list[0]);
}
else DefaultVisit(fe);
}
}
}

View file

@ -36,7 +36,7 @@ namespace SyntaxVisitors
{
var id = NewVarName();
id.source_context = yn.source_context;
var fe = new foreach_stmt(id, new no_type_foreach(), yn.ex, new yield_node(id,yn.source_context),yn.source_context);
var fe = new foreach_stmt(id, new no_type_foreach(), yn.ex, new yield_node(id,yn.source_context),null,yn.source_context);
ReplaceStatement(yn, fe);
}
}

View file

@ -15,4 +15,24 @@ begin
for var i:=Mon to Sat step 2 do
ld.Add(i);
Assert(ld.SequenceEqual(Arr(Mon,Wed,Fri)));
var l1 := new List<integer>;
for var i:=1 to 0 step 1 do
l1.Add(i);
Assert(l1.Count = 0);
var l2 := new List<integer>;
for var i:=1 to 0 step 2 do
l2.Add(i);
Assert(l2.Count = 0);
var l3 := new List<integer>;
for var i:=0 to 1 step -1 do
l3.Add(i);
Assert(l3.Count = 0);
var l4 := new List<integer>;
for var i:=0 to 1 step -2 do
l4.Add(i);
Assert(l4.Count = 0);
end.

View file

@ -174,7 +174,7 @@ namespace PascalABCCompiler.TreeConverter
if (context.is_in_cycle() && !SemanticRules.AllowChangeLoopVariable)
{
var_definition_node toAsVariable = GetLocalVariableFromAdressExpressionIfPossible(to);
if (toAsVariable != null && context.is_loop_variable(toAsVariable))
if (toAsVariable != null && context.is_loop_variable(toAsVariable) && _assign.source_context != null) // последнее - обрезает проверку для сгенерированного i += 1 в foreach ... index i
AddError(to.location, "CANNOT_ASSIGN_TO_LOOP_VARIABLE");
}
{

View file

@ -38,6 +38,15 @@ namespace PascalABCCompiler.TreeConverter
var_definition_node foreachVariable;
ForeachCheckAndConvert(_foreach_stmt, out foreachCollection, out foreachVariable);
definition_node dnind = null;
var_definition_node vdn = null;
if (_foreach_stmt.index != null && _foreach_stmt.index.name.StartsWith("##"))
{
dnind = context.check_name_node_type(_foreach_stmt.index.name.Remove(0, 2), get_location(_foreach_stmt.index),
general_node_type.variable_node);
vdn = (var_definition_node)dnind;
}
// SSM 29.07.16 - если in_what - одномерный массив, то заменить код foreach на for
// if (OptimizeForeachInCase1DArray(_foreach_stmt, foreachCollection)) return;
@ -48,9 +57,13 @@ namespace PascalABCCompiler.TreeConverter
context.enter_in_cycle(foreachNode);
context.loop_var_stack.Push(foreachVariable);
if (vdn != null)
context.loop_var_stack.Push(vdn);
context.enter_code_block_with_bind();
statement_node body = convert_strong(_foreach_stmt.stmt);
context.leave_code_block();
if (vdn != null)
context.loop_var_stack.Pop();
context.loop_var_stack.Pop();
context.leave_cycle();

Binary file not shown.