This commit is contained in:
miks1965 2018-10-26 20:12:42 +03:00
parent 64ef16a3fa
commit 02991b622f
37 changed files with 171 additions and 142 deletions

View file

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

View file

@ -1,4 +1,4 @@
%COREVERSION%=2
%REVISION%=1845
%MINOR%=4
%REVISION%=1846
%COREVERSION%=2
%MAJOR%=3

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
// Первая программа
// Первая программа
program HelloWorld;
begin
writeln('Привет, мир!');
Writeln('Привет, мир!');
end.

View file

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

View file

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

View file

@ -1,8 +1,6 @@
// Ввод строки
var s: string;
// Ввод строки
begin
write('Введите Ваше имя: ');
readln(s);
writeln('Здравствуйте, ',s);
var имя := ReadString('Введите Ваше имя:');
Writeln($'Здравствуйте, {имя}!');
end.

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +1,8 @@
// Исправьте ошибку компиляции.
// Исправьте ошибку компиляции.
// Обратите внимание, что курсор позиционируется в конце слова, вызвавшего ошибку
var i: integer
begin
i := 2;
writeln(i);
Writeln(i);
end.

View file

@ -1,5 +1,5 @@
// Исправьте ошибки компиляции. Опишите переменную r
// Исправьте ошибки компиляции. Опишите переменную r
begin
r := 2.5;
witeln(r);
Witeln(r);
end.

View file

@ -1,8 +1,8 @@
// Исправьте ошибку компиляции. Не всегда надо "верить" тексту ошибки
// Исправьте ошибку компиляции. Не всегда надо "верить" тексту ошибки
var k: real;
begin
k := 2,5;
writeln(r);
Writeln(r);
end.

View file

@ -1,7 +1,7 @@
// Введите не число
// Введите не число
// Посмотрите, как выглядит ошибка при выполнении программы
var i: integer;
begin
read(i);
Read(i);
end.

View file

@ -1,6 +1,6 @@
// Посмотрите, как выглядит ошибка выполнения при целочисленном делении на 0
// Посмотрите, как выглядит ошибка выполнения при целочисленном делении на 0
var i: integer := 0;
begin
write(2 div i);
Write(2 div i);
end.

View file

@ -1,6 +1,6 @@
// При обычном делении на 0 ошибки не возникает
// При вещественном делении на 0 ошибки не возникает
var r: real := 0;
begin
write(1/0);
Write(1/r);
end.

View file

@ -1,4 +1,4 @@
// При работе с вещественными числами невозможно получить ошибку выполнения
// При работе с вещественными числами невозможно получить ошибку выполнения
begin
writeln(sqrt(-1));
Writeln(Sqrt(-1));
end.

View file

@ -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 <ABCPascal.lex>
// GPLEX frame file <embedded resource>
@ -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;

View file

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

View file

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

View file

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

View file

@ -1 +1 @@
!define VERSION '3.4.2.1845'
!define VERSION '3.4.2.1846'

View file

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

View file

@ -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)
{
}
}
}

View file

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

View file

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