diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 2458dfea1..c463abd11 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "4"; public const string Build = "2"; - public const string Revision = "1845"; + public const string Revision = "1846"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 8ab0d78ca..82ac125dd 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=2 -%REVISION%=1845 %MINOR%=4 +%REVISION%=1846 +%COREVERSION%=2 %MAJOR%=3 diff --git a/InstallerSamples/!Tutorial/01_First/Assign1.pas b/InstallerSamples/!Tutorial/01_First/Assign1.pas index ac5fe9ee8..282c2e6e2 100644 --- a/InstallerSamples/!Tutorial/01_First/Assign1.pas +++ b/InstallerSamples/!Tutorial/01_First/Assign1.pas @@ -1,12 +1,10 @@ -// Использование вспомогательных переменных -var r: real; +// Использование вспомогательных переменных begin - write('Введите r: '); - readln(r); + var r := ReadlnReal('Введите r: '); var r2,r4,r8: real; // вспомогательные переменные r2 := r * r; r4 := r2 * r2; r8 := r4 * r4; - writeln(r,' в степени 8 = ',r8); + Println(r,'в степени 8 =',r8); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Assign2.pas b/InstallerSamples/!Tutorial/01_First/Assign2.pas index 13b2ad3a9..21e8e0bbd 100644 --- a/InstallerSamples/!Tutorial/01_First/Assign2.pas +++ b/InstallerSamples/!Tutorial/01_First/Assign2.pas @@ -1,12 +1,12 @@ -// Перемена местами значений двух переменных с использованием третьей +// Перемена местами значений двух переменных с использованием третьей var x,y: real; begin - write('Введите x,y: '); - readln(x,y); + Write('Введите x,y: '); + Readln(x,y); var v: real; // вспомогательная переменная v := x; x := y; y := v; - writeln('Новые значения x,y: ',x,' ',y); + Writeln('Новые значения x,y: ',x,' ',y); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/AssignExt.pas b/InstallerSamples/!Tutorial/01_First/AssignExt.pas index 109d1f089..5373b735a 100644 --- a/InstallerSamples/!Tutorial/01_First/AssignExt.pas +++ b/InstallerSamples/!Tutorial/01_First/AssignExt.pas @@ -1,18 +1,18 @@ -// Присваивания += -= *= /= +// Присваивания += -= *= /= var i: integer; r: real; begin i := 1; - writeln('i := 1; i = ',i); + Writeln('i := 1; i = ',i); i += 2; // Увеличение на 2 - writeln('i += 2; i = ',i); + Writeln('i += 2; i = ',i); i *= 3; // Увеличение в 3 раза - writeln('i *= 3; i = ',i); - writeln; + Writeln('i *= 3; i = ',i); + Writeln; r := 6; - writeln('r := 6; r = ',r); + Writeln('r := 6; r = ',r); r /= 2; - writeln('r /= 2; r = ',r); + Writeln('r /= 2; r = ',r); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Boolean1.pas b/InstallerSamples/!Tutorial/01_First/Boolean1.pas index 630763ae6..98dec6a3f 100644 --- a/InstallerSamples/!Tutorial/01_First/Boolean1.pas +++ b/InstallerSamples/!Tutorial/01_First/Boolean1.pas @@ -1,16 +1,16 @@ -// Логический тип. Логические выражения с and, or и not +// Логический тип. Логические выражения с and, or и not var b: boolean; x: integer; begin - write('Введите x (от 1 до 9): '); - readln(x); + Write('Введите x (от 1 до 9): '); + Readln(x); b := x=5; - writeln('x=5? ',b); + Writeln('x=5? ',b); b := (x>=3) and (x<=5); - writeln('x=3,4 или 5? ',b); + Writeln('x=3,4 или 5? ',b); b := (x=3) or (x=4) or (x=5); - writeln('x=3,4 или 5? ',b); + Writeln('x=3,4 или 5? ',b); b := not Odd(x); - writeln('x - четное? ',b); + Writeln('x - четное? ',b); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Calculations1.pas b/InstallerSamples/!Tutorial/01_First/Calculations1.pas index f6ba098ae..91e984a5e 100644 --- a/InstallerSamples/!Tutorial/01_First/Calculations1.pas +++ b/InstallerSamples/!Tutorial/01_First/Calculations1.pas @@ -1,10 +1,10 @@ -// Вывод результатов вычислений +// Вывод результатов вычислений begin - writeln('Вычисления:'); + Writeln('Вычисления:'); // Вывод пустой строки - writeln; - writeln('121 + 363 = ',121+363); - writeln('121 - 363 = ',121-363); - writeln('121 * 363 = ',121*363); - writeln('121 / 363 = ',121/363); + Writeln; + Writeln('121 + 363 = ',121+363); + Writeln('121 - 363 = ',121-363); + Writeln('121 * 363 = ',121*363); + Writeln('121 / 363 = ',121/363); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Calculations2.pas b/InstallerSamples/!Tutorial/01_First/Calculations2.pas index ff692f587..088963349 100644 --- a/InstallerSamples/!Tutorial/01_First/Calculations2.pas +++ b/InstallerSamples/!Tutorial/01_First/Calculations2.pas @@ -1,13 +1,13 @@ -// Вывод результатов вычислений. Используются именованные константы +// Вывод результатов вычислений. Используются именованные константы const a = 121; b = 363; begin - writeln('Вычисления:'); - writeln; - writeln(a,' + ',b,' = ',a+b); - writeln(a,' - ',b,' = ',a-b); - writeln(a,' * ',b,' = ',a*b); - writeln(a,' / ',b,' = ',a/b); + Writeln('Вычисления:'); + Writeln; + Writeln(a,' + ',b,' = ',a+b); + Writeln(a,' - ',b,' = ',a-b); + Writeln(a,' * ',b,' = ',a*b); + Writeln(a,' / ',b,' = ',a/b); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Calculations3.pas b/InstallerSamples/!Tutorial/01_First/Calculations3.pas index 255a9b131..ce72b126e 100644 --- a/InstallerSamples/!Tutorial/01_First/Calculations3.pas +++ b/InstallerSamples/!Tutorial/01_First/Calculations3.pas @@ -1,12 +1,10 @@ -// Вывод результатов вычислений. Используются переменные и процедура ввода -var a,b: integer; +// Вывод результатов вычислений. Используются переменные и процедура ввода begin - writeln('Введите a и b:'); - readln(a,b); - writeln; - writeln(a,' + ',b,' = ',a+b); - writeln(a,' - ',b,' = ',a-b); - writeln(a,' * ',b,' = ',a*b); - writeln(a,' / ',b,' = ',a/b); + var (a,b) := ReadlnInteger2('Введите a и b:'); + Writeln; + Writeln(a,' + ',b,' = ',a+b); + Writeln(a,' - ',b,' = ',a-b); + Writeln(a,' * ',b,' = ',a*b); + Writeln(a,' / ',b,' = ',a/b); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/DivMod1.pas b/InstallerSamples/!Tutorial/01_First/DivMod1.pas index 37fc92a04..6f4720600 100644 --- a/InstallerSamples/!Tutorial/01_First/DivMod1.pas +++ b/InstallerSamples/!Tutorial/01_First/DivMod1.pas @@ -1,10 +1,10 @@ -// Операции div и mod +// Операции div и mod var a: integer; begin - write('Введите a: '); - readln(a); - writeln('Последняя цифра числа: ',a mod 10); - writeln('Число без последней цифры: ',a div 10); - writeln('Если число a четно, то 0: ',a mod 2); + Write('Введите a: '); + Readln(a); + Writeln('Последняя цифра числа: ',a mod 10); + Writeln('Число без последней цифры: ',a div 10); + Writeln('Если число a четно, то 0: ',a mod 2); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/DivMod2.pas b/InstallerSamples/!Tutorial/01_First/DivMod2.pas index 7a008006b..7f3169d0b 100644 --- a/InstallerSamples/!Tutorial/01_First/DivMod2.pas +++ b/InstallerSamples/!Tutorial/01_First/DivMod2.pas @@ -1,13 +1,13 @@ -// Операции div и mod +// Операции div и mod var a: integer := 247; begin - write('Цифры числа в обратном порядке: '); + Write('Цифры числа в обратном порядке: '); // Выводим последнюю цифру - write(a mod 10,' '); + Print(a mod 10); // Отбрасываем последнюю цифру a := a div 10; - write(a mod 10,' '); + Print(a mod 10); a := a div 10; - write(a mod 10,' '); + Print(a mod 10); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Eof.pas b/InstallerSamples/!Tutorial/01_First/Eof.pas index 6fbf05213..a651a63b9 100644 --- a/InstallerSamples/!Tutorial/01_First/Eof.pas +++ b/InstallerSamples/!Tutorial/01_First/Eof.pas @@ -1,9 +1,9 @@ -// Демонстрация работы функции eof. Запускать по Shift-F9 -var s: char; +// Демонстрация работы функции eof. Запускать по Shift-F9, завершать по Ctrl-Z begin - while not eof do + var s: char; + while not Eof do begin - read(s); - writeln('- ',Ord(s),' -'); + Read(s); + Println('-',Ord(s),' -'); end; end. diff --git a/InstallerSamples/!Tutorial/01_First/Eoln.pas b/InstallerSamples/!Tutorial/01_First/Eoln.pas index 9d1ff68a2..55e6aa4cc 100644 --- a/InstallerSamples/!Tutorial/01_First/Eoln.pas +++ b/InstallerSamples/!Tutorial/01_First/Eoln.pas @@ -1,9 +1,8 @@ -// Демонстрация работы функции eoln +// Демонстрация работы функции Eoln begin - while not eoln do + while not Eoln do begin - var c: char; - read(c); - write(c,' '); + var c := ReadChar; + Print(c); end; end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/HelloWorld.pas b/InstallerSamples/!Tutorial/01_First/HelloWorld.pas index 0ce413328..90fe341c0 100644 --- a/InstallerSamples/!Tutorial/01_First/HelloWorld.pas +++ b/InstallerSamples/!Tutorial/01_First/HelloWorld.pas @@ -1,5 +1,5 @@ -// Первая программа +// Первая программа program HelloWorld; begin - writeln('Привет, мир!'); + Writeln('Привет, мир!'); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Random1.pas b/InstallerSamples/!Tutorial/01_First/Random1.pas index e8738e012..c7763a61f 100644 --- a/InstallerSamples/!Tutorial/01_First/Random1.pas +++ b/InstallerSamples/!Tutorial/01_First/Random1.pas @@ -1,13 +1,10 @@ -// Генерация случайного числа -var - i: integer; - r: real; +// Генерация случайного числа begin - i := Random(100); - writeln('Случайное целое в диапазоне 0..99: ',i); + var i := Random(100); + Writeln('Случайное целое в диапазоне 0..99: ',i); i := Random(2,5); - writeln('Случайное целое в диапазоне 2..5: ',i); - r := Random; - writeln('Случайное вещественное в диапазоне [0,1): ',r); + Writeln('Случайное целое в диапазоне 2..5: ',i); + var r: real := Random; + Writeln('Случайное вещественное в диапазоне [0,1): ',r); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Random2.pas b/InstallerSamples/!Tutorial/01_First/Random2.pas index edb94ebd9..2559b8136 100644 --- a/InstallerSamples/!Tutorial/01_First/Random2.pas +++ b/InstallerSamples/!Tutorial/01_First/Random2.pas @@ -1,10 +1,7 @@ -// Бросание кубиков - -var k1,k2: integer; +// Бросание кубиков begin - k1 := Random(1,6); - k2 := Random(1,6); - writeln('Очки на кубиках: ',k1,' ',k2); - writeln('Сумма очков: ',k1+k2); + var (k1,k2) := Random2(1,6); + Writeln($'Очки на кубиках: {k1} {k2}'); + Writeln($'Сумма очков: {k1+k2}'); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/ReadString.pas b/InstallerSamples/!Tutorial/01_First/ReadString.pas index a214b05b6..297db1c3f 100644 --- a/InstallerSamples/!Tutorial/01_First/ReadString.pas +++ b/InstallerSamples/!Tutorial/01_First/ReadString.pas @@ -1,8 +1,6 @@ -// Ввод строки -var s: string; +// Ввод строки begin - write('Введите Ваше имя: '); - readln(s); - writeln('Здравствуйте, ',s); + var имя := ReadString('Введите Ваше имя:'); + Writeln($'Здравствуйте, {имя}!'); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/Shl.pas b/InstallerSamples/!Tutorial/01_First/Shl.pas index 5a381c181..022eded17 100644 --- a/InstallerSamples/!Tutorial/01_First/Shl.pas +++ b/InstallerSamples/!Tutorial/01_First/Shl.pas @@ -1,8 +1,8 @@ -// Демонстрация операции shl +// Демонстрация операции shl begin - writeln('Степени двойки'); - writeln(' n 2^n'); + Writeln('Степени двойки'); + Writeln(' n 2^n'); for var i:=0 to 30 do - writeln(i:2,(1 shl i):12); + Writeln(i:2,(1 shl i):12); end. diff --git a/InstallerSamples/!Tutorial/01_First/StandFun.pas b/InstallerSamples/!Tutorial/01_First/StandFun.pas index 5d820f901..73c379102 100644 --- a/InstallerSamples/!Tutorial/01_First/StandFun.pas +++ b/InstallerSamples/!Tutorial/01_First/StandFun.pas @@ -1,14 +1,14 @@ -// Стандартные функции +// Стандартные функции var x: real; begin write('Введите x: '); - readln(x); - writeln('Квадрат ',x,' равен ',sqr(x)); - writeln(x,' в степени 5 равно ',power(x,5)); - writeln('Квадратный корень из ',x,' равен ',sqrt(x)); - writeln('Модуль ',x,' равен ',abs(x)); - writeln('Натуральный логарифм ',x,' равен ',ln(x)); - writeln('Синус ',x,' равен ',sin(x)); - writeln('Косинус ',x,' равен ',cos(x)); + Readln(x); + Writeln('Квадрат ',x,' равен ',Sqr(x)); + Writeln(x,' в степени 5 равно ',Power(x,5)); + Writeln('Квадратный корень из ',x,' равен ',Sqrt(x)); + Writeln('Модуль ',x,' равен ',Abs(x)); + Writeln('Натуральный логарифм ',x,' равен ',Ln(x)); + Writeln('Синус ',x,' равен ',Sin(x)); + Writeln('Косинус ',x,' равен ',Cos(x)); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/StandardTypes.pas b/InstallerSamples/!Tutorial/01_First/StandardTypes.pas index 6eb0c2b4d..67b01ef15 100644 --- a/InstallerSamples/!Tutorial/01_First/StandardTypes.pas +++ b/InstallerSamples/!Tutorial/01_First/StandardTypes.pas @@ -1,4 +1,4 @@ -/// Стандартные размерные типы данных и их размер +/// Стандартные размерные типы данных и их размер var i: integer; j: shortint; @@ -16,18 +16,18 @@ var c: char; begin - writeln('sizeof(integer) = ':20, sizeof(integer)); - writeln('sizeof(shortint) = ':20,sizeof(shortint)); - writeln('sizeof(smallint) = ':20,sizeof(smallint)); - writeln('sizeof(longint) = ':20, sizeof(longint)); - writeln('sizeof(int64) = ':20, sizeof(int64)); - writeln('sizeof(byte) = ':20, sizeof(byte)); - writeln('sizeof(word) = ':20, sizeof(word)); - writeln('sizeof(longword) = ':20,sizeof(longword)); - writeln('sizeof(cardinal) = ':20,sizeof(cardinal)); - writeln('sizeof(uint64) = ':20, sizeof(uint64)); - writeln('sizeof(real) = ':20, sizeof(real)); - writeln('sizeof(double) = ':20, sizeof(double)); - writeln('sizeof(single) = ':20, sizeof(single)); - writeln('sizeof(char) = ':20, sizeof(char)); + Writeln('sizeof(integer) = ':20, sizeof(integer)); + Writeln('sizeof(shortint) = ':20,sizeof(shortint)); + Writeln('sizeof(smallint) = ':20,sizeof(smallint)); + Writeln('sizeof(longint) = ':20, sizeof(longint)); + Writeln('sizeof(int64) = ':20, sizeof(int64)); + Writeln('sizeof(byte) = ':20, sizeof(byte)); + Writeln('sizeof(word) = ':20, sizeof(word)); + Writeln('sizeof(longword) = ':20,sizeof(longword)); + Writeln('sizeof(cardinal) = ':20,sizeof(cardinal)); + Writeln('sizeof(uint64) = ':20, sizeof(uint64)); + Writeln('sizeof(real) = ':20, sizeof(real)); + Writeln('sizeof(double) = ':20, sizeof(double)); + Writeln('sizeof(single) = ':20, sizeof(single)); + Writeln('sizeof(char) = ':20, sizeof(char)); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/01_First/StringPlus.pas b/InstallerSamples/!Tutorial/01_First/StringPlus.pas index f267a010f..aa5fa0da8 100644 --- a/InstallerSamples/!Tutorial/01_First/StringPlus.pas +++ b/InstallerSamples/!Tutorial/01_First/StringPlus.pas @@ -1,8 +1,8 @@ -// Сложение строк +// Сложение строк var s1: string := 'Pascal'; var s2: string := 'NET'; begin - writeln(s2+'-'+s1); - writeln(s1+'.'+s2); + Writeln(s2+'-'+s1); + Writeln(s1+'.'+s2); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/CompilerError1.pas b/InstallerSamples/!Tutorial/02_Errors/CompilerError1.pas index 89b2f9ac6..fcba51833 100644 --- a/InstallerSamples/!Tutorial/02_Errors/CompilerError1.pas +++ b/InstallerSamples/!Tutorial/02_Errors/CompilerError1.pas @@ -1,8 +1,8 @@ -// Исправьте ошибку компиляции. +// Исправьте ошибку компиляции. // Обратите внимание, что курсор позиционируется в конце слова, вызвавшего ошибку var i: integer begin i := 2; - writeln(i); + Writeln(i); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/CompilerError2.pas b/InstallerSamples/!Tutorial/02_Errors/CompilerError2.pas index 965d64a33..6c173aed9 100644 --- a/InstallerSamples/!Tutorial/02_Errors/CompilerError2.pas +++ b/InstallerSamples/!Tutorial/02_Errors/CompilerError2.pas @@ -1,5 +1,5 @@ -// Исправьте ошибки компиляции. Опишите переменную r +// Исправьте ошибки компиляции. Опишите переменную r begin r := 2.5; - witeln(r); + Witeln(r); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/CompilerError3.pas b/InstallerSamples/!Tutorial/02_Errors/CompilerError3.pas index 77ac7ce3b..7576e94de 100644 --- a/InstallerSamples/!Tutorial/02_Errors/CompilerError3.pas +++ b/InstallerSamples/!Tutorial/02_Errors/CompilerError3.pas @@ -1,8 +1,8 @@ -// Исправьте ошибку компиляции. Не всегда надо "верить" тексту ошибки +// Исправьте ошибку компиляции. Не всегда надо "верить" тексту ошибки var k: real; begin k := 2,5; - writeln(r); + Writeln(r); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/RuntimeError1.pas b/InstallerSamples/!Tutorial/02_Errors/RuntimeError1.pas index 07b8eb262..43a0e5e23 100644 --- a/InstallerSamples/!Tutorial/02_Errors/RuntimeError1.pas +++ b/InstallerSamples/!Tutorial/02_Errors/RuntimeError1.pas @@ -1,7 +1,7 @@ -// Введите не число +// Введите не число // Посмотрите, как выглядит ошибка при выполнении программы var i: integer; begin - read(i); + Read(i); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/RuntimeError2.pas b/InstallerSamples/!Tutorial/02_Errors/RuntimeError2.pas index c505b4c3f..8c54da272 100644 --- a/InstallerSamples/!Tutorial/02_Errors/RuntimeError2.pas +++ b/InstallerSamples/!Tutorial/02_Errors/RuntimeError2.pas @@ -1,6 +1,6 @@ -// Посмотрите, как выглядит ошибка выполнения при целочисленном делении на 0 +// Посмотрите, как выглядит ошибка выполнения при целочисленном делении на 0 var i: integer := 0; begin - write(2 div i); + Write(2 div i); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/RuntimeError3.pas b/InstallerSamples/!Tutorial/02_Errors/RuntimeError3.pas index bd7e13190..e4b336bff 100644 --- a/InstallerSamples/!Tutorial/02_Errors/RuntimeError3.pas +++ b/InstallerSamples/!Tutorial/02_Errors/RuntimeError3.pas @@ -1,6 +1,6 @@ -// При обычном делении на 0 ошибки не возникает +// При вещественном делении на 0 ошибки не возникает var r: real := 0; begin - write(1/0); + Write(1/r); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/02_Errors/RuntimeError4.pas b/InstallerSamples/!Tutorial/02_Errors/RuntimeError4.pas index e5d2f7412..b11155cea 100644 --- a/InstallerSamples/!Tutorial/02_Errors/RuntimeError4.pas +++ b/InstallerSamples/!Tutorial/02_Errors/RuntimeError4.pas @@ -1,4 +1,4 @@ -// При работе с вещественными числами невозможно получить ошибку выполнения +// При работе с вещественными числами невозможно получить ошибку выполнения begin - writeln(sqrt(-1)); + Writeln(Sqrt(-1)); end. \ No newline at end of file diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index 1b7f0b5f6..c13a8052c 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -2,7 +2,7 @@ // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 // Machine: DESKTOP-A6LT9RI -// DateTime: 11.10.2018 17:41:30 +// DateTime: 26.10.2018 20:10:07 // UserName: ????????? // GPLEX input file // GPLEX frame file @@ -2365,6 +2365,13 @@ public LexLocation CurrentLexLocation string full_path = fName; if (!Path.IsPathRooted(full_path)) full_path = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(parsertools.CurrentFileName), fName)); + + if (fNameStack.Contains(full_path)) + { + parsertools.AddErrorFromResource("RECUR_INCLUDE", CurrentLexLocation, fName); + return; + } + SetSource(File.ReadAllText(full_path), 0); fNameStack.Push(parsertools.CurrentFileName); parsertools.CurrentFileName = full_path; diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex index d10586bd8..8b76d1c3a 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex @@ -529,6 +529,13 @@ UNICODEARROW \x890 string full_path = fName; if (!Path.IsPathRooted(full_path)) full_path = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(parsertools.CurrentFileName), fName)); + + if (fNameStack.Contains(full_path)) + { + parsertools.AddErrorFromResource("RECUR_INCLUDE", CurrentLexLocation, fName); + return; + } + SetSource(File.ReadAllText(full_path), 0); fNameStack.Push(parsertools.CurrentFileName); parsertools.CurrentFileName = full_path; diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 658dec987..808aa7751 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,7 +2,7 @@ // GPPG version 1.3.6 // Machine: DESKTOP-A6LT9RI -// DateTime: 11.10.2018 17:41:31 +// DateTime: 26.10.2018 20:10:08 // UserName: ????????? // Input file diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index 926f5725f..f71c1b90b 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -231,5 +231,6 @@ script= + diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 7480dec3d..a34d90f4a 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.4.2.1845' +!define VERSION '3.4.2.1846' diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs index 077cab31c..a5a31f779 100644 --- a/SyntaxTreeConverters/StandardSyntaxConverter.cs +++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs @@ -15,7 +15,6 @@ namespace PascalABCCompiler.SyntaxTreeConverters public string Name { get; } = "Standard"; public syntax_tree_node Convert(syntax_tree_node root) { - CapturedNamesHelper.Reset(); // Прошивание ссылками на Parent nodes. Должно идти первым // FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева //FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не всё. А следующий вызов - всё @@ -59,6 +58,7 @@ namespace PascalABCCompiler.SyntaxTreeConverters PatternsDesugaringVisitor.New.ProcessNode(root); // Всё, связанное с yield + CapturedNamesHelper.Reset(); MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root); ProcessYieldCapturedVarsVisitor.New.ProcessNode(root); diff --git a/SyntaxVisitors/BaseVisitors/SmallHelperVisitors.cs b/SyntaxVisitors/BaseVisitors/SmallHelperVisitors.cs index 63d2d2395..6aeed0b4e 100644 --- a/SyntaxVisitors/BaseVisitors/SmallHelperVisitors.cs +++ b/SyntaxVisitors/BaseVisitors/SmallHelperVisitors.cs @@ -49,4 +49,29 @@ namespace SyntaxVisitors ProcessNode(dn.right); } } + + public class ExprHasNameVisitor : WalkingVisitorNew // есть ли в выражении переменная с данным именем (не включая вложенные лямбды) (используется для поиска Result) + { + private string varname; + public bool Has = false; + public ExprHasNameVisitor(string varname) + { + this.varname = varname.ToLower(); + } + public override void visit(ident id) + { + if (id.name.ToLower() == varname) + Has = true; + } + public override void visit(dot_node dn) + { + ProcessNode(dn.left); + if (dn.right.GetType() != typeof(ident)) + ProcessNode(dn.right); + } + public override void visit(function_lambda_definition fd) + { + } + } + } diff --git a/bin/Lng/Eng/PascalABCParser.dat b/bin/Lng/Eng/PascalABCParser.dat index 27bd08530..7b54ae781 100644 --- a/bin/Lng/Eng/PascalABCParser.dat +++ b/bin/Lng/Eng/PascalABCParser.dat @@ -21,6 +21,7 @@ UNEXPECTED_SYMBOL{0}=Unexpected symbol '{0}' UNSUPPORTED_OLD_DIRECTIVES=Compiler directives began with # are not supported. Use directives {$ } INCLUDE_COULDNT_OPEN_FILE{0}=Compiler directive $include: can't open file '{0}' INCLUDE_EMPTY_FILE=Compiler directive $include: file name is absent +RECUR_INCLUDE=Compiler directive $include: recursive include UNNECESSARY $endif=Extra $endif ENDIF_ABSENT=Not closed directive $ifdef or $ifndef - $endif is absent UNNECESSARY $else=Extra $else diff --git a/bin/Lng/Rus/PascalABCParser.dat b/bin/Lng/Rus/PascalABCParser.dat index d6eafc102..2ca8f1788 100644 --- a/bin/Lng/Rus/PascalABCParser.dat +++ b/bin/Lng/Rus/PascalABCParser.dat @@ -21,6 +21,7 @@ UNEXPECTED_SYMBOL{0}=Неожиданный символ '{0}' UNSUPPORTED_OLD_DIRECTIVES=Директивы компилятора в стиле # более не поддерживаются. Используйте директивы в стиле {$ } INCLUDE_COULDNT_OPEN_FILE{0}=Директива компилятора $include: нельзя открыть файл '{0}' INCLUDE_EMPTY_FILE=Директива компилятора $include: не указано имя файла +RECUR_INCLUDE=Директива компилятора $include: рекурсивное включение файла UNNECESSARY $endif=Лишний $endif ENDIF_ABSENT=Незакрытая директива $ifdef или $ifndef - отсутствует $endif UNNECESSARY $else=Лишний $else