parent
bbaf43ba05
commit
31f153266f
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "4";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "1739";
|
||||
public const string Revision = "1741";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=1739
|
||||
%REVISION%=1741
|
||||
%MINOR%=4
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
uses GraphABC;
|
||||
uses GraphABC;
|
||||
|
||||
procedure DrawCell(a: array [,] of integer; x,y: integer);
|
||||
var sz := 30;
|
||||
|
|
@ -49,20 +49,20 @@ begin
|
|||
var c := f.ReadChar;
|
||||
a[y,x]:= c='*' ? 1 : 0;
|
||||
end;
|
||||
readln(f)
|
||||
f.Readln
|
||||
end;
|
||||
f.Close;
|
||||
end;
|
||||
|
||||
procedure Draw(a: array [,] of integer);
|
||||
begin
|
||||
for var y := 0 to a.GetLength(1)-1 do
|
||||
for var x := 0 to a.GetLength(0)-1 do
|
||||
for var y := 0 to a.RowCount-1 do
|
||||
for var x := 0 to a.ColCount-1 do
|
||||
DrawCell(a,x,y);
|
||||
end;
|
||||
|
||||
begin
|
||||
Window.Title := 'Èëëþñòðàöèÿ àëãîðèòìà FloodFill';
|
||||
Window.Title := 'Иллюстрация алгоритма FloodFill';
|
||||
var a: array [,] of integer;
|
||||
ReadFromFile('field.txt',a);
|
||||
Draw(a);
|
||||
|
|
|
|||
9
InstallerSamples/Algorithms/field.txt
Normal file
9
InstallerSamples/Algorithms/field.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
7 8
|
||||
********
|
||||
* *** *
|
||||
** * *
|
||||
* **
|
||||
** *
|
||||
* ** ***
|
||||
********
|
||||
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
// Игра Жизнь на торе
|
||||
// Игра Жизнь на торе
|
||||
// Оптимизация хешированием по равномерной сетке
|
||||
|
||||
|
||||
uses Utils,GraphABC;
|
||||
uses GraphABC;
|
||||
|
||||
const
|
||||
w =3;
|
||||
|
|
@ -19,8 +18,11 @@ const
|
|||
y0=21;
|
||||
ClearColor=clBlack;
|
||||
FillColor=clLimeGreen;
|
||||
FiledColor=RGB(0,40,0);
|
||||
FiledColor2=RGB(0,70,0);{}
|
||||
|
||||
var
|
||||
FiledColor := RGB(0,40,0);
|
||||
FiledColor2 := RGB(0,70,0);
|
||||
|
||||
{ClearColor=clWhite;
|
||||
FillColor=clBlack;
|
||||
FiledColor=clLightGray;
|
||||
|
|
|
|||
|
|
@ -1,40 +1,20 @@
|
|||
type
|
||||
Expr = class
|
||||
Expr = interface
|
||||
end;
|
||||
V = auto class(Expr)
|
||||
name: string;
|
||||
procedure Deconstruct(var name: string);
|
||||
begin
|
||||
name := Self.name
|
||||
end;
|
||||
end;
|
||||
Cons = auto class(Expr)
|
||||
r: real;
|
||||
procedure Deconstruct(var r: real);
|
||||
begin
|
||||
r := Self.r
|
||||
end;
|
||||
end;
|
||||
Add = auto class(Expr)
|
||||
left,right: Expr;
|
||||
procedure Deconstruct(var l,r: Expr);
|
||||
begin
|
||||
l := left; r := right;
|
||||
end;
|
||||
end;
|
||||
Mult = auto class(Expr)
|
||||
left,right: Expr;
|
||||
procedure Deconstruct(var l,r: Expr);
|
||||
begin
|
||||
l := left; r := right;
|
||||
end;
|
||||
end;
|
||||
Neg = auto class(Expr)
|
||||
ex: Expr;
|
||||
procedure Deconstruct(var ex: Expr);
|
||||
begin
|
||||
ex := Self.ex
|
||||
end;
|
||||
end;
|
||||
|
||||
function NegC(ex: Expr) := new Neg(ex);
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -2,7 +2,7 @@
|
|||
// This CSharp output file generated by Gardens Point LEX
|
||||
// Version: 1.1.3.301
|
||||
// Machine: DESKTOP-A6LT9RI
|
||||
// DateTime: 11.08.2018 11:03:55
|
||||
// DateTime: 12.08.2018 14:37:17
|
||||
// UserName: ?????????
|
||||
// GPLEX input file <ABCPascal.lex>
|
||||
// GPLEX frame file <embedded resource>
|
||||
|
|
|
|||
|
|
@ -862,10 +862,10 @@ const_factor
|
|||
}
|
||||
| new_expr
|
||||
{ $$ = $1; }
|
||||
| tkDeref const_factor
|
||||
{
|
||||
$$ = new roof_dereference($2 as addressed_value, @$);
|
||||
}
|
||||
// | tkDeref const_factor
|
||||
// {
|
||||
// $$ = new roof_dereference($2 as addressed_value, @$);
|
||||
// }
|
||||
;
|
||||
|
||||
const_set
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -207,5 +207,6 @@ script=
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.4.0.1739'
|
||||
!define VERSION '3.4.0.1741'
|
||||
|
|
|
|||
|
|
@ -59,6 +59,14 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
return fp;
|
||||
}
|
||||
|
||||
public static formal_parameters BuildFormalVarParameters(List<ident> names, List<type_definition> types)
|
||||
{
|
||||
var fp = new formal_parameters();
|
||||
for (int i = 0; i < names.Count; i++)
|
||||
fp.Add(new typed_parameters(new ident_list(names[i]), types[i],parametr_kind.var_parametr,null));
|
||||
return fp;
|
||||
}
|
||||
|
||||
public static statement_list BuildSimpleAssignList(List<ident> lnames, List<ident> rnames)
|
||||
{
|
||||
var sl = new statement_list();
|
||||
|
|
@ -77,6 +85,16 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
return new procedure_definition(new constructor(fp), new block(sl));
|
||||
}
|
||||
|
||||
public static procedure_definition BuildSimpleDeConstruct(List<ident> fields, List<ident> formal_names, List<type_definition> types)
|
||||
{
|
||||
var fp = SyntaxTreeBuilder.BuildFormalVarParameters(formal_names, types);
|
||||
if (fp.params_list.Count == 0)
|
||||
fp = null;
|
||||
var sl = SyntaxTreeBuilder.BuildSimpleAssignList(formal_names, fields);
|
||||
|
||||
return new procedure_definition(new procedure_header("Deconstruct",fp), new block(sl));
|
||||
}
|
||||
|
||||
public static class_members BuildSimpleConstructorSection(List<ident> fields, List<ident> formal_names, List<type_definition> types)
|
||||
{
|
||||
var cm = new class_members(access_modifer.public_modifer);
|
||||
|
|
@ -84,6 +102,13 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
return cm;
|
||||
}
|
||||
|
||||
public static class_members BuildSimpleDeconstructSection(List<ident> fields, List<ident> formal_names, List<type_definition> types)
|
||||
{
|
||||
var cm = new class_members(access_modifer.public_modifer);
|
||||
cm.Add(BuildSimpleDeConstruct(fields, formal_names, types));
|
||||
return cm;
|
||||
}
|
||||
|
||||
public static simple_property BuildSimpleReadWriteProperty(ident name, ident field, type_definition type)
|
||||
{
|
||||
return new simple_property(name, type, new property_accessors(new read_accessor_name(field,null,null), new write_accessor_name(field, null, null)));
|
||||
|
|
@ -141,6 +166,7 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
class_body_list cb = cd.body;
|
||||
bool HasToString = false;
|
||||
bool HasConstructor = false;
|
||||
bool HasDeconstruct = false;
|
||||
foreach (var l in cb.class_def_blocks)
|
||||
{
|
||||
foreach (var m in l.members)
|
||||
|
|
@ -167,7 +193,15 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
HasConstructor = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!HasDeconstruct)
|
||||
{
|
||||
if (ts != null && ts.proc_header.name != null && ts.proc_header.name.meth_name.name != null)
|
||||
{
|
||||
HasDeconstruct = ts.proc_header.name.meth_name.name.ToLower().Equals("deconstruct");
|
||||
}
|
||||
}
|
||||
|
||||
if (!HasToString)
|
||||
{
|
||||
|
|
@ -188,6 +222,13 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
//cb.class_def_blocks.Insert(0, cm);
|
||||
}
|
||||
|
||||
if (!HasDeconstruct)
|
||||
{
|
||||
var fnames = names.Select(x => new ident("f" + x.name)).ToList();
|
||||
var cm = BuildSimpleDeconstructSection(names, fnames, types);
|
||||
cb.Add(cm);
|
||||
}
|
||||
|
||||
if (!HasToString)
|
||||
{
|
||||
var tostr = BuildToStringFuncForAutoClass(names);
|
||||
|
|
|
|||
|
|
@ -3650,6 +3650,17 @@ namespace PascalABCCompiler.TreeConverter
|
|||
// AddError(new AutoClassMustNotHaveParents(get_location(_class_definition)));
|
||||
// добавление членов автоклассов. Не забыть сделать, что от автоклассов нельзя наследовать
|
||||
// Это спорный вопрос. С другой стороны от автоклассов хочется наследовать
|
||||
|
||||
var cp = _class_definition.class_parents;
|
||||
if (cp != null)
|
||||
foreach (var c in cp.types)
|
||||
{
|
||||
var ff = convert_strong(c);
|
||||
if (!ff.IsInterface)
|
||||
AddError(new AutoClassMustNotHaveParents(get_location(_class_definition)));
|
||||
|
||||
}
|
||||
|
||||
SyntaxTreeBuilder.AddMembersForAutoClass(_class_definition,ref names,ref types);
|
||||
for (var i = 0; i < types.Count; i++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
NAME_CANNOT_HAVE_GENERIC_PARAMETERS_{0}=Name {0} can not have generic parameters
|
||||
AUTO_CLASS_MUST_NOT_HAVE_POINTERS=Auto class can not have fields of pointer type
|
||||
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Auto class can not have parents or implement interfaces
|
||||
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Auto class can not have parents
|
||||
UNDEFINED_NAME_REFERENCE_{0}=Undefined name reference '{0}'
|
||||
TWO_TYPE_CONVERTIONS_POSSIBLE_FIRST_TYPE_{0}_SECOND_TYE_{1}=Two type of convertions are possible: to type '{0}' and to type '{1}'
|
||||
CAN_NOT_CONVERT_TYPES_FROM_{0}_TO_{1}=Incompatible types: '{0}' and '{1}'
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
NAME_CANNOT_HAVE_GENERIC_PARAMETERS_{0}=Имя {0} не может иметь обобщенные параметры
|
||||
AUTO_CLASS_MUST_NOT_HAVE_POINTERS=Авто класс не может иметь поля, являющиеся указателями
|
||||
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Авто класс не может иметь предков или реализовывать интерфейсы
|
||||
AUTO_CLASS_MUST_NOT_HAVE_PARENTS=Авто класс не может иметь предков
|
||||
UNDEFINED_NAME_REFERENCE_{0}=Неизвестное имя '{0}'
|
||||
TWO_TYPE_CONVERTIONS_POSSIBLE_FIRST_TYPE_{0}_SECOND_TYE_{1}=Возможны два преобразования типа: к типу {0} и к типу {1}
|
||||
CAN_NOT_CONVERT_TYPES_FROM_{0}_TO_{1}=Нельзя преобразовать тип {0} к {1}
|
||||
|
|
|
|||
Loading…
Reference in a new issue