From 5c11c87960a68d4d4b9dc4563e0cbfb06135d26e Mon Sep 17 00:00:00 2001 From: Alexander Zakharenko Date: Sun, 12 Feb 2017 19:52:59 +0300 Subject: [PATCH 01/26] Add type_pattern --- .../PascalABCParserNewSaushkin/ABCPascal.cs | 6 +- .../PascalABCParserNewSaushkin/ABCPascal.y | 40 +- .../ABCPascalYacc.cs | 2860 +++++++++-------- .../ShiftReduceParserCode.cs | 7 +- SyntaxTree/tree/AbstractVisitor.cs | 15 + SyntaxTree/tree/HierarchyVisitor.cs | 49 + .../SyntaxTemplates/SyntaxWithListMethods.txt | 8 +- SyntaxTree/tree/SyntaxTreeStreamReader.cs | 43 + SyntaxTree/tree/SyntaxTreeStreamWriter.cs | 72 + SyntaxTree/tree/Tree.cs | 750 ++++- SyntaxTree/tree/TreeHelper.cs | 18 + SyntaxTree/tree/Visitor.cs | 18 + SyntaxTree/tree/tree.nin | Bin 172625 -> 173912 bytes .../StandardSyntaxConverter.cs | 2 + SyntaxVisitors/SyntaxVisitors.csproj | 5 + .../TreeConversion/SubtreeCreator.cs | 91 +- bin/Lib/PABCSystem.pas | 20 + pabcnetc/ConsoleCompiler.cs | 2 +- 18 files changed, 2383 insertions(+), 1623 deletions(-) diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index 5c5b5eb34..0703d7743 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -1,9 +1,9 @@ // // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 -// Machine: DESKTOP-8EAQPI9 -// DateTime: 26.01.2017 15:17:45 -// UserName: ????????? +// Machine: ALEXANDER-PC +// DateTime: 11.02.2017 23:17:52 +// UserName: Alexander // GPLEX input file // GPLEX frame file // diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index fc42c4845..cc3bf5f44 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -168,6 +168,7 @@ %type full_lambda_fp_list lambda_simple_fp_sect lambda_function_body lambda_procedure_body optional_full_lambda_fp_list %type field_in_unnamed_object list_fields_in_unnamed_object func_class_name_ident_list rem_lambda variable_list var_variable_list %type tkAssignOrEqual +%type pattern %% @@ -2666,7 +2667,20 @@ expr : expr_l1 { $$ = $1; } | format_expr - { $$ = $1; } + { + /*var formatExpr = $1 as format_expr; + var expr = formatExpr.expr as typecast_node; + if (expr != null) + { + var identifier = (expr.type_def as named_type_reference).names[0]; + a + var type = formatExpr.format1 as ident + var pattern = new type_pattern(identifier, , identifier.source_context); + $$ = new is_pattern_expr(expr, pattern, formatExpr.source_context); + } + else*/ + $$ = $1; + } ; expr_l1 @@ -2818,8 +2832,30 @@ relop_expr { $$ = new bin_expr($1, $3, $2.type, @$); } + | as_is_expr tkColon type_ref + { + var asExpr = $1 as typecast_node; + var typeDef = asExpr.type_def as named_type_reference; + if (typeDef != null && typeDef.names.Count > 0) + { + var pattern = new type_pattern(typeDef.names[0], $3); + $$ = new is_pattern_expr(asExpr.expr, pattern, @$); + } + else + { + parsertools.errors.Add(new unexpected_ident(parsertools.CurrentFileName, new ident(), "", @$, null)); + $$ = null; + } + } ; - + +pattern + : identifier tkColon type_ref + { + $$ = new type_pattern($1, $3); + } + ; + simple_expr_or_nothing : simple_expr { diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 0ace57f94..1a450e543 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -1,10 +1,10 @@ // (see accompanying GPPGcopyright.rtf) // GPPG version 1.3.6 -// Machine: DESKTOP-8EAQPI9 -// DateTime: 26.01.2017 15:17:46 -// UserName: ????????? -// Input file +// Machine: ALEXANDER-PC +// DateTime: 11.02.2017 23:17:52 +// UserName: Alexander +// Input file // options: no-lines gplex @@ -56,7 +56,7 @@ public abstract class ScanBase : AbstractScanner { - // Verbatim content from J:\PascalABC.NET\!PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y + // Verbatim content from ABCPascal.y // ��� ���������� ����������� � ����� GPPGParser, �������������� ����� ������, ������������ �������� gppg public syntax_tree_node root; // �������� ���� ��������������� ������ @@ -68,13 +68,13 @@ public partial class GPPGParser: ShiftReduceParser scanner) : base(scanner) { } - // End verbatim content from J:\PascalABC.NET\!PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y + // End verbatim content from ABCPascal.y #pragma warning disable 649 private static Dictionary aliasses; #pragma warning restore 649 - private static Rule[] rules = new Rule[815]; - private static State[] states = new State[1306]; + private static Rule[] rules = new Rule[817]; + private static State[] states = new State[1309]; private static string[] nonTerms = new string[] { "parse_goal", "unit_key_word", "assignment", "optional_array_initializer", "attribute_declarations", "ot_visibility_specifier", "one_attribute", "attribute_variable", @@ -149,16 +149,16 @@ public partial class GPPGParser: ShiftReduceParser format_expr -{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } +{ + /*var formatExpr = $1 as format_expr; + var expr = formatExpr.expr as typecast_node; + if (expr != null) + { + var identifier = (expr.type_def as named_type_reference).names[0]; + a + var type = formatExpr.format1 as ident + var pattern = new type_pattern(identifier, , identifier.source_context); + $$ = new is_pattern_expr(expr, pattern, formatExpr.source_context); + } + else*/ + CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; + } break; case 537: // expr_l1 -> relop_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } @@ -4770,149 +4788,159 @@ public partial class GPPGParser: ShiftReduceParser simple_expr + case 560: // relop_expr -> as_is_expr, tkColon, type_ref +{ + var asExpr = ValueStack[ValueStack.Depth-3].ex as typecast_node; + var typeDef = asExpr.type_def as named_type_reference; + if (typeDef != null && typeDef.names.Count > 0) + { + var pattern = new type_pattern(typeDef.names[0], ValueStack[ValueStack.Depth-1].td); + CurrentSemanticValue.ex = new is_pattern_expr(asExpr.expr, pattern, CurrentLocationSpan); + } + else + { + parsertools.errors.Add(new unexpected_ident(parsertools.CurrentFileName, new ident(), "", CurrentLocationSpan, null)); + CurrentSemanticValue.ex = null; + } + } + break; + case 561: // pattern -> identifier, tkColon, type_ref +{ + CurrentSemanticValue.stn = new type_pattern(ValueStack[ValueStack.Depth-3].id, ValueStack[ValueStack.Depth-1].td); + } + break; + case 562: // simple_expr_or_nothing -> simple_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 561: // simple_expr_or_nothing -> /* empty */ + case 563: // simple_expr_or_nothing -> /* empty */ { CurrentSemanticValue.ex = new int32_const(int.MaxValue); } break; - case 562: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing + case 564: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 563: // format_expr -> tkColon, simple_expr_or_nothing + case 565: // format_expr -> tkColon, simple_expr_or_nothing { CurrentSemanticValue.ex = new format_expr(new int32_const(int.MaxValue), ValueStack[ValueStack.Depth-1].ex, null, CurrentLocationSpan); } break; - case 564: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing, tkColon, + case 566: // format_expr -> simple_expr, tkColon, simple_expr_or_nothing, tkColon, // simple_expr { CurrentSemanticValue.ex = new format_expr(ValueStack[ValueStack.Depth-5].ex, ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 565: // format_expr -> tkColon, simple_expr_or_nothing, tkColon, simple_expr + case 567: // format_expr -> tkColon, simple_expr_or_nothing, tkColon, simple_expr { CurrentSemanticValue.ex = new format_expr(new int32_const(int.MaxValue), ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 566: // relop -> tkEqual + case 568: // relop -> tkEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 567: // relop -> tkNotEqual + case 569: // relop -> tkNotEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 568: // relop -> tkLower + case 570: // relop -> tkLower { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 569: // relop -> tkGreater + case 571: // relop -> tkGreater { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 570: // relop -> tkLowerEqual + case 572: // relop -> tkLowerEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 571: // relop -> tkGreaterEqual + case 573: // relop -> tkGreaterEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 572: // relop -> tkIn + case 574: // relop -> tkIn { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 573: // simple_expr -> term + case 575: // simple_expr -> term { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 574: // simple_expr -> simple_expr, addop, term + case 576: // simple_expr -> simple_expr, addop, term { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 575: // addop -> tkPlus + case 577: // addop -> tkPlus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 576: // addop -> tkMinus + case 578: // addop -> tkMinus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 577: // addop -> tkOr + case 579: // addop -> tkOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 578: // addop -> tkXor + case 580: // addop -> tkXor { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 579: // addop -> tkCSharpStyleOr + case 581: // addop -> tkCSharpStyleOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 580: // typecast_op -> tkAs + case 582: // typecast_op -> tkAs { CurrentSemanticValue.ob = op_typecast.as_op; } break; - case 581: // typecast_op -> tkIs + case 583: // typecast_op -> tkIs { CurrentSemanticValue.ob = op_typecast.is_op; } break; - case 582: // as_is_expr -> term, typecast_op, simple_or_template_type_reference + case 584: // as_is_expr -> term, typecast_op, simple_or_template_type_reference { CurrentSemanticValue.ex = NewAsIsExpr(ValueStack[ValueStack.Depth-3].ex, (op_typecast)ValueStack[ValueStack.Depth-2].ob, ValueStack[ValueStack.Depth-1].td, CurrentLocationSpan); } break; - case 583: // term -> factor + case 585: // term -> factor { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 584: // term -> new_expr + case 586: // term -> new_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 585: // term -> term, mulop, factor + case 587: // term -> term, mulop, factor { CurrentSemanticValue.ex = new bin_expr(ValueStack[ValueStack.Depth-3].ex,ValueStack[ValueStack.Depth-1].ex,(ValueStack[ValueStack.Depth-2].op).type, CurrentLocationSpan); } break; - case 586: // term -> as_is_expr + case 588: // term -> as_is_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 587: // mulop -> tkStar + case 589: // mulop -> tkStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 588: // mulop -> tkSlash + case 590: // mulop -> tkSlash { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 589: // mulop -> tkDiv + case 591: // mulop -> tkDiv { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 590: // mulop -> tkMod + case 592: // mulop -> tkMod { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 591: // mulop -> tkShl + case 593: // mulop -> tkShl { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 592: // mulop -> tkShr + case 594: // mulop -> tkShr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 593: // mulop -> tkAnd + case 595: // mulop -> tkAnd { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 594: // default_expr -> tkDefault, tkRoundOpen, simple_or_template_type_reference, + case 596: // default_expr -> tkDefault, tkRoundOpen, simple_or_template_type_reference, // tkRoundClose { CurrentSemanticValue.ex = new default_operator(ValueStack[ValueStack.Depth-2].td as named_type_reference, CurrentLocationSpan); } break; - case 595: // tuple -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, lambda_type_ref, + case 597: // tuple -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, lambda_type_ref, // optional_full_lambda_fp_list, tkRoundClose { - /* - ($4 as expression_list).expressions.Insert(0,$2); - - if (parsertools.build_tree_for_formatter) - $$ = new tuple_node_for_formatter($4 as expression_list,@$); - else - { - var dn = new dot_node(new dot_node(new ident("?System"),new ident("Tuple")),new ident("Create",@$)); - $$ = new method_call(dn,$4 as expression_list,@$); - }*/ - /*if ($5 != null) parsertools.AddErrorFromResource("BAD_TUPLE",@5); if ($6 != null) @@ -4924,99 +4952,99 @@ public partial class GPPGParser: ShiftReduceParser tkNil + case 598: // factor -> tkNil { CurrentSemanticValue.ex = new nil_const(); CurrentSemanticValue.ex.source_context = CurrentLocationSpan; } break; - case 597: // factor -> literal_or_number + case 599: // factor -> literal_or_number { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 598: // factor -> default_expr + case 600: // factor -> default_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 599: // factor -> tkSquareOpen, elem_list, tkSquareClose + case 601: // factor -> tkSquareOpen, elem_list, tkSquareClose { CurrentSemanticValue.ex = new pascal_set_constant(ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan); } break; - case 600: // factor -> tkNot, factor + case 602: // factor -> tkNot, factor { CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 601: // factor -> sign, factor + case 603: // factor -> sign, factor { CurrentSemanticValue.ex = new un_expr(ValueStack[ValueStack.Depth-1].ex, ValueStack[ValueStack.Depth-2].op.type, CurrentLocationSpan); } break; - case 602: // factor -> tkDeref, factor + case 604: // factor -> tkDeref, factor { CurrentSemanticValue.ex = new roof_dereference(ValueStack[ValueStack.Depth-1].ex as addressed_value, CurrentLocationSpan); } break; - case 603: // factor -> var_reference + case 605: // factor -> var_reference { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 604: // factor -> tuple + case 606: // factor -> tuple { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 605: // literal_or_number -> literal + case 607: // literal_or_number -> literal { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 606: // literal_or_number -> unsigned_number + case 608: // literal_or_number -> unsigned_number { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 607: // var_reference -> var_address, variable + case 609: // var_reference -> var_address, variable { CurrentSemanticValue.ex = NewVarReference(ValueStack[ValueStack.Depth-2].stn as get_address, ValueStack[ValueStack.Depth-1].ex as addressed_value, CurrentLocationSpan); } break; - case 608: // var_reference -> variable + case 610: // var_reference -> variable { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 609: // var_address -> tkAddressOf + case 611: // var_address -> tkAddressOf { CurrentSemanticValue.stn = NewVarAddress(CurrentLocationSpan); } break; - case 610: // var_address -> var_address, tkAddressOf + case 612: // var_address -> var_address, tkAddressOf { CurrentSemanticValue.stn = NewVarAddress(ValueStack[ValueStack.Depth-2].stn as get_address, CurrentLocationSpan); } break; - case 611: // attribute_variable -> simple_type_identifier, optional_expr_list_with_bracket + case 613: // attribute_variable -> simple_type_identifier, optional_expr_list_with_bracket { CurrentSemanticValue.stn = new attribute(null, ValueStack[ValueStack.Depth-2].td as named_type_reference, ValueStack[ValueStack.Depth-1].stn as expression_list, CurrentLocationSpan); } break; - case 612: // dotted_identifier -> identifier + case 614: // dotted_identifier -> identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; } break; - case 613: // dotted_identifier -> dotted_identifier, tkPoint, identifier_or_keyword + case 615: // dotted_identifier -> dotted_identifier, tkPoint, identifier_or_keyword { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 614: // variable_as_type -> dotted_identifier + case 616: // variable_as_type -> dotted_identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex;} break; - case 615: // variable_as_type -> dotted_identifier, template_type_params + case 617: // variable_as_type -> dotted_identifier, template_type_params { CurrentSemanticValue.ex = new ident_with_templateparams(ValueStack[ValueStack.Depth-2].ex as addressed_value, ValueStack[ValueStack.Depth-1].stn as template_param_list, CurrentLocationSpan); } break; - case 616: // variable -> identifier + case 618: // variable -> identifier { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].id; } break; - case 617: // variable -> operator_name_ident + case 619: // variable -> operator_name_ident { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 618: // variable -> tkInherited, identifier + case 620: // variable -> tkInherited, identifier { CurrentSemanticValue.ex = new inherited_ident(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan); } break; - case 619: // variable -> tkRoundOpen, expr, tkRoundClose + case 621: // variable -> tkRoundOpen, expr, tkRoundClose { if (!parsertools.build_tree_for_formatter) { @@ -5026,18 +5054,18 @@ public partial class GPPGParser: ShiftReduceParser sizeof_expr + case 622: // variable -> sizeof_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 621: // variable -> typeof_expr + case 623: // variable -> typeof_expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 622: // variable -> literal_or_number, tkPoint, identifier_or_keyword + case 624: // variable -> literal_or_number, tkPoint, identifier_or_keyword { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 623: // variable -> variable, tkSquareOpen, expr_list, tkSquareClose + case 625: // variable -> variable, tkSquareOpen, expr_list, tkSquareClose { var el = ValueStack[ValueStack.Depth-2].stn as expression_list; // SSM 10/03/16 if (el.expressions.Count==1 && el.expressions[0] is format_expr) @@ -5048,497 +5076,497 @@ public partial class GPPGParser: ShiftReduceParser variable, tkQuestionSquareOpen, format_expr, tkSquareClose + case 626: // variable -> variable, tkQuestionSquareOpen, format_expr, tkSquareClose { var fe = ValueStack[ValueStack.Depth-2].ex as format_expr; // SSM 9/01/17 CurrentSemanticValue.ex = new slice_expr_question(ValueStack[ValueStack.Depth-4].ex as addressed_value,fe.expr,fe.format1,fe.format2,CurrentLocationSpan); } break; - case 625: // variable -> variable, tkRoundOpen, optional_expr_list, tkRoundClose + case 627: // variable -> variable, tkRoundOpen, optional_expr_list, tkRoundClose { CurrentSemanticValue.ex = new method_call(ValueStack[ValueStack.Depth-4].ex as addressed_value,ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan); } break; - case 626: // variable -> variable, tkPoint, identifier_keyword_operatorname + case 628: // variable -> variable, tkPoint, identifier_keyword_operatorname { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 627: // variable -> variable, tkDeref + case 629: // variable -> variable, tkDeref { CurrentSemanticValue.ex = new roof_dereference(ValueStack[ValueStack.Depth-2].ex as addressed_value,CurrentLocationSpan); } break; - case 628: // variable -> variable, tkAmpersend, template_type_params + case 630: // variable -> variable, tkAmpersend, template_type_params { CurrentSemanticValue.ex = new ident_with_templateparams(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].stn as template_param_list, CurrentLocationSpan); } break; - case 629: // optional_expr_list -> expr_list + case 631: // optional_expr_list -> expr_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 630: // optional_expr_list -> /* empty */ + case 632: // optional_expr_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 631: // elem_list -> elem_list1 + case 633: // elem_list -> elem_list1 { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 632: // elem_list -> /* empty */ + case 634: // elem_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 633: // elem_list1 -> elem + case 635: // elem_list1 -> elem { CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 634: // elem_list1 -> elem_list1, tkComma, elem + case 636: // elem_list1 -> elem_list1, tkComma, elem { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 635: // elem -> expr + case 637: // elem -> expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 636: // elem -> expr, tkDotDot, expr + case 638: // elem -> expr, tkDotDot, expr { CurrentSemanticValue.ex = new diapason_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 637: // one_literal -> tkStringLiteral + case 639: // one_literal -> tkStringLiteral { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 638: // one_literal -> tkAsciiChar + case 640: // one_literal -> tkAsciiChar { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 639: // literal -> literal_list + case 641: // literal -> literal_list { CurrentSemanticValue.ex = NewLiteral(ValueStack[ValueStack.Depth-1].stn as literal_const_line); } break; - case 640: // literal_list -> one_literal + case 642: // literal_list -> one_literal { CurrentSemanticValue.stn = new literal_const_line(ValueStack[ValueStack.Depth-1].ex as literal, CurrentLocationSpan); } break; - case 641: // literal_list -> literal_list, one_literal + case 643: // literal_list -> literal_list, one_literal { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-2].stn as literal_const_line).Add(ValueStack[ValueStack.Depth-1].ex as literal, CurrentLocationSpan); } break; - case 642: // operator_name_ident -> tkOperator, overload_operator + case 644: // operator_name_ident -> tkOperator, overload_operator { CurrentSemanticValue.ex = new operator_name_ident((ValueStack[ValueStack.Depth-1].op as op_type_node).text, (ValueStack[ValueStack.Depth-1].op as op_type_node).type, CurrentLocationSpan); } break; - case 643: // optional_method_modificators -> tkSemiColon + case 645: // optional_method_modificators -> tkSemiColon { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 644: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon + case 646: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-2].stn; } break; - case 645: // optional_method_modificators1 -> /* empty */ + case 647: // optional_method_modificators1 -> /* empty */ { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 646: // optional_method_modificators1 -> tkSemiColon, meth_modificators + case 648: // optional_method_modificators1 -> tkSemiColon, meth_modificators { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 647: // meth_modificators -> meth_modificator + case 649: // meth_modificators -> meth_modificator { CurrentSemanticValue.stn = new procedure_attributes_list(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 648: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator + case 650: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as procedure_attributes_list).Add(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 649: // identifier -> tkIdentifier + case 651: // identifier -> tkIdentifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 650: // identifier -> property_specifier_directives + case 652: // identifier -> property_specifier_directives { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 651: // identifier -> non_reserved + case 653: // identifier -> non_reserved { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 652: // identifier_or_keyword -> identifier + case 654: // identifier_or_keyword -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 653: // identifier_or_keyword -> keyword + case 655: // identifier_or_keyword -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 654: // identifier_or_keyword -> reserved_keyword + case 656: // identifier_or_keyword -> reserved_keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 655: // identifier_keyword_operatorname -> identifier + case 657: // identifier_keyword_operatorname -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 656: // identifier_keyword_operatorname -> keyword + case 658: // identifier_keyword_operatorname -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 657: // identifier_keyword_operatorname -> operator_name_ident + case 659: // identifier_keyword_operatorname -> operator_name_ident { CurrentSemanticValue.id = (ident)ValueStack[ValueStack.Depth-1].ex; } break; - case 658: // meth_modificator -> tkAbstract + case 660: // meth_modificator -> tkAbstract { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 659: // meth_modificator -> tkOverload + case 661: // meth_modificator -> tkOverload { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; parsertools.AddWarningFromResource("OVERLOAD_IS_NOT_USED", ValueStack[ValueStack.Depth-1].id.source_context); } break; - case 660: // meth_modificator -> tkReintroduce + case 662: // meth_modificator -> tkReintroduce { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 661: // meth_modificator -> tkOverride + case 663: // meth_modificator -> tkOverride { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 662: // meth_modificator -> tkExtensionMethod + case 664: // meth_modificator -> tkExtensionMethod { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 663: // meth_modificator -> tkVirtual + case 665: // meth_modificator -> tkVirtual { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 664: // property_specifier_directives -> tkRead + case 666: // property_specifier_directives -> tkRead { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 665: // property_specifier_directives -> tkWrite + case 667: // property_specifier_directives -> tkWrite { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 666: // non_reserved -> tkName + case 668: // non_reserved -> tkName { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 667: // non_reserved -> tkNew + case 669: // non_reserved -> tkNew { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 668: // visibility_specifier -> tkInternal + case 670: // visibility_specifier -> tkInternal { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 669: // visibility_specifier -> tkPublic + case 671: // visibility_specifier -> tkPublic { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 670: // visibility_specifier -> tkProtected + case 672: // visibility_specifier -> tkProtected { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 671: // visibility_specifier -> tkPrivate + case 673: // visibility_specifier -> tkPrivate { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 672: // keyword -> visibility_specifier + case 674: // keyword -> visibility_specifier { CurrentSemanticValue.ti = new token_info(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan); } break; - case 673: // keyword -> tkSealed + case 675: // keyword -> tkSealed { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 674: // keyword -> tkTemplate + case 676: // keyword -> tkTemplate { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 675: // keyword -> tkOr + case 677: // keyword -> tkOr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 676: // keyword -> tkTypeOf + case 678: // keyword -> tkTypeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 677: // keyword -> tkSizeOf + case 679: // keyword -> tkSizeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 678: // keyword -> tkDefault + case 680: // keyword -> tkDefault { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 679: // keyword -> tkWhere + case 681: // keyword -> tkWhere { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 680: // keyword -> tkXor + case 682: // keyword -> tkXor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 681: // keyword -> tkAnd + case 683: // keyword -> tkAnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 682: // keyword -> tkDiv + case 684: // keyword -> tkDiv { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 683: // keyword -> tkMod + case 685: // keyword -> tkMod { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 684: // keyword -> tkShl + case 686: // keyword -> tkShl { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 685: // keyword -> tkShr + case 687: // keyword -> tkShr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 686: // keyword -> tkNot + case 688: // keyword -> tkNot { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 687: // keyword -> tkAs + case 689: // keyword -> tkAs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 688: // keyword -> tkIn + case 690: // keyword -> tkIn { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 689: // keyword -> tkIs + case 691: // keyword -> tkIs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 690: // keyword -> tkArray + case 692: // keyword -> tkArray { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 691: // keyword -> tkSequence + case 693: // keyword -> tkSequence { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 692: // keyword -> tkBegin + case 694: // keyword -> tkBegin { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 693: // keyword -> tkCase + case 695: // keyword -> tkCase { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 694: // keyword -> tkClass + case 696: // keyword -> tkClass { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 695: // keyword -> tkConst + case 697: // keyword -> tkConst { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 696: // keyword -> tkConstructor + case 698: // keyword -> tkConstructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 697: // keyword -> tkDestructor + case 699: // keyword -> tkDestructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 698: // keyword -> tkDownto + case 700: // keyword -> tkDownto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 699: // keyword -> tkDo + case 701: // keyword -> tkDo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 700: // keyword -> tkElse + case 702: // keyword -> tkElse { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 701: // keyword -> tkExcept + case 703: // keyword -> tkExcept { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 702: // keyword -> tkFile + case 704: // keyword -> tkFile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 703: // keyword -> tkAuto + case 705: // keyword -> tkAuto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 704: // keyword -> tkFinalization + case 706: // keyword -> tkFinalization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 705: // keyword -> tkFinally + case 707: // keyword -> tkFinally { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 706: // keyword -> tkFor + case 708: // keyword -> tkFor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 707: // keyword -> tkForeach + case 709: // keyword -> tkForeach { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 708: // keyword -> tkFunction + case 710: // keyword -> tkFunction { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 709: // keyword -> tkIf + case 711: // keyword -> tkIf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 710: // keyword -> tkImplementation + case 712: // keyword -> tkImplementation { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 711: // keyword -> tkInherited + case 713: // keyword -> tkInherited { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 712: // keyword -> tkInitialization + case 714: // keyword -> tkInitialization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 713: // keyword -> tkInterface + case 715: // keyword -> tkInterface { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 714: // keyword -> tkProcedure + case 716: // keyword -> tkProcedure { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 715: // keyword -> tkProperty + case 717: // keyword -> tkProperty { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 716: // keyword -> tkRaise + case 718: // keyword -> tkRaise { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 717: // keyword -> tkRecord + case 719: // keyword -> tkRecord { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 718: // keyword -> tkRepeat + case 720: // keyword -> tkRepeat { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 719: // keyword -> tkSet + case 721: // keyword -> tkSet { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 720: // keyword -> tkTry + case 722: // keyword -> tkTry { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 721: // keyword -> tkType + case 723: // keyword -> tkType { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 722: // keyword -> tkThen + case 724: // keyword -> tkThen { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 723: // keyword -> tkTo + case 725: // keyword -> tkTo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 724: // keyword -> tkUntil + case 726: // keyword -> tkUntil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 725: // keyword -> tkUses + case 727: // keyword -> tkUses { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 726: // keyword -> tkVar + case 728: // keyword -> tkVar { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 727: // keyword -> tkWhile + case 729: // keyword -> tkWhile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 728: // keyword -> tkWith + case 730: // keyword -> tkWith { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 729: // keyword -> tkNil + case 731: // keyword -> tkNil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 730: // keyword -> tkGoto + case 732: // keyword -> tkGoto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 731: // keyword -> tkOf + case 733: // keyword -> tkOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 732: // keyword -> tkLabel + case 734: // keyword -> tkLabel { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 733: // keyword -> tkProgram + case 735: // keyword -> tkProgram { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 734: // keyword -> tkUnit + case 736: // keyword -> tkUnit { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 735: // keyword -> tkLibrary + case 737: // keyword -> tkLibrary { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 736: // keyword -> tkExternal + case 738: // keyword -> tkExternal { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 737: // keyword -> tkParams + case 739: // keyword -> tkParams { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 738: // keyword -> tkEvent + case 740: // keyword -> tkEvent { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 739: // keyword -> tkYield + case 741: // keyword -> tkYield { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 740: // reserved_keyword -> tkOperator + case 742: // reserved_keyword -> tkOperator { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 741: // reserved_keyword -> tkEnd + case 743: // reserved_keyword -> tkEnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 742: // overload_operator -> tkMinus + case 744: // overload_operator -> tkMinus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 743: // overload_operator -> tkPlus + case 745: // overload_operator -> tkPlus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 744: // overload_operator -> tkSlash + case 746: // overload_operator -> tkSlash { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 745: // overload_operator -> tkStar + case 747: // overload_operator -> tkStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 746: // overload_operator -> tkEqual + case 748: // overload_operator -> tkEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 747: // overload_operator -> tkGreater + case 749: // overload_operator -> tkGreater { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 748: // overload_operator -> tkGreaterEqual + case 750: // overload_operator -> tkGreaterEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 749: // overload_operator -> tkLower + case 751: // overload_operator -> tkLower { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 750: // overload_operator -> tkLowerEqual + case 752: // overload_operator -> tkLowerEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 751: // overload_operator -> tkNotEqual + case 753: // overload_operator -> tkNotEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 752: // overload_operator -> tkOr + case 754: // overload_operator -> tkOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 753: // overload_operator -> tkXor + case 755: // overload_operator -> tkXor { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 754: // overload_operator -> tkAnd + case 756: // overload_operator -> tkAnd { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 755: // overload_operator -> tkDiv + case 757: // overload_operator -> tkDiv { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 756: // overload_operator -> tkMod + case 758: // overload_operator -> tkMod { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 757: // overload_operator -> tkShl + case 759: // overload_operator -> tkShl { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 758: // overload_operator -> tkShr + case 760: // overload_operator -> tkShr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 759: // overload_operator -> tkNot + case 761: // overload_operator -> tkNot { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 760: // overload_operator -> tkIn + case 762: // overload_operator -> tkIn { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 761: // overload_operator -> tkImplicit + case 763: // overload_operator -> tkImplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 762: // overload_operator -> tkExplicit + case 764: // overload_operator -> tkExplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 763: // overload_operator -> assign_operator + case 765: // overload_operator -> assign_operator { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 764: // assign_operator -> tkAssign + case 766: // assign_operator -> tkAssign { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 765: // assign_operator -> tkPlusEqual + case 767: // assign_operator -> tkPlusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 766: // assign_operator -> tkMinusEqual + case 768: // assign_operator -> tkMinusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 767: // assign_operator -> tkMultEqual + case 769: // assign_operator -> tkMultEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 768: // assign_operator -> tkDivEqual + case 770: // assign_operator -> tkDivEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 769: // func_decl_lambda -> identifier, tkArrow, lambda_function_body + case 771: // func_decl_lambda -> identifier, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-3].id, LocationStack[LocationStack.Depth-3]); var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), parametr_kind.none, null, LocationStack[LocationStack.Depth-3]), LocationStack[LocationStack.Depth-3]); CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 770: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, + case 772: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 771: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, + case 773: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-7].id, LocationStack[LocationStack.Depth-7]); @@ -5547,7 +5575,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, + case 774: // func_decl_lambda -> tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, // tkRoundClose, lambda_type_ref_noproctype, tkArrow, // lambda_function_body { @@ -5558,7 +5586,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, + case 775: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, // full_lambda_fp_list, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { @@ -5570,7 +5598,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, expr_l1, tkComma, expr_l1_list, + case 776: // func_decl_lambda -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, // lambda_type_ref, optional_full_lambda_fp_list, // tkRoundClose, rem_lambda { @@ -5632,61 +5660,61 @@ public partial class GPPGParser: ShiftReduceParser expl_func_decl_lambda + case 777: // func_decl_lambda -> expl_func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 776: // optional_full_lambda_fp_list -> /* empty */ + case 778: // optional_full_lambda_fp_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 777: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list + case 779: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 778: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body + case 780: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body { CurrentSemanticValue.ob = new pair_type_stlist(ValueStack[ValueStack.Depth-3].td,ValueStack[ValueStack.Depth-1].stn as statement_list); } break; - case 779: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, + case 781: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 780: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, + case 782: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 781: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, + case 783: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-5].stn as formal_parameters, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 782: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body + case 784: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 783: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, + case 785: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, // lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 784: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, + case 786: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-4].stn as formal_parameters, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 785: // full_lambda_fp_list -> lambda_simple_fp_sect + case 787: // full_lambda_fp_list -> lambda_simple_fp_sect { var typed_pars = ValueStack[ValueStack.Depth-1].stn as typed_parameters; if (typed_pars.vars_type is lambda_inferred_type) @@ -5706,147 +5734,147 @@ public partial class GPPGParser: ShiftReduceParser full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect + case 788: // full_lambda_fp_list -> full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect { CurrentSemanticValue.stn =(ValueStack[ValueStack.Depth-3].stn as formal_parameters).Add(ValueStack[ValueStack.Depth-1].stn as typed_parameters, CurrentLocationSpan); } break; - case 787: // lambda_simple_fp_sect -> ident_list, lambda_type_ref + case 789: // lambda_simple_fp_sect -> ident_list, lambda_type_ref { CurrentSemanticValue.stn = new typed_parameters(ValueStack[ValueStack.Depth-2].stn as ident_list, ValueStack[ValueStack.Depth-1].td, parametr_kind.none, null, CurrentLocationSpan); } break; - case 788: // lambda_type_ref -> /* empty */ + case 790: // lambda_type_ref -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 789: // lambda_type_ref -> tkColon, fptype + case 791: // lambda_type_ref -> tkColon, fptype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 790: // lambda_type_ref_noproctype -> /* empty */ + case 792: // lambda_type_ref_noproctype -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 791: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype + case 793: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 792: // lambda_function_body -> expr_l1 + case 794: // lambda_function_body -> expr_l1 { CurrentSemanticValue.stn = NewLambdaBody(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 793: // lambda_function_body -> compound_stmt + case 795: // lambda_function_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 794: // lambda_function_body -> if_stmt + case 796: // lambda_function_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 795: // lambda_function_body -> while_stmt + case 797: // lambda_function_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 796: // lambda_function_body -> repeat_stmt + case 798: // lambda_function_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 797: // lambda_function_body -> for_stmt + case 799: // lambda_function_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 798: // lambda_function_body -> foreach_stmt + case 800: // lambda_function_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 799: // lambda_function_body -> case_stmt + case 801: // lambda_function_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 800: // lambda_function_body -> try_stmt + case 802: // lambda_function_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 801: // lambda_function_body -> lock_stmt + case 803: // lambda_function_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 802: // lambda_function_body -> yield_stmt + case 804: // lambda_function_body -> yield_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 803: // lambda_procedure_body -> proc_call + case 805: // lambda_procedure_body -> proc_call { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 804: // lambda_procedure_body -> compound_stmt + case 806: // lambda_procedure_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 805: // lambda_procedure_body -> if_stmt + case 807: // lambda_procedure_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 806: // lambda_procedure_body -> while_stmt + case 808: // lambda_procedure_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 807: // lambda_procedure_body -> repeat_stmt + case 809: // lambda_procedure_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 808: // lambda_procedure_body -> for_stmt + case 810: // lambda_procedure_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 809: // lambda_procedure_body -> foreach_stmt + case 811: // lambda_procedure_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 810: // lambda_procedure_body -> case_stmt + case 812: // lambda_procedure_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 811: // lambda_procedure_body -> try_stmt + case 813: // lambda_procedure_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 812: // lambda_procedure_body -> lock_stmt + case 814: // lambda_procedure_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 813: // lambda_procedure_body -> yield_stmt + case 815: // lambda_procedure_body -> yield_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 814: // lambda_procedure_body -> assignment + case 816: // lambda_procedure_body -> assignment { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } diff --git a/Parsers/PascalABCParserNewSaushkin/ShiftReduceParserCode.cs b/Parsers/PascalABCParserNewSaushkin/ShiftReduceParserCode.cs index 76692f42d..0aefc2d66 100644 --- a/Parsers/PascalABCParserNewSaushkin/ShiftReduceParserCode.cs +++ b/Parsers/PascalABCParserNewSaushkin/ShiftReduceParserCode.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Runtime.Serialization; using System.Diagnostics.CodeAnalysis; using PascalABCCompiler.SyntaxTree; +using System.IO; namespace QUT.Gppg { @@ -140,7 +141,7 @@ namespace QUT.Gppg /// Non-terminal symbol names protected void InitNonTerminals(string[] names) { nonTerminals = names; } - #region YYAbort, YYAccept etcetera. +#region YYAbort, YYAccept etcetera. [Serializable] [SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic")] // Reason for FxCop message suppression - @@ -194,7 +195,7 @@ namespace QUT.Gppg /// Check if parser in error recovery state. /// protected bool YYRecovering { get { return recovering; } } - #endregion +#endregion /// /// Abstract base method. ShiftReduceParser calls this @@ -488,7 +489,7 @@ namespace QUT.Gppg { #if TRACE_ACTIONS Console.Error.Write("Reading a token: "); -#endif +#endif NextToken = scanner.yylex(); } diff --git a/SyntaxTree/tree/AbstractVisitor.cs b/SyntaxTree/tree/AbstractVisitor.cs index 7ace9f2b0..a1a1fca68 100644 --- a/SyntaxTree/tree/AbstractVisitor.cs +++ b/SyntaxTree/tree/AbstractVisitor.cs @@ -1112,6 +1112,21 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_sugared_addressed_value); } + + public virtual void visit(pattern_node _pattern_node) + { + DefaultVisit(_pattern_node); + } + + public virtual void visit(type_pattern _type_pattern) + { + DefaultVisit(_type_pattern); + } + + public virtual void visit(is_pattern_expr _is_pattern_expr) + { + DefaultVisit(_is_pattern_expr); + } } diff --git a/SyntaxTree/tree/HierarchyVisitor.cs b/SyntaxTree/tree/HierarchyVisitor.cs index b9d6a5c69..51a2e5640 100644 --- a/SyntaxTree/tree/HierarchyVisitor.cs +++ b/SyntaxTree/tree/HierarchyVisitor.cs @@ -1773,6 +1773,30 @@ namespace PascalABCCompiler.SyntaxTree { } + public virtual void pre_do_visit(pattern_node _pattern_node) + { + } + + public virtual void post_do_visit(pattern_node _pattern_node) + { + } + + public virtual void pre_do_visit(type_pattern _type_pattern) + { + } + + public virtual void post_do_visit(type_pattern _type_pattern) + { + } + + public virtual void pre_do_visit(is_pattern_expr _is_pattern_expr) + { + } + + public virtual void post_do_visit(is_pattern_expr _is_pattern_expr) + { + } + public override void visit(syntax_tree_node _syntax_tree_node) { DefaultVisit(_syntax_tree_node); @@ -3661,6 +3685,31 @@ namespace PascalABCCompiler.SyntaxTree visit(sugared_addressed_value.new_addr_value); post_do_visit(_sugared_addressed_value); } + + public override void visit(pattern_node _pattern_node) + { + DefaultVisit(_pattern_node); + pre_do_visit(_pattern_node); + post_do_visit(_pattern_node); + } + + public override void visit(type_pattern _type_pattern) + { + DefaultVisit(_type_pattern); + pre_do_visit(_type_pattern); + visit(type_pattern.identifier); + visit(type_pattern.type); + post_do_visit(_type_pattern); + } + + public override void visit(is_pattern_expr _is_pattern_expr) + { + DefaultVisit(_is_pattern_expr); + pre_do_visit(_is_pattern_expr); + visit(is_pattern_expr.left); + visit(is_pattern_expr.right); + post_do_visit(_is_pattern_expr); + } } diff --git a/SyntaxTree/tree/SyntaxTemplates/SyntaxWithListMethods.txt b/SyntaxTree/tree/SyntaxTemplates/SyntaxWithListMethods.txt index 54848f6a2..d89c7d1de 100644 --- a/SyntaxTree/tree/SyntaxTemplates/SyntaxWithListMethods.txt +++ b/SyntaxTree/tree/SyntaxTemplates/SyntaxWithListMethods.txt @@ -31,22 +31,22 @@ private int FindIndexInList(<#ListElementType#> el) public void InsertAfter(<#ListElementType#> el, <#ListElementType#> newel) { - <#ListName#>.Insert(FindIndex(el) + 1, newel); + <#ListName#>.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(<#ListElementType#> el, IEnumerable<<#ListElementType#>> newels) { - <#ListName#>.InsertRange(FindIndex(el) + 1, newels); + <#ListName#>.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(<#ListElementType#> el, <#ListElementType#> newel) { - <#ListName#>.Insert(FindIndex(el), newel); + <#ListName#>.Insert(FindIndexInList(el), newel); } public void InsertBefore(<#ListElementType#> el, IEnumerable<<#ListElementType#>> newels) { - <#ListName#>.InsertRange(FindIndex(el), newels); + <#ListName#>.InsertRange(FindIndexInList(el), newels); } public bool Remove(<#ListElementType#> el) diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index d8ecdcdd1..59384b794 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -462,6 +462,12 @@ namespace PascalABCCompiler.SyntaxTree return new sugared_expression(); case 220: return new sugared_addressed_value(); + case 221: + return new pattern_node(); + case 222: + return new type_pattern(); + case 223: + return new is_pattern_expr(); } return null; } @@ -3888,6 +3894,43 @@ namespace PascalABCCompiler.SyntaxTree _sugared_addressed_value.new_addr_value = _read_node() as addressed_value; } + + public void visit(pattern_node _pattern_node) + { + read_pattern_node(_pattern_node); + } + + public void read_pattern_node(pattern_node _pattern_node) + { + read_syntax_tree_node(_pattern_node); + } + + + public void visit(type_pattern _type_pattern) + { + read_type_pattern(_type_pattern); + } + + public void read_type_pattern(type_pattern _type_pattern) + { + read_pattern_node(_type_pattern); + _type_pattern.identifier = _read_node() as ident; + _type_pattern.type = _read_node() as type_definition; + } + + + public void visit(is_pattern_expr _is_pattern_expr) + { + read_is_pattern_expr(_is_pattern_expr); + } + + public void read_is_pattern_expr(is_pattern_expr _is_pattern_expr) + { + read_expression(_is_pattern_expr); + _is_pattern_expr.left = _read_node() as expression; + _is_pattern_expr.right = _read_node() as pattern_node; + } + } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index 3a410fb4e..00e437dbe 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -6060,6 +6060,78 @@ namespace PascalABCCompiler.SyntaxTree } } + + public void visit(pattern_node _pattern_node) + { + bw.Write((Int16)221); + write_pattern_node(_pattern_node); + } + + public void write_pattern_node(pattern_node _pattern_node) + { + write_syntax_tree_node(_pattern_node); + } + + + public void visit(type_pattern _type_pattern) + { + bw.Write((Int16)222); + write_type_pattern(_type_pattern); + } + + public void write_type_pattern(type_pattern _type_pattern) + { + write_pattern_node(_type_pattern); + if (_type_pattern.identifier == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _type_pattern.identifier.visit(this); + } + if (_type_pattern.type == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _type_pattern.type.visit(this); + } + } + + + public void visit(is_pattern_expr _is_pattern_expr) + { + bw.Write((Int16)223); + write_is_pattern_expr(_is_pattern_expr); + } + + public void write_is_pattern_expr(is_pattern_expr _is_pattern_expr) + { + write_expression(_is_pattern_expr); + if (_is_pattern_expr.left == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _is_pattern_expr.left.visit(this); + } + if (_is_pattern_expr.right == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _is_pattern_expr.right.visit(this); + } + } + } diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index 4c4b8a588..13fd469c9 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -433,22 +433,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(statement el, statement newel) { - subnodes.Insert(FindIndex(el) + 1, newel); + subnodes.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(statement el, IEnumerable newels) { - subnodes.InsertRange(FindIndex(el) + 1, newels); + subnodes.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(statement el, statement newel) { - subnodes.Insert(FindIndex(el), newel); + subnodes.Insert(FindIndexInList(el), newel); } public void InsertBefore(statement el, IEnumerable newels) { - subnodes.InsertRange(FindIndex(el), newels); + subnodes.InsertRange(FindIndexInList(el), newels); } public bool Remove(statement el) @@ -1858,6 +1858,8 @@ namespace PascalABCCompiler.SyntaxTree /// ///Значение, имеющее адрес + + /// [Serializable] public partial class addressed_value : expression @@ -2303,22 +2305,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(ident el, ident newel) { - names.Insert(FindIndex(el) + 1, newel); + names.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(ident el, IEnumerable newels) { - names.InsertRange(FindIndex(el) + 1, newels); + names.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(ident el, ident newel) { - names.Insert(FindIndex(el), newel); + names.Insert(FindIndexInList(el), newel); } public void InsertBefore(ident el, IEnumerable newels) { - names.InsertRange(FindIndex(el), newels); + names.InsertRange(FindIndexInList(el), newels); } public bool Remove(ident el) @@ -2552,22 +2554,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(var_def_statement el, var_def_statement newel) { - var_definitions.Insert(FindIndex(el) + 1, newel); + var_definitions.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(var_def_statement el, IEnumerable newels) { - var_definitions.InsertRange(FindIndex(el) + 1, newels); + var_definitions.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(var_def_statement el, var_def_statement newel) { - var_definitions.Insert(FindIndex(el), newel); + var_definitions.Insert(FindIndexInList(el), newel); } public void InsertBefore(var_def_statement el, IEnumerable newels) { - var_definitions.InsertRange(FindIndex(el), newels); + var_definitions.InsertRange(FindIndexInList(el), newels); } public bool Remove(var_def_statement el) @@ -2785,22 +2787,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(ident el, ident newel) { - idents.Insert(FindIndex(el) + 1, newel); + idents.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(ident el, IEnumerable newels) { - idents.InsertRange(FindIndex(el) + 1, newels); + idents.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(ident el, ident newel) { - idents.Insert(FindIndex(el), newel); + idents.Insert(FindIndexInList(el), newel); } public void InsertBefore(ident el, IEnumerable newels) { - idents.InsertRange(FindIndex(el), newels); + idents.InsertRange(FindIndexInList(el), newels); } public bool Remove(ident el) @@ -3375,22 +3377,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(declaration el, declaration newel) { - defs.Insert(FindIndex(el) + 1, newel); + defs.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(declaration el, IEnumerable newels) { - defs.InsertRange(FindIndex(el) + 1, newels); + defs.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(declaration el, declaration newel) { - defs.Insert(FindIndex(el), newel); + defs.Insert(FindIndexInList(el), newel); } public void InsertBefore(declaration el, IEnumerable newels) { - defs.InsertRange(FindIndex(el), newels); + defs.InsertRange(FindIndexInList(el), newels); } public bool Remove(declaration el) @@ -3603,22 +3605,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(compilation_unit el, compilation_unit newel) { - compilation_units.Insert(FindIndex(el) + 1, newel); + compilation_units.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(compilation_unit el, IEnumerable newels) { - compilation_units.InsertRange(FindIndex(el) + 1, newels); + compilation_units.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(compilation_unit el, compilation_unit newel) { - compilation_units.Insert(FindIndex(el), newel); + compilation_units.Insert(FindIndexInList(el), newel); } public void InsertBefore(compilation_unit el, IEnumerable newels) { - compilation_units.InsertRange(FindIndex(el), newels); + compilation_units.InsertRange(FindIndexInList(el), newels); } public bool Remove(compilation_unit el) @@ -4083,22 +4085,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(expression el, expression newel) { - expressions.Insert(FindIndex(el) + 1, newel); + expressions.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(expression el, IEnumerable newels) { - expressions.InsertRange(FindIndex(el) + 1, newels); + expressions.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(expression el, expression newel) { - expressions.Insert(FindIndex(el), newel); + expressions.Insert(FindIndexInList(el), newel); } public void InsertBefore(expression el, IEnumerable newels) { - expressions.InsertRange(FindIndex(el), newels); + expressions.InsertRange(FindIndexInList(el), newels); } public bool Remove(expression el) @@ -5844,22 +5846,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(type_definition el, type_definition newel) { - indexers.Insert(FindIndex(el) + 1, newel); + indexers.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(type_definition el, IEnumerable newels) { - indexers.InsertRange(FindIndex(el) + 1, newels); + indexers.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(type_definition el, type_definition newel) { - indexers.Insert(FindIndex(el), newel); + indexers.Insert(FindIndexInList(el), newel); } public void InsertBefore(type_definition el, IEnumerable newels) { - indexers.InsertRange(FindIndex(el), newels); + indexers.InsertRange(FindIndexInList(el), newels); } public bool Remove(type_definition el) @@ -6776,22 +6778,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(typed_parameters el, typed_parameters newel) { - params_list.Insert(FindIndex(el) + 1, newel); + params_list.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(typed_parameters el, IEnumerable newels) { - params_list.InsertRange(FindIndex(el) + 1, newels); + params_list.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(typed_parameters el, typed_parameters newel) { - params_list.Insert(FindIndex(el), newel); + params_list.Insert(FindIndexInList(el), newel); } public void InsertBefore(typed_parameters el, IEnumerable newels) { - params_list.InsertRange(FindIndex(el), newels); + params_list.InsertRange(FindIndexInList(el), newels); } public bool Remove(typed_parameters el) @@ -7004,22 +7006,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(procedure_attribute el, procedure_attribute newel) { - proc_attributes.Insert(FindIndex(el) + 1, newel); + proc_attributes.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(procedure_attribute el, IEnumerable newels) { - proc_attributes.InsertRange(FindIndex(el) + 1, newels); + proc_attributes.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(procedure_attribute el, procedure_attribute newel) { - proc_attributes.Insert(FindIndex(el), newel); + proc_attributes.Insert(FindIndexInList(el), newel); } public void InsertBefore(procedure_attribute el, IEnumerable newels) { - proc_attributes.InsertRange(FindIndex(el), newels); + proc_attributes.InsertRange(FindIndexInList(el), newels); } public bool Remove(procedure_attribute el) @@ -8137,22 +8139,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(type_declaration el, type_declaration newel) { - types_decl.Insert(FindIndex(el) + 1, newel); + types_decl.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(type_declaration el, IEnumerable newels) { - types_decl.InsertRange(FindIndex(el) + 1, newels); + types_decl.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(type_declaration el, type_declaration newel) { - types_decl.Insert(FindIndex(el), newel); + types_decl.Insert(FindIndexInList(el), newel); } public void InsertBefore(type_declaration el, IEnumerable newels) { - types_decl.InsertRange(FindIndex(el), newels); + types_decl.InsertRange(FindIndexInList(el), newels); } public bool Remove(type_declaration el) @@ -8842,22 +8844,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(const_definition el, const_definition newel) { - const_defs.Insert(FindIndex(el) + 1, newel); + const_defs.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(const_definition el, IEnumerable newels) { - const_defs.InsertRange(FindIndex(el) + 1, newels); + const_defs.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(const_definition el, const_definition newel) { - const_defs.Insert(FindIndex(el), newel); + const_defs.Insert(FindIndexInList(el), newel); } public void InsertBefore(const_definition el, IEnumerable newels) { - const_defs.InsertRange(FindIndex(el), newels); + const_defs.InsertRange(FindIndexInList(el), newels); } public bool Remove(const_definition el) @@ -9516,22 +9518,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(unit_or_namespace el, unit_or_namespace newel) { - units.Insert(FindIndex(el) + 1, newel); + units.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(unit_or_namespace el, IEnumerable newels) { - units.InsertRange(FindIndex(el) + 1, newels); + units.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(unit_or_namespace el, unit_or_namespace newel) { - units.Insert(FindIndex(el), newel); + units.Insert(FindIndexInList(el), newel); } public void InsertBefore(unit_or_namespace el, IEnumerable newels) { - units.InsertRange(FindIndex(el), newels); + units.InsertRange(FindIndexInList(el), newels); } public bool Remove(unit_or_namespace el) @@ -9995,22 +9997,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(compiler_directive el, compiler_directive newel) { - compiler_directives.Insert(FindIndex(el) + 1, newel); + compiler_directives.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(compiler_directive el, IEnumerable newels) { - compiler_directives.InsertRange(FindIndex(el) + 1, newels); + compiler_directives.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(compiler_directive el, compiler_directive newel) { - compiler_directives.Insert(FindIndex(el), newel); + compiler_directives.Insert(FindIndexInList(el), newel); } public void InsertBefore(compiler_directive el, IEnumerable newels) { - compiler_directives.InsertRange(FindIndex(el), newels); + compiler_directives.InsertRange(FindIndexInList(el), newels); } public bool Remove(compiler_directive el) @@ -11487,22 +11489,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(ident el, ident newel) { - ln.Insert(FindIndex(el) + 1, newel); + ln.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(ident el, IEnumerable newels) { - ln.InsertRange(FindIndex(el) + 1, newels); + ln.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(ident el, ident newel) { - ln.Insert(FindIndex(el), newel); + ln.Insert(FindIndexInList(el), newel); } public void InsertBefore(ident el, IEnumerable newels) { - ln.InsertRange(FindIndex(el), newels); + ln.InsertRange(FindIndexInList(el), newels); } public bool Remove(ident el) @@ -13894,22 +13896,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(declaration el, declaration newel) { - members.Insert(FindIndex(el) + 1, newel); + members.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(declaration el, IEnumerable newels) { - members.InsertRange(FindIndex(el) + 1, newels); + members.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(declaration el, declaration newel) { - members.Insert(FindIndex(el), newel); + members.Insert(FindIndexInList(el), newel); } public void InsertBefore(declaration el, IEnumerable newels) { - members.InsertRange(FindIndex(el), newels); + members.InsertRange(FindIndexInList(el), newels); } public bool Remove(declaration el) @@ -14254,22 +14256,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(class_members el, class_members newel) { - class_def_blocks.Insert(FindIndex(el) + 1, newel); + class_def_blocks.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(class_members el, IEnumerable newels) { - class_def_blocks.InsertRange(FindIndex(el) + 1, newels); + class_def_blocks.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(class_members el, class_members newel) { - class_def_blocks.Insert(FindIndex(el), newel); + class_def_blocks.Insert(FindIndexInList(el), newel); } public void InsertBefore(class_members el, IEnumerable newels) { - class_def_blocks.InsertRange(FindIndex(el), newels); + class_def_blocks.InsertRange(FindIndexInList(el), newels); } public bool Remove(class_members el) @@ -15396,22 +15398,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(record_const_definition el, record_const_definition newel) { - rec_consts.Insert(FindIndex(el) + 1, newel); + rec_consts.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(record_const_definition el, IEnumerable newels) { - rec_consts.InsertRange(FindIndex(el) + 1, newels); + rec_consts.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(record_const_definition el, record_const_definition newel) { - rec_consts.Insert(FindIndex(el), newel); + rec_consts.Insert(FindIndexInList(el), newel); } public void InsertBefore(record_const_definition el, IEnumerable newels) { - rec_consts.InsertRange(FindIndex(el), newels); + rec_consts.InsertRange(FindIndexInList(el), newels); } public bool Remove(record_const_definition el) @@ -16367,22 +16369,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(literal el, literal newel) { - literals.Insert(FindIndex(el) + 1, newel); + literals.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(literal el, IEnumerable newels) { - literals.InsertRange(FindIndex(el) + 1, newels); + literals.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(literal el, literal newel) { - literals.Insert(FindIndex(el), newel); + literals.Insert(FindIndexInList(el), newel); } public void InsertBefore(literal el, IEnumerable newels) { - literals.InsertRange(FindIndex(el), newels); + literals.InsertRange(FindIndexInList(el), newels); } public bool Remove(literal el) @@ -16954,22 +16956,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(variant el, variant newel) { - vars.Insert(FindIndex(el) + 1, newel); + vars.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(variant el, IEnumerable newels) { - vars.InsertRange(FindIndex(el) + 1, newels); + vars.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(variant el, variant newel) { - vars.Insert(FindIndex(el), newel); + vars.Insert(FindIndexInList(el), newel); } public void InsertBefore(variant el, IEnumerable newels) { - vars.InsertRange(FindIndex(el), newels); + vars.InsertRange(FindIndexInList(el), newels); } public bool Remove(variant el) @@ -17341,22 +17343,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(variant_type el, variant_type newel) { - vars.Insert(FindIndex(el) + 1, newel); + vars.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(variant_type el, IEnumerable newels) { - vars.InsertRange(FindIndex(el) + 1, newels); + vars.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(variant_type el, variant_type newel) { - vars.Insert(FindIndex(el), newel); + vars.Insert(FindIndexInList(el), newel); } public void InsertBefore(variant_type el, IEnumerable newels) { - vars.InsertRange(FindIndex(el), newels); + vars.InsertRange(FindIndexInList(el), newels); } public bool Remove(variant_type el) @@ -20185,22 +20187,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(case_variant el, case_variant newel) { - variants.Insert(FindIndex(el) + 1, newel); + variants.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(case_variant el, IEnumerable newels) { - variants.InsertRange(FindIndex(el) + 1, newels); + variants.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(case_variant el, case_variant newel) { - variants.Insert(FindIndex(el), newel); + variants.Insert(FindIndexInList(el), newel); } public void InsertBefore(case_variant el, IEnumerable newels) { - variants.InsertRange(FindIndex(el), newels); + variants.InsertRange(FindIndexInList(el), newels); } public bool Remove(case_variant el) @@ -20577,22 +20579,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(var_def_statement el, var_def_statement newel) { - vars.Insert(FindIndex(el) + 1, newel); + vars.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(var_def_statement el, IEnumerable newels) { - vars.InsertRange(FindIndex(el) + 1, newels); + vars.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(var_def_statement el, var_def_statement newel) { - vars.Insert(FindIndex(el), newel); + vars.Insert(FindIndexInList(el), newel); } public void InsertBefore(var_def_statement el, IEnumerable newels) { - vars.InsertRange(FindIndex(el), newels); + vars.InsertRange(FindIndexInList(el), newels); } public bool Remove(var_def_statement el) @@ -21391,22 +21393,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(property_parameter el, property_parameter newel) { - parameters.Insert(FindIndex(el) + 1, newel); + parameters.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(property_parameter el, IEnumerable newels) { - parameters.InsertRange(FindIndex(el) + 1, newels); + parameters.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(property_parameter el, property_parameter newel) { - parameters.Insert(FindIndex(el), newel); + parameters.Insert(FindIndexInList(el), newel); } public void InsertBefore(property_parameter el, IEnumerable newels) { - parameters.InsertRange(FindIndex(el), newels); + parameters.InsertRange(FindIndexInList(el), newels); } public bool Remove(property_parameter el) @@ -23142,22 +23144,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(exception_handler el, exception_handler newel) { - handlers.Insert(FindIndex(el) + 1, newel); + handlers.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(exception_handler el, IEnumerable newels) { - handlers.InsertRange(FindIndex(el) + 1, newels); + handlers.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(exception_handler el, exception_handler newel) { - handlers.Insert(FindIndex(el), newel); + handlers.Insert(FindIndexInList(el), newel); } public void InsertBefore(exception_handler el, IEnumerable newels) { - handlers.InsertRange(FindIndex(el), newels); + handlers.InsertRange(FindIndexInList(el), newels); } public bool Remove(exception_handler el) @@ -24309,22 +24311,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(unit_or_namespace el, unit_or_namespace newel) { - namespaces.Insert(FindIndex(el) + 1, newel); + namespaces.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(unit_or_namespace el, IEnumerable newels) { - namespaces.InsertRange(FindIndex(el) + 1, newels); + namespaces.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(unit_or_namespace el, unit_or_namespace newel) { - namespaces.Insert(FindIndex(el), newel); + namespaces.Insert(FindIndexInList(el), newel); } public void InsertBefore(unit_or_namespace el, IEnumerable newels) { - namespaces.InsertRange(FindIndex(el), newels); + namespaces.InsertRange(FindIndexInList(el), newels); } public bool Remove(unit_or_namespace el) @@ -25134,22 +25136,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(named_type_reference el, named_type_reference newel) { - types.Insert(FindIndex(el) + 1, newel); + types.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(named_type_reference el, IEnumerable newels) { - types.InsertRange(FindIndex(el) + 1, newels); + types.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(named_type_reference el, named_type_reference newel) { - types.Insert(FindIndex(el), newel); + types.Insert(FindIndexInList(el), newel); } public void InsertBefore(named_type_reference el, IEnumerable newels) { - types.InsertRange(FindIndex(el), newels); + types.InsertRange(FindIndexInList(el), newels); } public bool Remove(named_type_reference el) @@ -25381,22 +25383,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(type_definition el, type_definition newel) { - params_list.Insert(FindIndex(el) + 1, newel); + params_list.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(type_definition el, IEnumerable newels) { - params_list.InsertRange(FindIndex(el) + 1, newels); + params_list.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(type_definition el, type_definition newel) { - params_list.Insert(FindIndex(el), newel); + params_list.Insert(FindIndexInList(el), newel); } public void InsertBefore(type_definition el, IEnumerable newels) { - params_list.InsertRange(FindIndex(el), newels); + params_list.InsertRange(FindIndexInList(el), newels); } public bool Remove(type_definition el) @@ -26310,22 +26312,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(type_definition el, type_definition newel) { - defs.Insert(FindIndex(el) + 1, newel); + defs.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(type_definition el, IEnumerable newels) { - defs.InsertRange(FindIndex(el) + 1, newels); + defs.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(type_definition el, type_definition newel) { - defs.Insert(FindIndex(el), newel); + defs.Insert(FindIndexInList(el), newel); } public void InsertBefore(type_definition el, IEnumerable newels) { - defs.InsertRange(FindIndex(el), newels); + defs.InsertRange(FindIndexInList(el), newels); } public bool Remove(type_definition el) @@ -26697,22 +26699,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(where_definition el, where_definition newel) { - defs.Insert(FindIndex(el) + 1, newel); + defs.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(where_definition el, IEnumerable newels) { - defs.InsertRange(FindIndex(el) + 1, newels); + defs.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(where_definition el, where_definition newel) { - defs.Insert(FindIndex(el), newel); + defs.Insert(FindIndexInList(el), newel); } public void InsertBefore(where_definition el, IEnumerable newels) { - defs.InsertRange(FindIndex(el), newels); + defs.InsertRange(FindIndexInList(el), newels); } public bool Remove(where_definition el) @@ -28842,22 +28844,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(enumerator el, enumerator newel) { - enumerators.Insert(FindIndex(el) + 1, newel); + enumerators.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(enumerator el, IEnumerable newels) { - enumerators.InsertRange(FindIndex(el) + 1, newels); + enumerators.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(enumerator el, enumerator newel) { - enumerators.Insert(FindIndex(el), newel); + enumerators.Insert(FindIndexInList(el), newel); } public void InsertBefore(enumerator el, IEnumerable newels) { - enumerators.InsertRange(FindIndex(el), newels); + enumerators.InsertRange(FindIndexInList(el), newels); } public bool Remove(enumerator el) @@ -29473,22 +29475,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(type_definition_attr el, type_definition_attr newel) { - attributes.Insert(FindIndex(el) + 1, newel); + attributes.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(type_definition_attr el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el) + 1, newels); + attributes.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(type_definition_attr el, type_definition_attr newel) { - attributes.Insert(FindIndex(el), newel); + attributes.Insert(FindIndexInList(el), newel); } public void InsertBefore(type_definition_attr el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el), newels); + attributes.InsertRange(FindIndexInList(el), newels); } public bool Remove(type_definition_attr el) @@ -30042,22 +30044,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(compiler_directive el, compiler_directive newel) { - directives.Insert(FindIndex(el) + 1, newel); + directives.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(compiler_directive el, IEnumerable newels) { - directives.InsertRange(FindIndex(el) + 1, newels); + directives.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(compiler_directive el, compiler_directive newel) { - directives.Insert(FindIndex(el), newel); + directives.Insert(FindIndexInList(el), newel); } public void InsertBefore(compiler_directive el, IEnumerable newels) { - directives.InsertRange(FindIndex(el), newels); + directives.InsertRange(FindIndexInList(el), newels); } public bool Remove(compiler_directive el) @@ -30498,22 +30500,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(documentation_comment_section el, documentation_comment_section newel) { - sections.Insert(FindIndex(el) + 1, newel); + sections.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(documentation_comment_section el, IEnumerable newels) { - sections.InsertRange(FindIndex(el) + 1, newels); + sections.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(documentation_comment_section el, documentation_comment_section newel) { - sections.Insert(FindIndex(el), newel); + sections.Insert(FindIndexInList(el), newel); } public void InsertBefore(documentation_comment_section el, IEnumerable newels) { - sections.InsertRange(FindIndex(el), newels); + sections.InsertRange(FindIndexInList(el), newels); } public bool Remove(documentation_comment_section el) @@ -30762,22 +30764,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(documentation_comment_tag_param el, documentation_comment_tag_param newel) { - parameters.Insert(FindIndex(el) + 1, newel); + parameters.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(documentation_comment_tag_param el, IEnumerable newels) { - parameters.InsertRange(FindIndex(el) + 1, newels); + parameters.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(documentation_comment_tag_param el, documentation_comment_tag_param newel) { - parameters.Insert(FindIndex(el), newel); + parameters.Insert(FindIndexInList(el), newel); } public void InsertBefore(documentation_comment_tag_param el, IEnumerable newels) { - parameters.InsertRange(FindIndex(el), newels); + parameters.InsertRange(FindIndexInList(el), newels); } public bool Remove(documentation_comment_tag_param el) @@ -31145,22 +31147,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(documentation_comment_tag el, documentation_comment_tag newel) { - tags.Insert(FindIndex(el) + 1, newel); + tags.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(documentation_comment_tag el, IEnumerable newels) { - tags.InsertRange(FindIndex(el) + 1, newels); + tags.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(documentation_comment_tag el, documentation_comment_tag newel) { - tags.Insert(FindIndex(el), newel); + tags.Insert(FindIndexInList(el), newel); } public void InsertBefore(documentation_comment_tag el, IEnumerable newels) { - tags.InsertRange(FindIndex(el), newels); + tags.InsertRange(FindIndexInList(el), newels); } public bool Remove(documentation_comment_tag el) @@ -32466,22 +32468,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(attribute el, attribute newel) { - attributes.Insert(FindIndex(el) + 1, newel); + attributes.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(attribute el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el) + 1, newels); + attributes.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(attribute el, attribute newel) { - attributes.Insert(FindIndex(el), newel); + attributes.Insert(FindIndexInList(el), newel); } public void InsertBefore(attribute el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el), newels); + attributes.InsertRange(FindIndexInList(el), newels); } public bool Remove(attribute el) @@ -32694,22 +32696,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(simple_attribute_list el, simple_attribute_list newel) { - attributes.Insert(FindIndex(el) + 1, newel); + attributes.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(simple_attribute_list el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el) + 1, newels); + attributes.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(simple_attribute_list el, simple_attribute_list newel) { - attributes.Insert(FindIndex(el), newel); + attributes.Insert(FindIndexInList(el), newel); } public void InsertBefore(simple_attribute_list el, IEnumerable newels) { - attributes.InsertRange(FindIndex(el), newels); + attributes.InsertRange(FindIndexInList(el), newels); } public bool Remove(simple_attribute_list el) @@ -33102,22 +33104,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(declaration el, declaration newel) { - defs.Insert(FindIndex(el) + 1, newel); + defs.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(declaration el, IEnumerable newels) { - defs.InsertRange(FindIndex(el) + 1, newels); + defs.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(declaration el, declaration newel) { - defs.Insert(FindIndex(el), newel); + defs.Insert(FindIndexInList(el), newel); } public void InsertBefore(declaration el, IEnumerable newels) { - defs.InsertRange(FindIndex(el), newels); + defs.InsertRange(FindIndexInList(el), newels); } public bool Remove(declaration el) @@ -33614,22 +33616,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(syntax_tree_node el, syntax_tree_node newel) { - param.Insert(FindIndex(el) + 1, newel); + param.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(syntax_tree_node el, IEnumerable newels) { - param.InsertRange(FindIndex(el) + 1, newels); + param.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(syntax_tree_node el, syntax_tree_node newel) { - param.Insert(FindIndex(el), newel); + param.Insert(FindIndexInList(el), newel); } public void InsertBefore(syntax_tree_node el, IEnumerable newels) { - param.InsertRange(FindIndex(el), newels); + param.InsertRange(FindIndexInList(el), newels); } public bool Remove(syntax_tree_node el) @@ -34329,22 +34331,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(name_assign_expr el, name_assign_expr newel) { - name_expr.Insert(FindIndex(el) + 1, newel); + name_expr.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(name_assign_expr el, IEnumerable newels) { - name_expr.InsertRange(FindIndex(el) + 1, newels); + name_expr.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(name_assign_expr el, name_assign_expr newel) { - name_expr.Insert(FindIndex(el), newel); + name_expr.Insert(FindIndexInList(el), newel); } public void InsertBefore(name_assign_expr el, IEnumerable newels) { - name_expr.InsertRange(FindIndex(el), newels); + name_expr.InsertRange(FindIndexInList(el), newels); } public bool Remove(name_assign_expr el) @@ -36655,22 +36657,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(addressed_value el, addressed_value newel) { - variables.Insert(FindIndex(el) + 1, newel); + variables.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(addressed_value el, IEnumerable newels) { - variables.InsertRange(FindIndex(el) + 1, newels); + variables.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(addressed_value el, addressed_value newel) { - variables.Insert(FindIndex(el), newel); + variables.Insert(FindIndexInList(el), newel); } public void InsertBefore(addressed_value el, IEnumerable newels) { - variables.InsertRange(FindIndex(el), newels); + variables.InsertRange(FindIndexInList(el), newels); } public bool Remove(addressed_value el) @@ -37038,22 +37040,22 @@ namespace PascalABCCompiler.SyntaxTree public void InsertAfter(uses_list el, uses_list newel) { - listunitsections.Insert(FindIndex(el) + 1, newel); + listunitsections.Insert(FindIndexInList(el) + 1, newel); } public void InsertAfter(uses_list el, IEnumerable newels) { - listunitsections.InsertRange(FindIndex(el) + 1, newels); + listunitsections.InsertRange(FindIndexInList(el) + 1, newels); } public void InsertBefore(uses_list el, uses_list newel) { - listunitsections.Insert(FindIndex(el), newel); + listunitsections.Insert(FindIndexInList(el), newel); } public void InsertBefore(uses_list el, IEnumerable newels) { - listunitsections.InsertRange(FindIndex(el), newels); + listunitsections.InsertRange(FindIndexInList(el), newels); } public bool Remove(uses_list el) @@ -38956,6 +38958,410 @@ namespace PascalABCCompiler.SyntaxTree } + /// + /// + /// + [Serializable] + public partial class pattern_node : syntax_tree_node + { + + /// + ///Конструктор без параметров. + /// + public pattern_node() + { + + } + + /// Создает копию узла + public override syntax_tree_node Clone() + { + pattern_node copy = new pattern_node(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + return copy; + } + + /// Получает копию данного узла корректного типа + public new pattern_node TypedClone() + { + return Clone() as pattern_node; + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 0; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 0; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class type_pattern : pattern_node + { + + /// + ///Конструктор без параметров. + /// + public type_pattern() + { + + } + + /// + ///Конструктор с параметрами. + /// + public type_pattern(ident _identifier,type_definition _type) + { + this._identifier=_identifier; + this._type=_type; + } + + /// + ///Конструктор с параметрами. + /// + public type_pattern(ident _identifier,type_definition _type,SourceContext sc) + { + this._identifier=_identifier; + this._type=_type; + source_context = sc; + } + protected ident _identifier; + protected type_definition _type; + + /// + /// + /// + public ident identifier + { + get + { + return _identifier; + } + set + { + _identifier=value; + } + } + + /// + /// + /// + public type_definition type + { + get + { + return _type; + } + set + { + _type=value; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + type_pattern copy = new type_pattern(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (identifier != null) + { + copy.identifier = (ident)identifier.Clone(); + copy.identifier.Parent = copy; + } + if (type != null) + { + copy.type = (type_definition)type.Clone(); + copy.type.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new type_pattern TypedClone() + { + return Clone() as type_pattern; + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 2; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 2; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return identifier; + case 1: + return type; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + identifier = (ident)value; + break; + case 1: + type = (type_definition)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + + /// + /// + /// + [Serializable] + public partial class is_pattern_expr : expression + { + + /// + ///Конструктор без параметров. + /// + public is_pattern_expr() + { + + } + + /// + ///Конструктор с параметрами. + /// + public is_pattern_expr(expression _left,pattern_node _right) + { + this._left=_left; + this._right=_right; + } + + /// + ///Конструктор с параметрами. + /// + public is_pattern_expr(expression _left,pattern_node _right,SourceContext sc) + { + this._left=_left; + this._right=_right; + source_context = sc; + } + protected expression _left; + protected pattern_node _right; + + /// + /// + /// + public expression left + { + get + { + return _left; + } + set + { + _left=value; + } + } + + /// + /// + /// + public pattern_node right + { + get + { + return _right; + } + set + { + _right=value; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + is_pattern_expr copy = new is_pattern_expr(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (attributes != null) + { + copy.attributes = (attribute_list)attributes.Clone(); + copy.attributes.Parent = copy; + } + if (left != null) + { + copy.left = (expression)left.Clone(); + copy.left.Parent = copy; + } + if (right != null) + { + copy.right = (pattern_node)right.Clone(); + copy.right.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new is_pattern_expr TypedClone() + { + return Clone() as is_pattern_expr; + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 2; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 2; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return left; + case 1: + return right; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + left = (expression)value; + break; + case 1: + right = (pattern_node)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + } diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index 452578b90..81f90e368 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -82,6 +82,24 @@ namespace PascalABCCompiler.SyntaxTree return null; } + /// + /// Получает коллекцию предков текущего узла + /// + /// Включить в список текущий узел + /// Коллекция предков узла + public IEnumerable AscendantNodes(bool includeSelf = false) + { + if (includeSelf) + yield return this; + + var parentNode = Parent; + while (parentNode != null) + { + yield return parentNode; + parentNode = parentNode.Parent; + } + } + /// /// Получает коллекцию узлов поддерева, в котором корнем является текущий узел. /// diff --git a/SyntaxTree/tree/Visitor.cs b/SyntaxTree/tree/Visitor.cs index 45ab1942f..385819d32 100644 --- a/SyntaxTree/tree/Visitor.cs +++ b/SyntaxTree/tree/Visitor.cs @@ -1330,6 +1330,24 @@ namespace PascalABCCompiler.SyntaxTree ///Node to visit /// Return value is void void visit(sugared_addressed_value _sugared_addressed_value); + /// + ///Method to visit pattern_node. + /// + ///Node to visit + /// Return value is void + void visit(pattern_node _pattern_node); + /// + ///Method to visit type_pattern. + /// + ///Node to visit + /// Return value is void + void visit(type_pattern _type_pattern); + /// + ///Method to visit is_pattern_expr. + /// + ///Node to visit + /// Return value is void + void visit(is_pattern_expr _is_pattern_expr); } diff --git a/SyntaxTree/tree/tree.nin b/SyntaxTree/tree/tree.nin index 895c737c9bc6783ece390c97520d13ff394a9548..cf72da509defcb066b28061e4a487d13e04e6f14 100644 GIT binary patch literal 173912 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�h7`dO>{2dzLVHnNuXY*y81(X!~6Z$*jYfD2&mY-Sm$zG@iM7j1U7v|Ev zyW;URQRL6kL--WN*3GLZFG=_AMu=_*nGN0(UnY#m^clq^v;DJ%P%ZG(@>%KLy@-+K z;+`9rO@O6%_a!>6)9BhL592&2zBjE;jNPEI8Hn|#jbge{^(;_c@Amh!O^M5IhTvw& zbrIQ2It6A@n5OdHSHfhu9zxPl>KCD7+#m3hVQfo4kYQ{q1WCObZ>WH5vlqE0YR$%AOxv;Q!H0AHYYze%WuVp0+CpIiuW)Cx3*@8O~b)CbTB^D z;%akI*>vv_4e>(FQIa7IU4#)AcLN89vKj0cn)T7Z3Z!n21q7+v;}E27EwE%J)_`eJ zZrR+KQ%Z0h1Z64S6B^M95rLlZWWY+A>M0Fu!@&53@TXO82R-ph$1^B&{iXwo{dDBg zCGQ4yRHt#;CfDNJ0U1NpWB_s19wz?UQ4^6G}v8U2>3{ksD$8Z&=s-uq(NN` zq$dpyb&FS{N`1RSlZ)^1Y14~Z)>F&k9q}bC>#bgqQnv2Ps`rH+nOaet?;jMiS@;SH zb&LQ{@m>uGGOc(`7w?b7)BRy7UZK|m;j;PP2ne$I-_+#?a`l{A1a_Xc0@1RC-`40s zh_21~Wl2Hc82*kHABtl1^XiT9Zoo+LcuymTAkx3Sn$7&)SA7`tgbNTKpv>(X!?}7~ z;%4(=!6!?bqY>-rKw5~mv za5@TV#7$G7yRA`%693vt;>0&rIyh90(!gm{x|fC}O((6PtEk{AIGXs!qnfJEh91U^ zrkQ!=-Tk7F7R`+p_3(?riT1TL_AJEKcQ?fJk_jh&5lj|we^kTHL72T{5)Vp8kQ