Ускоренная реализация CountOf для строк
This commit is contained in:
parent
c329530915
commit
e0a2854a8e
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "11";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "3676";
|
||||
public const string Revision = "3677";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=3676
|
||||
%MINOR%=11
|
||||
%REVISION%=3677
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -6,15 +6,14 @@ begin
|
|||
Println('Числа от 1 до', n, ':');
|
||||
for var i := 1 to n do
|
||||
Print(i);
|
||||
Println;
|
||||
Println;
|
||||
Println(NewLine);
|
||||
|
||||
Println('Числа от', n, 'до 1:');
|
||||
for var i := n downto 1 do
|
||||
Print(i);
|
||||
Println;
|
||||
Println;
|
||||
Println(NewLine);
|
||||
|
||||
Println('Маленькие английские буквы:');
|
||||
for var c := 'a' to 'z' do
|
||||
Print(c);
|
||||
Println;
|
||||
end.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ begin
|
|||
Println;
|
||||
|
||||
Print('Случайные целые от 1 до 99:');
|
||||
for var i := n downto 1 do
|
||||
for var i := 1 to n do
|
||||
Print(Random(1, 99));
|
||||
Println;
|
||||
end.
|
||||
|
|
|
|||
29
InstallerSamples/!Tutorial/06_ForWhileRepeat/Foreach1.pas
Normal file
29
InstallerSamples/!Tutorial/06_ForWhileRepeat/Foreach1.pas
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Цикл foreach
|
||||
|
||||
begin
|
||||
// foreach по диапазону
|
||||
foreach var x in 1..10 do
|
||||
Print(x);
|
||||
Println;
|
||||
|
||||
var a := [1,3,5,7,9];
|
||||
// foreach по массиву
|
||||
foreach var x in a do
|
||||
Print(x);
|
||||
Println;
|
||||
|
||||
// foreach с индексом
|
||||
foreach var x in a index i do
|
||||
Print((i,x));
|
||||
Println;
|
||||
|
||||
// foreach по словарю
|
||||
var d := Dict('cat' to 'кошка', 'dog' to 'собака');
|
||||
foreach var kv in d do
|
||||
Print(kv);
|
||||
Println;
|
||||
|
||||
// foreach по словарю с распаковкой
|
||||
foreach var (key,value) in d do
|
||||
Println($'{key} → {value}');
|
||||
end.
|
||||
|
|
@ -4,9 +4,9 @@ var
|
|||
s1: string := 'NET';
|
||||
|
||||
begin
|
||||
Writeln('Исходная строка: ''',s,'''');
|
||||
Writeln('Исходная строка: ''',s,' ''');
|
||||
s := Trim(s);
|
||||
Writeln('После вызова функции Trim: ''',s,'''');
|
||||
Writeln('После вызова функции Trim: ''',s,' ''');
|
||||
var p := Pos(s1,s);
|
||||
WritelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p);
|
||||
Delete(s,7,2);
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ var
|
|||
s1: string := 'NET';
|
||||
|
||||
begin
|
||||
Writeln('Исходная строка: ''',s,'''');
|
||||
Writeln('Исходная строка: ''',s,' ''');
|
||||
s := s.Trim;
|
||||
Writeln('После вызова s.Trim: ''',s,'''');
|
||||
Writeln('После вызова s.Trim: ''',s,' ''');
|
||||
var p := s.IndexOf(s1); // Индексация - с нуля
|
||||
WritelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p);
|
||||
s := s.Remove(6,2);
|
||||
|
|
|
|||
|
|
@ -4,10 +4,10 @@ begin
|
|||
// Преобразование целого в строку
|
||||
var i := 234;
|
||||
var s := IntToStr(i);
|
||||
WritelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s);
|
||||
Println($'Целое: {i}. После преобразования к строке: ''{s}''');
|
||||
|
||||
// Преобразование строки в целое (может произойти исключение)
|
||||
s := '567';
|
||||
i := StrToInt(s);
|
||||
WritelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i);
|
||||
Println($'Строка: ''{s}''. После преобразования к целому: {i}');
|
||||
end.
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
// Преобразование целое <-> строка в старом стиле (Val и Str)
|
||||
var
|
||||
s: string;
|
||||
i: integer;
|
||||
|
||||
begin
|
||||
// Преобразование целого в строку
|
||||
i := 234;
|
||||
Str(i,s);
|
||||
writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s);
|
||||
|
||||
// Преобразование строки в целое
|
||||
s := '567';
|
||||
var err: integer;
|
||||
Val(s,i,err);
|
||||
if err=0 then
|
||||
writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i);
|
||||
end.
|
||||
|
|
@ -1,16 +1,13 @@
|
|||
// Преобразование целое <-> строка в новом стиле
|
||||
var
|
||||
s: string;
|
||||
i: integer;
|
||||
// Преобразование целое <-> строка в новом стиле
|
||||
|
||||
begin
|
||||
// Преобразование целого в строку
|
||||
i := 234;
|
||||
s := i.ToString;
|
||||
writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s);
|
||||
var i := 234;
|
||||
var s := i.ToString;
|
||||
Println($'Целое: {i}. После преобразования к строке: ''{s}''');
|
||||
|
||||
// Преобразование строки в целое
|
||||
s := '567';
|
||||
if integer.TryParse(s,i) then
|
||||
writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i);
|
||||
Println($'Строка: ''{s}''. После преобразования к целому: {i}');
|
||||
end.
|
||||
|
|
@ -1,16 +1,13 @@
|
|||
// Преобразование вещественное <-> строка
|
||||
var
|
||||
s: string;
|
||||
r: real;
|
||||
// Преобразование вещественное <-> строка
|
||||
|
||||
begin
|
||||
// Преобразование целого в строку
|
||||
r := 3.1415;
|
||||
s := FloatToStr(r);
|
||||
writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',r,s);
|
||||
var r := 3.1415;
|
||||
var s := FloatToStr(r);
|
||||
Println($'Число: {r}. После преобразования к строке: ''{s}''');
|
||||
|
||||
// Преобразование строки в целое (может произойти исключение)
|
||||
s := '3.1415';
|
||||
r := StrToFloat(s);
|
||||
writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,r);
|
||||
Println($'Строка: ''{s}''. После преобразования к числу: {r}');
|
||||
end.
|
||||
|
|
@ -1,22 +1,21 @@
|
|||
// Использование стандартных функций UpperCase, LowerCase
|
||||
var c: char;
|
||||
// Использование стандартных функций UpperCase, LowerCase
|
||||
|
||||
begin
|
||||
for c:='a' to 'z' do
|
||||
write(UpperCase(c));
|
||||
writeln;
|
||||
for c:='A' to 'Z' do
|
||||
write(LowerCase(c));
|
||||
writeln;
|
||||
for c:='А' to 'Я' do
|
||||
write(UpperCase(c));
|
||||
writeln;
|
||||
for c:='а' to 'я' do
|
||||
write(LowerCase(c));
|
||||
writeln;
|
||||
for var c:='a' to 'z' do
|
||||
Write(UpperCase(c));
|
||||
Writeln;
|
||||
for var c:='A' to 'Z' do
|
||||
Write(LowerCase(c));
|
||||
Writeln;
|
||||
for var c:='А' to 'Я' do
|
||||
Write(UpperCase(c));
|
||||
Writeln;
|
||||
for var c:='а' to 'я' do
|
||||
Write(LowerCase(c));
|
||||
Writeln;
|
||||
var s := 'Папа у Васи силён в математике';
|
||||
s := UpperCase(s);
|
||||
writeln(s);
|
||||
Writeln(s);
|
||||
s := LowerCase(s);
|
||||
writeln(s);
|
||||
Writeln(s);
|
||||
end.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Определение функции. Вывод таблицы ее значений
|
||||
// Определение функции. Вывод таблицы ее значений
|
||||
|
||||
function MyFun(x: real): real;
|
||||
begin
|
||||
|
|
@ -13,10 +13,10 @@ const
|
|||
begin
|
||||
var h := (b-a)/n;
|
||||
var x := a;
|
||||
writeln('Таблица значений функции MyFun:');
|
||||
Println('Таблица значений функции MyFun:');
|
||||
for var i := 0 to n do
|
||||
begin
|
||||
writeln(x:5:2,MyFun(x):10:4);
|
||||
Println(x:5:2,MyFun(x):9:4);
|
||||
x += h;
|
||||
end;
|
||||
end.
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
// Функция Power
|
||||
// Функция Power
|
||||
|
||||
function Power(x: real; n: integer): real;
|
||||
begin
|
||||
|
|
@ -7,11 +7,8 @@ begin
|
|||
Result *= x;
|
||||
end;
|
||||
|
||||
var
|
||||
x: real;
|
||||
n: integer;
|
||||
|
||||
begin
|
||||
x := 2; n := 5;
|
||||
writelnFormat('{0} в степени {1} = {2}',x,n,Power(x,n));
|
||||
var x: real := 2;
|
||||
var n: integer := 5;
|
||||
Println($'{x} в степени {n} = {Power(x,n)}');
|
||||
end.
|
||||
|
|
@ -1,17 +1,17 @@
|
|||
// Параметры процедур
|
||||
// Параметры процедур
|
||||
|
||||
procedure Operations(a,b: integer);
|
||||
begin
|
||||
writeln(a,' + ',b,' = ',a+b);
|
||||
writeln(a,' - ',b,' = ',a-b);
|
||||
writeln(a,' * ',b,' = ',a*b);
|
||||
writeln(a,' / ',b,' = ',a/b);
|
||||
writeln(a,' div ',b,' = ',a div b);
|
||||
writeln(a,' mod ',b,' = ',a mod b);
|
||||
Println(a,'+',b,'=',a+b);
|
||||
Println(a,'-',b,'=',a-b);
|
||||
Println(a,'*',b,'=',a*b);
|
||||
Println(a,'/',b,'=',a/b);
|
||||
Println(a,'div',b,'=',a div b);
|
||||
Println(a,'mod',b,'=',a mod b);
|
||||
end;
|
||||
|
||||
begin
|
||||
Operations(5,3);
|
||||
writeln;
|
||||
Println;
|
||||
Operations(7,4);
|
||||
end.
|
||||
|
|
@ -6,17 +6,14 @@ begin
|
|||
m := a mod b;
|
||||
end;
|
||||
|
||||
var
|
||||
a,b: integer;
|
||||
d,m: integer;
|
||||
|
||||
begin
|
||||
a := 7;
|
||||
b := 3;
|
||||
var a := 7;
|
||||
var b := 3;
|
||||
var d,m: integer;
|
||||
DivMod(a,b,d,m);
|
||||
writelnFormat('{0} div {1} = {2}; {0} mod {1} = {3}',a,b,d,m);
|
||||
Println($'{a} div {b} = {d}; {a} mod {b} = {m}');
|
||||
a := 23;
|
||||
b := 5;
|
||||
DivMod(a,b,d,m);
|
||||
writelnFormat('{0} div {1} = {2}; {0} mod {1} = {3}',a,b,d,m);
|
||||
Println($'{a} div {b} = {d}; {a} mod {b} = {m}');
|
||||
end.
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
// Упаковка параметров в запись
|
||||
// Упаковка параметров в запись
|
||||
uses GraphABC;
|
||||
|
||||
type
|
||||
|
|
|
|||
18
InstallerSamples/!Tutorial/08_ProcFunc/Proc4.pas
Normal file
18
InstallerSamples/!Tutorial/08_ProcFunc/Proc4.pas
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Упаковка параметров в класс
|
||||
uses GraphWPF;
|
||||
|
||||
type
|
||||
Point = auto class
|
||||
x,y: integer;
|
||||
end;
|
||||
|
||||
procedure Line(p1,p2: Point) := Line(p1.x,p1.y,p2.x,p2.y);
|
||||
|
||||
begin
|
||||
var p1 := new Point(10,10);
|
||||
var p2 := new Point(10,210);
|
||||
var p3 := new Point(210,10);
|
||||
Line(p1,p2);
|
||||
Line(p2,p3);
|
||||
Line(p3,p1);
|
||||
end.
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
<param name="Keyword" value="Each">
|
||||
<param name="Keyword" value="EachCount">
|
||||
<param name="Keyword" value="Get">
|
||||
<param name="Keyword" value="GetOrAdd">
|
||||
<param name="Keyword" value="operator">
|
||||
<param name="Keyword" value="Update"></object>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><link rel="StyleSheet" href="../../../default.css">
|
||||
|
|
@ -16,6 +17,10 @@
|
|||
<br> Âîçâðàùàåò ÷àñòîòíûé ñëîâàðü îáúåêòîâ ïîñëåäîâàòåëüíîñòè</td></tr>
|
||||
<tr><td><code><b>function</b> Get<Key, Value>(Self: IDictionary<Key, Value>; K: Key; V: Value := default(Value)): Value;</code>
|
||||
<br> Âîçâðàùàåò â ñëîâàðå çíà÷åíèå, ñâÿçàííîå ñ óêàçàííûì êëþ÷îì, à åñëè òàêîãî êëþ÷à íåò, òî çíà÷åíèå ïî óìîë÷àíèþ</td></tr>
|
||||
<tr><td><code><b>function</b> GetOrAdd<Key, Value>(Self: IDictionary<Key, Value>; K: Key; valueFactory: Key -> Value): Value;</code>
|
||||
<br> Ïîëó÷àåò çíà÷åíèå ïî êëþ÷ó èëè äîáàâëÿåò íîâîå, åñëè êëþ÷ îòñóòñòâóåò</td></tr>
|
||||
<tr><td><code><b>function</b> GetOrAdd<Key, Value>(Self: IDictionary<Key, Value>; K: Key; defaultValue: Value): Value;</code>
|
||||
<br> Ïîëó÷àåò çíà÷åíèå ïî êëþ÷ó èëè äîáàâëÿåò çíà÷åíèå ïî óìîë÷àíèþ</td></tr>
|
||||
<tr><td><code><b>function</b> operator-<TKey, TVal>(Self: Dictionary<TKey, TVal>; key: TKey): Dictionary<TKey, TVal>;</code>
|
||||
<br> Âîçâðàùàåò ñëîâàðü, â êîòîðîì èç èñõîäíîãî ñëîâàðÿ óäàëåí ýëåìåíò ñ äàííûì êëþ÷îì</td></tr>
|
||||
<tr><td><code><b>function</b> operator-<TKey, TVal>(Self: Dictionary<TKey, TVal>; keys: <b>sequence </b> <b>of</b> TKey): Dictionary<TKey, TVal>;</code>
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@
|
|||
<br> Âîçâðàùàåò True åñëè ñòðîêà íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè (ëåêñèêîãðàôè÷åñêîå ñðàâíåíèå)</td></tr>
|
||||
<tr><td><code><b>function</b> CountOf(Self: string; substring: string; allowOverlap: boolean := false): integer;</code>
|
||||
<br> Âîçâðàùàåò êîëè÷åñòâî âõîæäåíèé ïîäñòðîêè â ñòðîêó</td></tr>
|
||||
<tr><td><code><b>function</b> CountOf(Self: string; c: char): integer;</code>
|
||||
<br> Âîçâðàùàåò êîëè÷åñòâî âõîæäåíèé ñèìâîëà â ñòðîêó</td></tr>
|
||||
<tr><td><code><b>function</b> IndicesOf(Self, SubS: string; overlay: boolean := False): <b>sequence </b> <b>of</b> integer;</code>
|
||||
<br> Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èíäåêñîâ âõîæäåíèé ïîäñòðîêè â îñíîâíóþ ñòðîêóÏàðàìåòð overlay îïðåäåëÿåò, ðàçðåøåíû ëè ïåðåêðûòèÿ âõîæäåíèé ïîäñòðîê</td></tr>
|
||||
<tr><td><code><b>function</b> InRange(Self: string; a, b: string): boolean;</code>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.11.0.3676
|
||||
3.11.0.3677
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.11.0.3676'
|
||||
!define VERSION '3.11.0.3677'
|
||||
|
|
|
|||
|
|
@ -3292,6 +3292,7 @@ const
|
|||
SEQUENCE_CANNOT_BE_EMPTY = 'Последовательность не может быть пустой!!Sequence cannot be empty';
|
||||
ARRAY_CANNOT_BE_EMPTY = 'Массив не может быть пустым!!Array cannot be empty';
|
||||
MIN_CANNOT_BE_GREATER_THAN_MAX = 'Clamp: min не может быть больше чем max!!Clamp: min cannot be greater than max';
|
||||
SUBSTRING_CANNOT_BE_EMPTY = 'Подстрока не может быть пустой!!Substring cannot be empty';
|
||||
// -----------------------------------------------------
|
||||
// WINAPI
|
||||
// -----------------------------------------------------
|
||||
|
|
@ -15078,26 +15079,51 @@ end;
|
|||
function CountOf(Self: string; substring: string; allowOverlap: boolean := false): integer; extensionmethod;
|
||||
begin
|
||||
if string.IsNullOrEmpty(substring) then
|
||||
raise new System.ArgumentException('Подстрока не может быть пустой');
|
||||
raise new System.ArgumentException(GetTranslation(SUBSTRING_CANNOT_BE_EMPTY));
|
||||
|
||||
Result := 0;
|
||||
var index := 0;
|
||||
var substringLength := substring.Length;
|
||||
var i := 1;
|
||||
var m := substring.Length;
|
||||
var n := Self.Length;
|
||||
|
||||
while true do
|
||||
if (m = 0) or (m > n) then exit;
|
||||
|
||||
var lastPossible := n - m + 1;
|
||||
|
||||
while i <= lastPossible do
|
||||
begin
|
||||
index := Self.IndexOf(substring, index);
|
||||
if index = -1 then
|
||||
break;
|
||||
var isMatch := True;
|
||||
// Проверяем первый символ до цикла - это частый случай несовпадения
|
||||
if Self[i] <> substring[1] then
|
||||
isMatch := False
|
||||
else
|
||||
for var j := 2 to m do
|
||||
if Self[i + j - 1] <> substring[j] then
|
||||
begin
|
||||
isMatch := False;
|
||||
break;
|
||||
end;
|
||||
|
||||
Result += 1;
|
||||
|
||||
if allowOverlap then
|
||||
index += 1 // Для пересекающихся вхождений сдвигаем на 1 символ
|
||||
else index += substringLength; // Для непересекающихся - на длину подстроки
|
||||
if isMatch then
|
||||
begin
|
||||
Result += 1;
|
||||
if allowOverlap then
|
||||
i += 1
|
||||
else i += m;
|
||||
end
|
||||
else i += 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает количество вхождений символа в строку
|
||||
function CountOf(Self: string; c: char): integer; extensionmethod;
|
||||
begin
|
||||
Result := 0;
|
||||
for var i:=1 to Self.Length do
|
||||
if Self[i] = c then
|
||||
Result += 1;
|
||||
end;
|
||||
|
||||
|
||||
///--
|
||||
function CreateSliceFromStringInternal(Self: string; from, step, count: integer): string;
|
||||
|
|
@ -15324,6 +15350,26 @@ begin
|
|||
Result := V;
|
||||
end;
|
||||
|
||||
/// Получает значение по ключу или добавляет новое, если ключ отсутствует
|
||||
function GetOrAdd<Key, Value>(Self: IDictionary<Key, Value>; K: Key; valueFactory: Key -> Value): Value; extensionmethod;
|
||||
begin
|
||||
if not Self.TryGetValue(K, Result) then
|
||||
begin
|
||||
Result := valueFactory(K);
|
||||
Self[K] := Result;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Получает значение по ключу или добавляет значение по умолчанию
|
||||
function GetOrAdd<Key, Value>(Self: IDictionary<Key, Value>; K: Key; defaultValue: Value): Value; extensionmethod;
|
||||
begin
|
||||
if not Self.TryGetValue(K, Result) then
|
||||
begin
|
||||
Result := defaultValue;
|
||||
Self[K] := Result;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает словарь, сопоставляющий ключу группы количество элементов с данным ключом
|
||||
function EachCount<Key,Source>(Self: sequence of System.Linq.IGrouping<Key,Source>): Dictionary<Key,integer>; extensionmethod;
|
||||
begin
|
||||
|
|
@ -15345,12 +15391,14 @@ end;
|
|||
/// Возвращает словарь, сопоставляющий элементам последовательности определённые значения
|
||||
function Each<Key,Res>(Self: sequence of Key; proj: Key -> Res): Dictionary<Key,Res>; extensionmethod;
|
||||
begin
|
||||
Result := Self.GroupBy(x->x).ToDictionary(g -> g.Key, g -> proj(g.Key));
|
||||
Result := Self.ToDictionary(x -> x, x -> proj(x));
|
||||
end;
|
||||
|
||||
/// Обновляет данные в словаре данными из другого словаря
|
||||
procedure Update<TKey, TVal>(Self: Dictionary<TKey, TVal>; update: Dictionary<TKey, TVal>); extensionmethod;
|
||||
begin
|
||||
if update = nil then Exit;
|
||||
|
||||
foreach var kv in update do
|
||||
Self[kv.Key] := kv.Value;
|
||||
end;
|
||||
|
|
@ -15358,6 +15406,8 @@ end;
|
|||
/// Обновляет данные в словаре данными из другого словаря
|
||||
procedure operator+=<TKey, TVal>(Self: Dictionary<TKey, TVal>; update: Dictionary<TKey, TVal>); extensionmethod;
|
||||
begin
|
||||
if update = nil then Exit;
|
||||
|
||||
foreach var kv in update do
|
||||
Self[kv.Key] := kv.Value;
|
||||
end;
|
||||
|
|
@ -15379,6 +15429,8 @@ end;
|
|||
/// Удаляет из словаря пары с указанными значениями ключа
|
||||
procedure operator-=<Key,Value>(Self: IDictionary<Key,Value>; keys: sequence of Key); extensionmethod;
|
||||
begin
|
||||
if keys = nil then Exit;
|
||||
|
||||
foreach var k in keys do
|
||||
Self.Remove(k);
|
||||
end;
|
||||
|
|
@ -15958,30 +16010,15 @@ function RuntimeDetermineType(T: System.Type): byte;
|
|||
begin
|
||||
result := 0;
|
||||
if T.IsValueType and (T.GetMethod('$Init$') <> nil) then
|
||||
begin
|
||||
result := 1;
|
||||
exit;
|
||||
end;
|
||||
exit(1);
|
||||
if T = typeof(string) then
|
||||
begin
|
||||
result := 2;
|
||||
exit;
|
||||
end;
|
||||
exit(2);
|
||||
if T = typeof(TypedSet) then
|
||||
begin
|
||||
result := 3;
|
||||
exit;
|
||||
end;
|
||||
exit(3);
|
||||
if T = typeof(Text) then
|
||||
begin
|
||||
result := 4;
|
||||
exit;
|
||||
end;
|
||||
exit(4);
|
||||
if T = typeof(BinaryFile) then
|
||||
begin
|
||||
result := 5;
|
||||
exit;
|
||||
end;
|
||||
exit(5);
|
||||
end;
|
||||
|
||||
function RuntimeInitialize(kind: byte; variable: object): object;
|
||||
|
|
@ -16003,9 +16040,8 @@ begin
|
|||
end;
|
||||
|
||||
function GetRuntimeSize<T>: integer;
|
||||
var
|
||||
val: T;
|
||||
begin
|
||||
var val: T;
|
||||
result := System.Runtime.InteropServices.Marshal.SizeOf(val);
|
||||
end;
|
||||
|
||||
|
|
|
|||
|
|
@ -191,15 +191,9 @@ function MinMax(seq: sequence of BigInteger): (BigInteger, BigInteger);
|
|||
/// Возвращает НОД пары чисел
|
||||
function НОД(a, b: int64): int64;
|
||||
|
||||
/// Возвращает НОД пары чисел
|
||||
function GCD(a, b: int64): int64;
|
||||
|
||||
/// Возвращает НОК пары чисел
|
||||
function НОК(a, b: int64): int64;
|
||||
|
||||
/// Возвращает НОК пары чисел
|
||||
function LCM(a, b: int64): int64;
|
||||
|
||||
/// Возвращает НОД и НОК пары чисел
|
||||
function НОДНОК(a, b: int64): (int64, int64);
|
||||
|
||||
|
|
@ -665,9 +659,6 @@ begin
|
|||
Result := Abs(a)
|
||||
end;
|
||||
|
||||
/// Возвращает НОД пары чисел
|
||||
function GCD(a, b: int64) := НОД(a, b);
|
||||
|
||||
/// Возвращает НОК пары чисел
|
||||
function НОК(a, b: int64): int64;
|
||||
begin
|
||||
|
|
@ -677,9 +668,6 @@ begin
|
|||
Result := Abs(a1 div a * b1)
|
||||
end;
|
||||
|
||||
/// Возвращает НОК пары чисел
|
||||
function LCM(a, b: int64) := НОК(a, b);
|
||||
|
||||
/// Возвращает НОД и НОК пары чисел
|
||||
function НОДНОК(a, b: int64): (int64, int64);
|
||||
begin
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
|
||||
</startup>
|
||||
</configuration>
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using PascalABCCompiler.Errors;
|
||||
using PascalABCCompiler;
|
||||
using PascalABCCompiler.SyntaxTree;
|
||||
using PascalABCCompiler.ParserTools;
|
||||
|
||||
using SyntaxVisitors;
|
||||
|
||||
namespace ParsePABC1
|
||||
{
|
||||
class Program
|
||||
{
|
||||
// PascalABCSaushkinParser reference needed!!! DO NOT REMOVE!!!
|
||||
|
||||
static syntax_tree_node ParseFile(string fname)
|
||||
{
|
||||
Compiler c = new Compiler();
|
||||
// c.SyntaxTreeChanger = new YieldDesugarSyntaxTreeConverter();
|
||||
var opts = new CompilerOptions(fname, CompilerOptions.OutputType.ConsoleApplicaton);
|
||||
|
||||
var res = c.Compile(opts);
|
||||
|
||||
var err = new List<Error>();
|
||||
|
||||
var txt = System.IO.File.ReadAllText(fname);
|
||||
|
||||
var cu = c.ParsersController.Compile(fname, txt, err, PascalABCCompiler.Parsers.ParseMode.Normal);
|
||||
|
||||
if (cu == null)
|
||||
{
|
||||
Console.WriteLine("Не распарсилось");
|
||||
}
|
||||
return cu;
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var cu = ParseFile(@"D:\PascalABC.NET\!PABC_Git\Yield\tests\basic\yieldSimpleMethodDef.pas");
|
||||
if (cu == null)
|
||||
return;
|
||||
|
||||
var yieldVis = new ProcessYieldCapturedVarsVisitor();
|
||||
cu.visit(yieldVis);
|
||||
|
||||
|
||||
cu.visit(new SimplePrettyPrinterVisitor());
|
||||
|
||||
Console.ReadKey();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// Управление общими сведениями о сборке осуществляется с помощью
|
||||
// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
|
||||
// связанные со сборкой.
|
||||
[assembly: AssemblyTitle("ParsePABC")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Hewlett-Packard")]
|
||||
[assembly: AssemblyProduct("ParsePABC")]
|
||||
[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми
|
||||
// для COM-компонентов. Если требуется обратиться к типу в этой сборке через
|
||||
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
|
||||
[assembly: Guid("d1b107ed-e2bb-4d21-98d0-a2f99c08d2b0")]
|
||||
|
||||
// Сведения о версии сборки состоят из следующих четырех значений:
|
||||
//
|
||||
// Основной номер версии
|
||||
// Дополнительный номер версии
|
||||
// Номер сборки
|
||||
// Редакция
|
||||
//
|
||||
// Можно задать все значения или принять номера сборки и редакции по умолчанию
|
||||
// используя "*", как показано ниже:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{D1B107ED-E2BB-4D21-98D0-A2F99C08D2B0}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>ParsePABC</RootNamespace>
|
||||
<AssemblyName>ParsePABC</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="ICSharpCode.NRefactory, Version=4.2.1.8805, Culture=neutral, PublicKeyToken=efe927acf176eea2, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\pascalabcnet\_ParsePABC1\dlls\ICSharpCode.NRefactory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Localization, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\bin\Localization.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ProgramOld.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\CompilerTools\CompilerTools.csproj">
|
||||
<Project>{a25d26fb-3043-4bcf-833e-e3f4c3be795e}</Project>
|
||||
<Name>CompilerTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Compiler\Compiler.csproj">
|
||||
<Project>{1e42361a-eda3-4872-88af-a3aaf600d36d}</Project>
|
||||
<Name>Compiler</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Errors\Errors.csproj">
|
||||
<Project>{44a01f9e-dce7-470c-aae5-c3de0ccbee3b}</Project>
|
||||
<Name>Errors</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Parsers\PascalABCParserNewSaushkin\PascalABCSaushkinParser.csproj">
|
||||
<Project>{1443f539-dcc7-4491-b4fd-b716c739db3c}</Project>
|
||||
<Name>PascalABCSaushkinParser</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\ParserTools\ParserTools.csproj">
|
||||
<Project>{af2efd7b-69dd-4b43-af65-b59b29349c23}</Project>
|
||||
<Name>ParserTools</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\SyntaxTreeConverters\SyntaxTreeConverters.csproj">
|
||||
<Project>{f10a5330-dcf4-4533-877c-7b1b1be23884}</Project>
|
||||
<Name>SyntaxTreeConverters</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\SyntaxTree\SyntaxTree.csproj">
|
||||
<Project>{c2cac65a-b2ae-4ccc-b067-e6b8e75df73a}</Project>
|
||||
<Name>SyntaxTree</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\SyntaxVisitors\SyntaxVisitors.csproj">
|
||||
<Project>{a9ab4282-83b4-41a7-86c3-e5bf6a45e7e2}</Project>
|
||||
<Name>SyntaxVisitors</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\YieldConversionSyntax\YieldConversionSyntax.csproj">
|
||||
<Project>{276ee073-60f6-46d2-8811-1b8026bcaada}</Project>
|
||||
<Name>YieldConversionSyntax</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\YieldHelpers\YieldHelpers.csproj">
|
||||
<Project>{ce5c55c2-a11c-4e94-a9fa-3fc6ca3e4c09}</Project>
|
||||
<Name>YieldHelpers</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
|
|
@ -15082,23 +15082,48 @@ begin
|
|||
raise new System.ArgumentException(GetTranslation(SUBSTRING_CANNOT_BE_EMPTY));
|
||||
|
||||
Result := 0;
|
||||
var index := 0;
|
||||
var substringLength := substring.Length;
|
||||
var i := 1;
|
||||
var m := substring.Length;
|
||||
var n := Self.Length;
|
||||
|
||||
while true do
|
||||
if (m = 0) or (m > n) then exit;
|
||||
|
||||
var lastPossible := n - m + 1;
|
||||
|
||||
while i <= lastPossible do
|
||||
begin
|
||||
index := Self.IndexOf(substring, index);
|
||||
if index = -1 then
|
||||
break;
|
||||
var isMatch := True;
|
||||
// Проверяем первый символ до цикла - это частый случай несовпадения
|
||||
if Self[i] <> substring[1] then
|
||||
isMatch := False
|
||||
else
|
||||
for var j := 2 to m do
|
||||
if Self[i + j - 1] <> substring[j] then
|
||||
begin
|
||||
isMatch := False;
|
||||
break;
|
||||
end;
|
||||
|
||||
Result += 1;
|
||||
|
||||
if allowOverlap then
|
||||
index += 1 // Для пересекающихся вхождений сдвигаем на 1 символ
|
||||
else index += substringLength; // Для непересекающихся - на длину подстроки
|
||||
if isMatch then
|
||||
begin
|
||||
Result += 1;
|
||||
if allowOverlap then
|
||||
i += 1
|
||||
else i += m;
|
||||
end
|
||||
else i += 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Возвращает количество вхождений символа в строку
|
||||
function CountOf(Self: string; c: char): integer; extensionmethod;
|
||||
begin
|
||||
Result := 0;
|
||||
for var i:=1 to Self.Length do
|
||||
if Self[i] = c then
|
||||
Result += 1;
|
||||
end;
|
||||
|
||||
|
||||
///--
|
||||
function CreateSliceFromStringInternal(Self: string; from, step, count: integer): string;
|
||||
|
|
@ -15985,30 +16010,15 @@ function RuntimeDetermineType(T: System.Type): byte;
|
|||
begin
|
||||
result := 0;
|
||||
if T.IsValueType and (T.GetMethod('$Init$') <> nil) then
|
||||
begin
|
||||
result := 1;
|
||||
exit;
|
||||
end;
|
||||
exit(1);
|
||||
if T = typeof(string) then
|
||||
begin
|
||||
result := 2;
|
||||
exit;
|
||||
end;
|
||||
exit(2);
|
||||
if T = typeof(TypedSet) then
|
||||
begin
|
||||
result := 3;
|
||||
exit;
|
||||
end;
|
||||
exit(3);
|
||||
if T = typeof(Text) then
|
||||
begin
|
||||
result := 4;
|
||||
exit;
|
||||
end;
|
||||
exit(4);
|
||||
if T = typeof(BinaryFile) then
|
||||
begin
|
||||
result := 5;
|
||||
exit;
|
||||
end;
|
||||
exit(5);
|
||||
end;
|
||||
|
||||
function RuntimeInitialize(kind: byte; variable: object): object;
|
||||
|
|
@ -16030,9 +16040,8 @@ begin
|
|||
end;
|
||||
|
||||
function GetRuntimeSize<T>: integer;
|
||||
var
|
||||
val: T;
|
||||
begin
|
||||
var val: T;
|
||||
result := System.Runtime.InteropServices.Marshal.SizeOf(val);
|
||||
end;
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue