процедура Deconstruct автогенерируется для автоклассов
This commit is contained in:
miks1965 2018-08-12 21:16:18 +03:00
parent bbaf43ba05
commit 31f153266f
16 changed files with 2875 additions and 2839 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 = "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;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=1739
%REVISION%=1741
%MINOR%=4
%MAJOR%=3

View file

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

View file

@ -0,0 +1,9 @@
7 8
********
* *** *
** * *
* **
** *
* ** ***
********

View file

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

View file

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

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.08.2018 11:03:55
// DateTime: 12.08.2018 14:37:17
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>

View file

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

View file

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

View file

@ -1 +1 @@
!define VERSION '3.4.0.1739'
!define VERSION '3.4.0.1741'

View file

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

View file

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

View file

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

View file

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