This commit is contained in:
miks1965 2017-11-02 12:21:02 +03:00
parent 6e175c6ce5
commit f386c9a44d
11 changed files with 72 additions and 27 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "3";
public const string Build = "0";
public const string Revision = "1556";
public const string Revision = "1561";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=3
%REVISION%=1556
%COREVERSION%=0
%REVISION%=1561
%MINOR%=3
%MAJOR%=3

View file

@ -1 +1 @@
!define VERSION '3.3.0.1556'
!define VERSION '3.3.0.1561'

View file

@ -49,9 +49,9 @@ namespace PascalABCCompiler.SyntaxTreeConverters
#if DEBUG
/*var cv = CollectLightSymInfoVisitor.New;
cv.ProcessNode(root);
cv.Output(@"d:\\Light1.txt");*/
//var cv = CollectLightSymInfoVisitor.New;
//cv.ProcessNode(root);
//cv.Output(@"Light1.txt");
/*try
{

View file

@ -17,7 +17,10 @@ using System.Text;
namespace PascalABCCompiler.SyntaxTree
{
public enum SymKind { var, field, param, procname, funcname };
public enum SymKind { var, field, param, procname, funcname, classname, recordname, interfacename };
[Flags]
public enum Attributes { class_attr = 1, varparam_attr = 2};
public class SymInfoSyntax
{
@ -27,16 +30,24 @@ namespace PascalABCCompiler.SyntaxTree
if (SK == SymKind.var || SK == SymKind.field || SK == SymKind.field || SK == SymKind.param)
typepart = ": " + (Td == null ? "NOTYPE" : Td.ToString());
typepart = typepart.Replace("PascalABCCompiler.SyntaxTree.", "");
return "(" + Id.ToString() + "{" + SK.ToString() + "}" + typepart + ")";
var attrstr = Attr != 0 ? "[" + Attr.ToString() + "]" : "";
var s = "(" + Id.ToString() + "{" + SK.ToString() + "}" + typepart + attrstr + ")";
return s;
}
public ident Id { get; set; }
public type_definition Td { get; set; }
public SymKind SK { get; set; }
public SymInfoSyntax(ident Id, SymKind SK, type_definition Td = null)
public Attributes Attr { get; set; }
public SymInfoSyntax(ident Id, SymKind SK, type_definition Td = null, Attributes Attr = 0)
{
this.Id = Id;
this.Td = Td;
this.SK = SK;
this.Attr = Attr;
}
public void AddAttribute(Attributes attr)
{
Attr &= attr;
}
}
@ -70,6 +81,10 @@ namespace PascalABCCompiler.SyntaxTree
{
public RecordScopeSyntax(ident Name) : base(Name) { }
} //
public class InterfaceScopeSyntax : NamedScopeSyntax
{
public InterfaceScopeSyntax(ident Name) : base(Name) { }
}
public class LightScopeSyntax : ScopeSyntax // предок всех легковесных
{
public override string ToString()
@ -91,6 +106,5 @@ namespace PascalABCCompiler.SyntaxTree
public class ForScopeSyntax : LightScopeSyntax { } // statement_list
public class ForeachScopeSyntax : LightScopeSyntax { } // statement_list
public class LambdaScopeSyntax : ScopeSyntax { }
}

View file

@ -36,9 +36,10 @@ namespace PascalABCCompiler.SyntaxTree
break;
case procedure_definition p:
var name = p.proc_header.name.meth_name;
var attr = p.proc_header.class_keyword ? Attributes.class_attr : 0;
if (p.proc_header is function_header)
AddSymbol(name, SymKind.funcname);
else AddSymbol(name, SymKind.procname);
AddSymbol(name, SymKind.funcname,null, attr);
else AddSymbol(name, SymKind.procname, null, attr);
t = new ProcScopeSyntax(name);
break;
case formal_parameters p:
@ -61,13 +62,22 @@ namespace PascalABCCompiler.SyntaxTree
break;
case class_definition p:
var td = p.Parent as type_declaration;
var tname = td.type_name;
t = new ClassScopeSyntax(tname);
break;
case record_type p:
var td1 = p.Parent as type_declaration;
var rname = td1.type_name;
t = new RecordScopeSyntax(rname);
var tname = td==null ? "NONAME" : td.type_name;
if (p.keyword == class_keyword.Class)
{
AddSymbol(tname, SymKind.classname);
t = new ClassScopeSyntax(tname);
}
else if (p.keyword == class_keyword.Record)
{
AddSymbol(tname, SymKind.recordname);
t = new RecordScopeSyntax(tname);
}
else if (p.keyword == class_keyword.Interface)
{
AddSymbol(tname, SymKind.interfacename);
t = new InterfaceScopeSyntax(tname);
}
break;
case function_lambda_definition p:
t = new LambdaScopeSyntax();
@ -109,10 +119,11 @@ namespace PascalABCCompiler.SyntaxTree
}
public override void visit(var_def_statement vd)
{
var attr = vd.var_attr == definition_attribute.Static ? Attributes.class_attr : 0;
if (vd == null || vd.vars == null || vd.vars.list == null)
return;
var type = vd.vars_type;
var q = vd.vars.list.Select(x => new SymInfoSyntax(x, SymKind.var, type));
var q = vd.vars.list.Select(x => new SymInfoSyntax(x, SymKind.var, type, attr));
if (q.Count() > 0)
Current.Symbols.AddRange(q);
base.visit(vd);

View file

@ -20,9 +20,9 @@ namespace PascalABCCompiler.SyntaxTree
{
public partial class CollectLightSymInfoVisitor : BaseEnterExitVisitor
{
public void AddSymbol(ident name, SymKind kind, type_definition td = null)
public void AddSymbol(ident name, SymKind kind, type_definition td = null, Attributes attr = 0)
{
Current.Symbols.Add(new SymInfoSyntax(name, kind, td));
Current.Symbols.Add(new SymInfoSyntax(name, kind, td, attr));
}
public string Spaces(int n) => new string(' ', n);
public void OutputString(string s) => System.IO.File.AppendAllText(fname, s);

View file

@ -1064,7 +1064,6 @@ begin
labelExState.Text := 'Робот: Работа окончена'
else
labelExState.Text := 'Робот: Работа окончена, задание не выполнено';
System.Console.Write(RobField.TaskName);
end;
var

View file

@ -0,0 +1,17 @@
type
Ó÷åíèê = record
Èìÿ: string;
Êëàññ: integer;
end;
begin
var p: Ó÷åíèê;
p.Èìÿ := 'dfh';
var pupils: array of Ó÷åíèê := Arr(p,p,p);
var question := pupils.GroupBy(p->p.Êëàññ);
foreach var group in question do
begin
foreach var pp: Ó÷åíèê in group do
Println(pp);
end;
end.

View file

@ -16869,11 +16869,16 @@ namespace PascalABCCompiler.TreeConverter
else
{
var ip = tn.instance_params;
var IGrTstring = "System.Linq.IGrouping`2";
if (ct.ToString().StartsWith(IGrTstring))
elem_type = ip[1];
else
elem_type = ip[0];
//var Tname = ip[0].name;
//elem_type = convert_strong(new SyntaxTree.named_type_reference(Tname, _foreach_stmt.in_what.source_context));
elem_type = ip[0];
}
//elem_type.instance_params = tn.instance_params;
//var ip = tn.instance_params;
//var Tname = new string(tn.name.SkipWhile(c => c != '<').Skip(1).TakeWhile(c => c != ',' && c != '>').ToArray());

View file

@ -1064,7 +1064,6 @@ begin
labelExState.Text := 'Робот: Работа окончена'
else
labelExState.Text := 'Робот: Работа окончена, задание не выполнено';
System.Console.Write(RobField.TaskName);
end;
var