This commit is contained in:
Mikhalkovich Stanislav 2018-12-01 13:08:46 +03:00
parent 370cbf5175
commit bbebfede4c
9 changed files with 34 additions and 17 deletions

View file

@ -2,7 +2,7 @@
// This CSharp output file generated by Gardens Point LEX
// Version: 1.1.3.301
// Machine: DESKTOP-G8V08V4
// DateTime: 24.11.2018 8:10:22
// DateTime: 01.12.2018 12:55:41
// UserName: ?????????
// GPLEX input file <ABCPascal.lex>
// GPLEX frame file <embedded resource>

View file

@ -24,6 +24,7 @@
%using PascalABCCompiler.ParserTools;
%using PascalABCCompiler.Errors;
%using System.Linq;
%using SyntaxVisitors;
%namespace GPPGParserScanner
@ -4524,7 +4525,11 @@ common_lambda_body
lambda_function_body
: expr_l1
{
//$$ = NewLambdaBody($1, @$);
var id = SyntaxVisitors.ExprHasNameVisitor.HasName($1, "Result");
if (id != null)
{
parsertools.AddErrorFromResource("RESULT_IDENT_NOT_EXPECTED_IN_THIS_CONTEXT", id.source_context);
}
var sl = new statement_list(new assign("result",$1,@$),@$); // íàäî ïîìå÷àòü åù¸ è assign êàê àâòîñãåíåðèðîâàííûé äëÿ ëÿìáäû - ÷òîáû çàïðåòèòü ÿâíûé Result
sl.expr_lambda_body = true;
$$ = sl;

View file

@ -2,7 +2,7 @@
// GPPG version 1.3.6
// Machine: DESKTOP-G8V08V4
// DateTime: 24.11.2018 8:10:22
// DateTime: 01.12.2018 12:55:41
// UserName: ?????????
// Input file <ABCPascal.y>
@ -18,6 +18,7 @@ using PascalABCSavParser;
using PascalABCCompiler.ParserTools;
using PascalABCCompiler.Errors;
using System.Linq;
using SyntaxVisitors;
namespace GPPGParserScanner
{
@ -6773,8 +6774,12 @@ public partial class GPPGParser: ShiftReduceParser<PascalABCSavParser.Union, Lex
break;
case 892: // lambda_function_body -> expr_l1
{
//$$ = NewLambdaBody($1, @$);
var sl = new statement_list(new assign("result",ValueStack[ValueStack.Depth-1].ex,CurrentLocationSpan),CurrentLocationSpan); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> assign <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*var id = SyntaxVisitors.ExprHasNameVisitor.HasName(ValueStack[ValueStack.Depth-1].ex, "Result");
if (id != null)
{
parsertools.AddErrorFromResource("RESULT_IDENT_NOT_EXPECTED_IN_THIS_CONTEXT", id.source_context);
}*/
var sl = new statement_list(new assign("result",ValueStack[ValueStack.Depth-1].ex,CurrentLocationSpan),CurrentLocationSpan); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> assign <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Result
sl.expr_lambda_body = true;
CurrentSemanticValue.stn = sl;
}

View file

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

View file

@ -126,14 +126,14 @@
<Project>{AF2EFD7B-69DD-4B43-AF65-B59B29349C23}</Project>
<Name>ParserTools</Name>
</ProjectReference>
<ProjectReference Include="..\..\SemanticTree\SemanticTree.csproj">
<Project>{613e0dda-aa8a-437c-ac45-507b47429ff9}</Project>
<Name>SemanticTree</Name>
</ProjectReference>
<ProjectReference Include="..\..\SyntaxTree\SyntaxTree.csproj">
<Project>{C2CAC65A-B2AE-4CCC-B067-E6B8E75DF73A}</Project>
<Name>SyntaxTree</Name>
</ProjectReference>
<ProjectReference Include="..\..\SyntaxVisitors\SyntaxVisitors.csproj">
<Project>{a9ab4282-83b4-41a7-86c3-e5bf6a45e7e2}</Project>
<Name>SyntaxVisitors</Name>
</ProjectReference>
<ProjectReference Include="..\..\TreeConverter\TreeConverter.csproj">
<Project>{1c9c945a-586d-42a2-a06b-65d84fa7ff78}</Project>
<Name>TreeConverter</Name>

View file

@ -53,15 +53,21 @@ namespace SyntaxVisitors
public class ExprHasNameVisitor : WalkingVisitorNew // есть ли в выражении переменная с данным именем (не включая вложенные лямбды) (используется для поиска Result)
{
private string varname;
public bool Has = false;
public ident id = null;
public static ident HasName(expression ex, string varname)
{
var v = new ExprHasNameVisitor(varname);
v.ProcessNode(ex);
return v.id;
}
public ExprHasNameVisitor(string varname)
{
this.varname = varname.ToLower();
}
public override void visit(ident id)
public override void visit(ident i)
{
if (id.name.ToLower() == varname)
Has = true;
if (i.name.ToLower() == varname)
id = i;
}
public override void visit(dot_node dn)
{

View file

@ -37,8 +37,6 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>

View file

@ -69,4 +69,5 @@ BAD_INT2=Too small int64
INVALID_INTERFACE_MEMBER=Interface members cannot have definitions
EXTENDED_INDEXED_PROPERTIES=Extended indexed properties are not realized
ATTRIBUTE_REDECLARED=This attribute has been already applied to type
STATIC_PROPERTIES_CANNOT_HAVE_ATTRBUTE_{0}=Static properties cannot have attribute '{0}'
STATIC_PROPERTIES_CANNOT_HAVE_ATTRBUTE_{0}=Static properties cannot have attribute '{0}'
RESULT_IDENT_NOT_EXPECTED_IN_THIS_CONTEXT=Result identifier is not allowed in this context

View file

@ -70,4 +70,5 @@ INVALID_INTERFACE_MEMBER=Члены интерфейса не могут име
EXTENDED_INDEXED_PROPERTIES=Индексные свойства не могут быть расширенными
TWO_STRING_LITERALS_IN_SUCCESSION=Две литеральные строковые константы не могут стоять подряд
ATTRIBUTE_REDECLARED=Повторное применение атрибута
STATIC_PROPERTIES_CANNOT_HAVE_ATTRBUTE_{0}=Статические свойства не могут иметь атрибут '{0}'
STATIC_PROPERTIES_CANNOT_HAVE_ATTRBUTE_{0}=Статические свойства не могут иметь атрибут '{0}'
RESULT_IDENT_NOT_EXPECTED_IN_THIS_CONTEXT=Имя Result недопустимо в этом контексте