Реализован 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:
parent
6381b157af
commit
3240593d2e
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=8
|
||||
%REVISION%=3081
|
||||
%REVISION%=3085
|
||||
%COREVERSION%=2
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
6
InstallerSamples/WhatsNew/3_8_3/foreach_index.pas
Normal file
6
InstallerSamples/WhatsNew/3_8_3/foreach_index.pas
Normal 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.
|
|
@ -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>
|
||||
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>
|
||||
</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>
|
||||
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>
|
||||
write(c);</code></p>
|
||||
</blockquote>
|
||||
<p>Åñëè äëÿ öèêëà <code><b>for</b></code> ... <code><b>to</b></code>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
</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>
|
||||
</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>
|
||||
</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>Ïåðåìåííàÿ öèêëà ïðîáåãàåò âñå
|
||||
çíà÷åíèÿ ýëåìåíòîâ êîíòåéíåðà è äëÿ êàæäîãî çíà÷åíèÿ ïåðåìåííîé
|
||||
öèêëà âûïîëíÿåòñÿ òåëî öèêëà. Èçìåíåíèå ïåðåìåííîé öèêëà
|
||||
|
|
|
|||
|
|
@ -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> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ ôàéëîì íà äèñêå</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> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ ôàéëîì íà äèñêå</td></tr>
|
||||
<tr><td><code><b>procedure</b> Close(f: ôàéë);</code>
|
||||
<br> Çàêðûâàåò ôàéë</td></tr>
|
||||
|
|
|
|||
|
|
@ -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> Âîçâðàùàåò ïîëíîå èìÿ ôàéëà fname</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileDir(fname: string): string;</code>
|
||||
<br> Âûäåëÿåò èìÿ äèñêà è ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileDrive(fname: string): string;</code>
|
||||
<br> Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileExt(fname: string): string;</code>
|
||||
<br> Âûäåëÿåò ðàñøèðåíèå èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileName(fname: string): string;</code>
|
||||
<br> Âûäåëÿåò èìÿ ôàéëà èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFilePath(fname: string): string;</code>
|
||||
<br> Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fname</td></tr>
|
||||
<table border=0 cellpadding=5><tr><td><code><b>function</b> ExpandFileName(fileName: string): string;</code>
|
||||
<br> Âîçâðàùàåò ïîëíîå èìÿ ôàéëà fileName</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileDir(fileName: string): string;</code>
|
||||
<br> Âûäåëÿåò èìÿ äèñêà è ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileDrive(fileName: string): string;</code>
|
||||
<br> Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileExt(fileName: string): string;</code>
|
||||
<br> Âûäåëÿåò ðàñøèðåíèå èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFileName(fileName: string): string;</code>
|
||||
<br> Âûäåëÿåò èìÿ ôàéëà èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
|
||||
<tr><td><code><b>function</b> ExtractFilePath(fileName: string): string;</code>
|
||||
<br> Âûäåëÿåò ïóòü èç ïîëíîãî èìåíè ôàéëà fileName</td></tr>
|
||||
</table>
|
||||
</body></HTML>
|
||||
|
|
@ -13,20 +13,20 @@
|
|||
<br> Возвращает количество элементов в двоичном файле</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: двоичный файл);</code>
|
||||
<br> Открывает двоичный файл на чтение и запись.Двоичный файл - это либо типизированный файл 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> Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; en: Encoding);</code>
|
||||
<br> Открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; name: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: двоичный файл; fileName: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись в заданной кодировке.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл);</code>
|
||||
<br> Открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое. Если файл существовал, он обнуляется.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; name: string);</code>
|
||||
<br> Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; fileName: string);</code>
|
||||
<br> Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; en: Encoding);</code>
|
||||
<br> Открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое. Если файл существовал, он обнуляется.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; name: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с файлом name на диске и открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: двоичный файл; fileName: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с файлом fileName на диске и открывает двоичный файл на чтение и запись в заданной кодировке, при этом обнуляя его содержимое.Двоичный файл - это либо типизированный файл file of T, либо бестиповой файл file</td></tr>
|
||||
<tr><td><code><b>procedure</b> Seek(f: двоичный файл; n: int64);</code>
|
||||
<br> Устанавливает текущую позицию файлового указателя в двоичном файле на элемент с данным номером</td></tr>
|
||||
<tr><td><code><b>procedure</b> Truncate(f: двоичный файл);</code>
|
||||
|
|
|
|||
|
|
@ -21,26 +21,26 @@
|
|||
<br> Открывает текстовый файл на дополнение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Append(f: Text; en: Encoding);</code>
|
||||
<br> Открывает текстовый файл на дополнение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>procedure</b> Append(f: Text; name: string);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà äîïîëíåíèå â êîäèðîâêå Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Append(f: Text; name: string; en: Encoding);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà äîïîëíåíèå â óêàçàííîé êîäèðîâêå</td></tr>
|
||||
<tr><td><code><b>procedure</b> Append(f: Text; fileName: string);</code>
|
||||
<br> Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на дополнение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Append(f: Text; fileName: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на дополнение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>function</b> Eoln(f: Text): boolean;</code>
|
||||
<br> Возвращает True, если в файле достигнут конец строки</td></tr>
|
||||
<tr><td><code><b>procedure</b> Flush(f: Text);</code>
|
||||
<br> Записывает содержимое буфера файла на диск</td></tr>
|
||||
<tr><td><code><b>function</b> OpenAppend(fname: string): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà äîïîëíåíèå â êîäèðîâêå Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenAppend(fname: string; en: Encoding): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà äîïîëíåíèå â óêàçàííîé êîäèðîâêå</td></tr>
|
||||
<tr><td><code><b>function</b> OpenRead(fname: string): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà ÷òåíèå â êîäèðîâêå Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenRead(fname: string; en: Encoding): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà ÷òåíèå â óêàçàííîé êîäèðîâêå</td></tr>
|
||||
<tr><td><code><b>function</b> OpenWrite(fname: string): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà çàïèñü â êîäèðîâêå Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenWrite(fname: string; en: Encoding): Text;</code>
|
||||
<br> Âîçâðàùàåò òåêñòîâûé ôàéë ñ èìåíåì fname, îòêðûòûé íà çàïèñü â óêàçàííîé êîäèðîâêå</td></tr>
|
||||
<tr><td><code><b>function</b> OpenAppend(fileName: string): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на дополнение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenAppend(fileName: string; en: Encoding): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на дополнение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>function</b> OpenRead(fileName: string): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на чтение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenRead(fileName: string; en: Encoding): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на чтение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>function</b> OpenWrite(fileName: string): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на запись в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>function</b> OpenWrite(fileName: string; en: Encoding): Text;</code>
|
||||
<br> Возвращает текстовый файл с именем fileName, открытый на запись в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>function</b> ReadAllLines(path: string): <b>array</b> <b>of</b> string;</code>
|
||||
<br> Открывает файл, считывает из него строки в кодировке 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> Открывает текстовый файл на чтение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: Text; en: Encoding);</code>
|
||||
<br> Открывает текстовый файл на чтение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: Text; name: string);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà ÷òåíèå â êîäèðîâêå Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: Text; name: string; en: Encoding);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë íà ÷òåíèå â óêàçàííîé êîäèðîâêå</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: Text; fileName: string);</code>
|
||||
<br> Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на чтение в кодировке Windows</td></tr>
|
||||
<tr><td><code><b>procedure</b> Reset(f: Text; fileName: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с именем файла fileName и открывает текстовый файл на чтение в указанной кодировке</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text);</code>
|
||||
<br> Открывает текстовый файл на запись в кодировке Windows.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text; en: Encoding);</code>
|
||||
<br> Открывает текстовый файл на запись в указанной кодировке.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text; name: string);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë f íà çàïèñü â êîäèðîâêå Windows.Åñëè ôàéë ñóùåñòâîâàë - îí îáíóëÿåòñÿ, åñëè íåò - ñîçäàåòñÿ ïóñòîé</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text; name: string; en: Encoding);</code>
|
||||
<br> Ñâÿçûâàåò ôàéëîâóþ ïåðåìåííóþ f ñ èìåíåì ôàéëà name è îòêðûâàåò òåêñòîâûé ôàéë f íà çàïèñü â óêàçàííîé êîäèðîâêå.Åñëè ôàéë ñóùåñòâîâàë - îí îáíóëÿåòñÿ, åñëè íåò - ñîçäàåòñÿ ïóñòîé</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text; fileName: string);</code>
|
||||
<br> Связывает файловую переменную с именем файла fileName и открывает текстовый файл f на запись в кодировке Windows.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
|
||||
<tr><td><code><b>procedure</b> Rewrite(f: Text; fileName: string; en: Encoding);</code>
|
||||
<br> Связывает файловую переменную f с именем файла fileName и открывает текстовый файл f на запись в указанной кодировке.Если файл существовал - он обнуляется, если нет - создается пустой</td></tr>
|
||||
<tr><td><code><b>function</b> SeekEof(f: Text): boolean;</code>
|
||||
<br> Пропускает пробельные символы, после чего возвращает True, если достигнут конец файла</td></tr>
|
||||
<tr><td><code><b>function</b> SeekEoln(f: Text): boolean;</code>
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@
|
|||
<br> Âûâîäèò â ñïåöèàëüíîì îêíå ñòåê âûçîâîâ ïîäïðîãðàìì åñëè óñëîâèå íå âûïîëíÿåòñÿ</td></tr>
|
||||
<tr><td><code><b>procedure</b> Assert(cond: boolean; message: string);</code>
|
||||
<br> Âûâîäèò â ñïåöèàëüíîì îêíå äèàãíîñòè÷åñêîå ñîîáùåíèå è ñòåê âûçîâîâ ïîäïðîãðàìì åñëè óñëîâèå íå âûïîëíÿåòñÿ</td></tr>
|
||||
<tr><td><code><b>function</b> ChangeFileNameExtension(name, newext: string): string;</code>
|
||||
<br> Èçìåíÿåò ðàñøèðåíèå ôàéëà ñ èìåíåì name íà newext</td></tr>
|
||||
<tr><td><code><b>function</b> ChangeFileNameExtension(fileName, newExt: string): string;</code>
|
||||
<br> Èçìåíÿåò ðàñøèðåíèå ôàéëà ñ èìåíåì fileName íà newExt</td></tr>
|
||||
<tr><td><code><b>procedure</b> ChDir(s: string);</code>
|
||||
<br> Ìåíÿåò òåêóùèé êàòàëîã</td></tr>
|
||||
<tr><td><code><b>function</b> CreateDir(s: string): boolean;</code>
|
||||
|
|
@ -63,16 +63,16 @@
|
|||
<br> Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èìåí êàòàëîãîâ ïî çàäàííîìó ïóòè</td></tr>
|
||||
<tr><td><code><b>function</b> EnumerateFiles(path: string; searchPattern: string := '*.*'): <b>sequence </b> <b>of</b> string;</code>
|
||||
<br> Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èìåí ôàéëîâ ïî çàäàííîìó ïóòè, ñîîòâåòñòâóþùèõ øàáëîíó ïîèñêà</td></tr>
|
||||
<tr><td><code><b>procedure</b> Exec(filename: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename</td></tr>
|
||||
<tr><td><code><b>procedure</b> Exec(filename: string; args: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
|
||||
<tr><td><code><b>procedure</b> Execute(filename: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename</td></tr>
|
||||
<tr><td><code><b>procedure</b> Execute(filename: string; args: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì filename è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
|
||||
<tr><td><code><b>function</b> FileExists(name: string): boolean;</code>
|
||||
<br> Âîçâðàùàåò True, åñëè ôàéë ñ èìåíåì name ñóùåñòâóåò</td></tr>
|
||||
<tr><td><code><b>procedure</b> Exec(fileName: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName</td></tr>
|
||||
<tr><td><code><b>procedure</b> Exec(fileName: string; args: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
|
||||
<tr><td><code><b>procedure</b> Execute(fileName: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName</td></tr>
|
||||
<tr><td><code><b>procedure</b> Execute(fileName: string; args: string);</code>
|
||||
<br> Çàïóñêàåò ïðîãðàììó èëè äîêóìåíò ñ èìåíåì fileName è ïàðàìåòðàìè êîìàíäíîé ñòðîêè args</td></tr>
|
||||
<tr><td><code><b>function</b> FileExists(fileName: string): boolean;</code>
|
||||
<br> Âîçâðàùàåò True, åñëè ôàéë ñ èìåíåì fileName ñóùåñòâóåò</td></tr>
|
||||
<tr><td><code><b>function</b> GetCurrentDir: string;</code>
|
||||
<br> Âîçâðàùàåò òåêóùèé êàòàëîã</td></tr>
|
||||
<tr><td><code><b>function</b> GetDir: string;</code>
|
||||
|
|
@ -101,8 +101,8 @@
|
|||
<br> Ïðåîáðàçóåò óêàçàòåëü ê ñòðîêîâîìó ïðåäñòàâëåíèþ</td></tr>
|
||||
<tr><td><code><b>function</b> RemoveDir(s: string): boolean;</code>
|
||||
<br> Óäàëÿåò êàòàëîã. Âîçâðàùàåò True, åñëè êàòàëîã óñïåøíî óäàëåí</td></tr>
|
||||
<tr><td><code><b>function</b> RenameFile(name, newname: string): boolean;</code>
|
||||
<br> Ïåðåèìåíîâûâàåò ôàéë name, äàâàÿ åìó íîâîå èìÿ newname. Âîçâðàùàåò True, åñëè ôàéë óñïåøíî ïåðåèìåíîâàí</td></tr>
|
||||
<tr><td><code><b>function</b> RenameFile(fileName, newfileName: string): boolean;</code>
|
||||
<br> Ïåðåèìåíîâûâàåò ôàéë fileName, äàâàÿ åìó íîâîå èìÿ newfileName. Âîçâðàùàåò True, åñëè ôàéë óñïåøíî ïåðåèìåíîâàí</td></tr>
|
||||
<tr><td><code><b>procedure</b> RmDir(s: string);</code>
|
||||
<br> Óäàëÿåò êàòàëîã</td></tr>
|
||||
<tr><td><code><b>function</b> SetCurrentDir(s: string): boolean;</code>
|
||||
|
|
|
|||
|
|
@ -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> Десериализует объект из файла</td></tr>
|
||||
<tr><td><code><b>procedure</b> Print(a,b,...);</code>
|
||||
<br> Выводит значения a,b,... на экран, после каждого значения выводит пробел</td></tr>
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
<br> Выводит значения a,b,... на экран, после каждого значения выводит пробел и переходит на новую строку</td></tr>
|
||||
<tr><td><code><b>procedure</b> Println(f: Text; a,b,...);</code>
|
||||
<br> Выводит значения 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> Сериализует объект в файл (объект должен иметь атрибут [Serializable])</td></tr>
|
||||
<tr><td><code><b>procedure</b> Write(a,b,...);</code>
|
||||
<br> Выводит значения a,b,... на экран</td></tr>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
%token <id> tkNew
|
||||
%token <id> tkOn
|
||||
%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
|
||||
|
|
@ -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
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -356,5 +356,6 @@ script=
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.8.2.3081
|
||||
3.8.2.3085
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.8.2.3081'
|
||||
!define VERSION '3.8.2.3085'
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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="" />
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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");
|
||||
}
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
Loading…
Reference in a new issue