Ускоренная реализация CountOf для строк

This commit is contained in:
Mikhalkovich Stanislav 2025-11-03 15:27:18 +03:00
parent c329530915
commit e0a2854a8e
31 changed files with 229 additions and 383 deletions

View file

@ -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;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3676
%MINOR%=11
%REVISION%=3677
%COREVERSION%=0
%MAJOR%=3

View file

@ -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.

View file

@ -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.

View 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.

View file

@ -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);

View file

@ -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);

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -1,4 +1,4 @@
// Упаковка параметров в запись
// Упаковка параметров в запись
uses GraphABC;
type

View 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.

View file

@ -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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ÷àñòîòíûé ñëîâàðü îáúåêòîâ ïîñëåäîâàòåëüíîñòè</td></tr>
<tr><td><code><b>function</b> Get&lt;Key, Value&gt;(Self: IDictionary&lt;Key, Value&gt;; K: Key; V: Value := default(Value)): Value;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò â ñëîâàðå çíà÷åíèå, ñâÿçàííîå ñ óêàçàííûì êëþ÷îì, à åñëè òàêîãî êëþ÷à íåò, òî çíà÷åíèå ïî óìîë÷àíèþ</td></tr>
<tr><td><code><b>function</b> GetOrAdd&lt;Key, Value&gt;(Self: IDictionary&lt;Key, Value&gt;; K: Key; valueFactory: Key -&gt; Value): Value;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïîëó÷àåò çíà÷åíèå ïî êëþ÷ó èëè äîáàâëÿåò íîâîå, åñëè êëþ÷ îòñóòñòâóåò</td></tr>
<tr><td><code><b>function</b> GetOrAdd&lt;Key, Value&gt;(Self: IDictionary&lt;Key, Value&gt;; K: Key; defaultValue: Value): Value;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ïîëó÷àåò çíà÷åíèå ïî êëþ÷ó èëè äîáàâëÿåò çíà÷åíèå ïî óìîë÷àíèþ</td></tr>
<tr><td><code><b>function</b> operator-&lt;TKey, TVal&gt;(Self: Dictionary&lt;TKey, TVal&gt;; key: TKey): Dictionary&lt;TKey, TVal&gt;;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ñëîâàðü, â êîòîðîì èç èñõîäíîãî ñëîâàðÿ óäàëåí ýëåìåíò ñ äàííûì êëþ÷îì</td></tr>
<tr><td><code><b>function</b> operator-&lt;TKey, TVal&gt;(Self: Dictionary&lt;TKey, TVal&gt;; keys: <b>sequence </b> <b>of</b> TKey): Dictionary&lt;TKey, TVal&gt;;</code>

View file

@ -35,6 +35,8 @@
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò True åñëè ñòðîêà íàõîäèòñÿ ìåæäó äâóìÿ äðóãèìè (ëåêñèêîãðàôè÷åñêîå ñðàâíåíèå)</td></tr>
<tr><td><code><b>function</b> CountOf(Self: string; substring: string; allowOverlap: boolean := false): integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîëè÷åñòâî âõîæäåíèé ïîäñòðîêè â ñòðîêó</td></tr>
<tr><td><code><b>function</b> CountOf(Self: string; c: char): integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò êîëè÷åñòâî âõîæäåíèé ñèìâîëà â ñòðîêó</td></tr>
<tr><td><code><b>function</b> IndicesOf(Self, SubS: string; overlay: boolean := False): <b>sequence </b> <b>of</b> integer;</code>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Âîçâðàùàåò ïîñëåäîâàòåëüíîñòü èíäåêñîâ âõîæäåíèé ïîäñòðîêè â îñíîâíóþ ñòðîêóÏàðàìåòð overlay îïðåäåëÿåò, ðàçðåøåíû ëè ïåðåêðûòèÿ âõîæäåíèé ïîäñòðîê</td></tr>
<tr><td><code><b>function</b> InRange(Self: string; a, b: string): boolean;</code>

View file

@ -1 +1 @@
3.11.0.3676
3.11.0.3677

View file

@ -1 +1 @@
!define VERSION '3.11.0.3676'
!define VERSION '3.11.0.3677'

View file

@ -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;

View file

@ -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

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

View file

@ -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();
}
}
}

View file

@ -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")]

View file

@ -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>

View file

@ -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.