diff --git a/ParserTools/ParserTools/DefaultLanguageInformation.cs b/ParserTools/ParserTools/DefaultLanguageInformation.cs index c45799a5..1ae0b236 100644 --- a/ParserTools/ParserTools/DefaultLanguageInformation.cs +++ b/ParserTools/ParserTools/DefaultLanguageInformation.cs @@ -541,18 +541,39 @@ namespace PascalABCCompiler.Parsers { if (fields[i].Name != "value__") { - object o = fields[i].GetRawConstantValue(); //ошибка была здесь, так как я не знал, что у констант enum'а может быть другой тип помимо int - switch (o) - { - case byte b: if (b != i - 1) return true; break; - case sbyte b: if (b != i - 1) return true; break; - case short b: if (b != i - 1) return true; break; - case ushort b: if (b != i - 1) return true; break; - case int b: if (b != i - 1) return true; break; - case uint b: return true; break; - case long b: return true; break; - case ulong b: return true; break; - } + object o = fields[i].GetRawConstantValue(); //ошибка была здесь, так как я не знал, что у констант enum'а может быть другой тип помимо int + if (o is byte b1) + { + if (b1 != i - 1) return true; + } + else if (o is sbyte b2) + { + if (b2 != i - 1) return true; + } + else if (o is short b3) + { + if (b3 != i - 1) return true; + } + else if (o is ushort b4) + { + if (b4 != i - 1) return true; + } + else if (o is int b5) + { + if (b5 != i - 1) return true; + } + else if (o is uint b6) + { + return true; + } + else if (o is long b7) + { + return true; + } + else if (o is ulong b8) + { + return true; + } } } return false; diff --git a/SyntaxVisitors/LightSymInfoVisitors/SymInfoCollect1.cs b/SyntaxVisitors/LightSymInfoVisitors/SymInfoCollect1.cs index c8789e59..ece3514e 100644 --- a/SyntaxVisitors/LightSymInfoVisitors/SymInfoCollect1.cs +++ b/SyntaxVisitors/LightSymInfoVisitors/SymInfoCollect1.cs @@ -32,65 +32,64 @@ namespace PascalABCCompiler.SyntaxTree public override void Enter(syntax_tree_node st) { ScopeSyntax t = null; - switch (st) + if (st is program_module p1 || st is unit_module u) { - case program_module p: - case unit_module u: - t = new GlobalScopeSyntax(); - Root = t; - break; - case procedure_definition p: - var name = p.proc_header?.name?.meth_name; - if (name == null) - name = "create"; - var attr = p.proc_header.class_keyword ? Attributes.class_attr : 0; - if (name != null) - if (p.proc_header is function_header) - AddSymbol(name, SymKind.funcname,null, attr); - else AddSymbol(name, SymKind.procname, null, attr); - t = new ProcScopeSyntax(name); - break; - //case formal_parameters p:// Это неправильный Scope - он закрывался при выходе из секции формальных параметров, что неправильно - // t = new ParamsScopeSyntax(); - // break; - case statement_list p: - t = new StatListScopeSyntax(); - break; - case for_node p: - t = new ForScopeSyntax(); - break; - case foreach_stmt p: - t = new ForeachScopeSyntax(); - break; - /*case repeat_node p: // не надо т.к. это StatListScope - t = new RepeatScopeSyntax(); - break;*/ - case case_node p: - t = new CaseScopeSyntax(); - break; - case class_definition p: - var td = p.Parent as type_declaration; - var tname = td==null ? "NONAME" : td.type_name; - if (p.keyword == class_keyword.Class) - { - AddSymbol(tname, SymKind.classname); - t = new ClassScopeSyntax(tname); - } - else if (p.keyword == class_keyword.Record) - { - AddSymbol(tname, SymKind.recordname); - t = new RecordScopeSyntax(tname); - } - else if (p.keyword == class_keyword.Interface) - { - AddSymbol(tname, SymKind.interfacename); - t = new InterfaceScopeSyntax(tname); - } - break; - case function_lambda_definition p: - t = new LambdaScopeSyntax(); - break; + t = new GlobalScopeSyntax(); + Root = t; + } + else if (st is procedure_definition p2) + { + var name = p2.proc_header?.name?.meth_name; + if (name == null) + name = "create"; + var attr = p2.proc_header.class_keyword ? Attributes.class_attr : 0; + if (name != null) + if (p2.proc_header is function_header) + AddSymbol(name, SymKind.funcname, null, attr); + else AddSymbol(name, SymKind.procname, null, attr); + t = new ProcScopeSyntax(name); + } + else if (st is statement_list p3) + { + t = new StatListScopeSyntax(); + } + else if (st is for_node p4) + { + t = new ForScopeSyntax(); + } + else if (st is foreach_stmt p5) + { + t = new ForeachScopeSyntax(); + } + else if (st is case_node p6) + { + t = new CaseScopeSyntax(); + } + else if (st is class_definition p7) + { + var td = p7.Parent as type_declaration; + var tname = td == null ? "NONAME" : td.type_name; + if (p7.keyword == class_keyword.Class) + { + AddSymbol(tname, SymKind.classname); + t = new ClassScopeSyntax(tname); + } + else if (p7.keyword == class_keyword.Record) + { + AddSymbol(tname, SymKind.recordname); + t = new RecordScopeSyntax(tname); + } + else if (p7.keyword == class_keyword.Interface) + { + AddSymbol(tname, SymKind.interfacename); + t = new InterfaceScopeSyntax(tname); + } } + else if (st is function_lambda_definition p8) + { + t = new LambdaScopeSyntax(); + } + if (t != null) { t.Parent = Current; @@ -112,22 +111,12 @@ namespace PascalABCCompiler.SyntaxTree } public override void Exit(syntax_tree_node st) { - switch (st) + if (st is program_module p || st is procedure_definition pd || st is statement_list stl || + st is for_node f || st is foreach_stmt fe || st is class_definition cd || st is record_type rt || + st is function_lambda_definition fld || st is case_node cas) { - case program_module p: - case procedure_definition pd: - //case formal_parameters fp: - case statement_list stl: - case for_node f: - case foreach_stmt fe: - case class_definition cd: - case record_type rt: - case function_lambda_definition fld: - //case repeat_node rep: - case case_node cas: - PreExitScope(st); - Current = Current.Parent; - break; + PreExitScope(st); + Current = Current.Parent; } } public override void visit(var_def_statement vd) diff --git a/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs index df3e91ec..388c9629 100644 --- a/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs @@ -354,19 +354,16 @@ namespace SyntaxVisitors.PatternsVisitors private type_definition GetTypeDefinitionForConstParam(expression constParamExpr) { - switch (constParamExpr) - { - case string_const type: - return new named_type_reference("string"); - case char_const type: - return new named_type_reference("char"); - case int32_const type: - return new named_type_reference("integer"); - case int64_const type: - return new named_type_reference("integer"); - case double_const type: - return new named_type_reference("double"); - } + if (constParamExpr is string_const type1) + return new named_type_reference("string"); + if (constParamExpr is char_const type2) + return new named_type_reference("char"); + if (constParamExpr is int32_const type3) + return new named_type_reference("integer"); + if (constParamExpr is int64_const type4) + return new named_type_reference("integer"); + if (constParamExpr is double_const type5) return new named_type_reference("double"); + return null; } @@ -821,25 +818,28 @@ namespace SyntaxVisitors.PatternsVisitors { List statementsToAdd = null; - switch (isExpression.right) + if (isExpression.right is deconstructor_pattern dp) { - case deconstructor_pattern dp: - if (dp.const_params_check != null) - { - var ifToAddConstParamsCheckTo = GetAscendant(isExpression); - ifToAddConstParamsCheckTo.condition = bin_expr.LogicalAnd(ifToAddConstParamsCheckTo.condition, dp.const_params_check); - } - statementsToAdd = ProcessDesugaringForDeconstructorPattern(isExpression); - break; - case collection_pattern cp: - statementsToAdd = ProcessDesugaringForCollectionPattern(isExpression); - break; - case tuple_pattern cp: - statementsToAdd = ProcessDesugaringForTuplePattern(isExpression); - break; - case const_pattern cp: - statementsToAdd = ProcessDesugaringForConstPattern(isExpression); - break; + if (dp.const_params_check != null) + { + var ifToAddConstParamsCheckTo = GetAscendant(isExpression); + ifToAddConstParamsCheckTo.condition = + bin_expr.LogicalAnd(ifToAddConstParamsCheckTo.condition, dp.const_params_check); + } + + statementsToAdd = ProcessDesugaringForDeconstructorPattern(isExpression); + } + else if (isExpression.right is collection_pattern cp1) + { + statementsToAdd = ProcessDesugaringForCollectionPattern(isExpression); + } + else if (isExpression.right is tuple_pattern cp2) + { + statementsToAdd = ProcessDesugaringForTuplePattern(isExpression); + } + else if (isExpression.right is const_pattern cp3) + { + statementsToAdd = ProcessDesugaringForConstPattern(isExpression); } var enclosingIf = GetAscendant(isExpression); @@ -1113,13 +1113,13 @@ namespace SyntaxVisitors.PatternsVisitors { var firstStatement = GetAscendant(node); - switch (firstStatement) - { - case if_node _: return PatternLocation.IfCondition; - case var_statement _: return PatternLocation.Assign; - case assign _: return PatternLocation.Assign; - default: return PatternLocation.Unknown; - } + if (firstStatement is if_node _) + return PatternLocation.IfCondition; + if (firstStatement is var_statement _) + return PatternLocation.Assign; + if (firstStatement is assign _) + return PatternLocation.Assign; + return PatternLocation.Unknown; } private T GetAscendant(syntax_tree_node node) diff --git a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs index 99dc7da6..829be3c5 100644 --- a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs +++ b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs @@ -139,12 +139,11 @@ namespace PascalABCCompiler.TreeConverter private type_node GetDeconstructorOwner(function_node deconstructor) { - switch (deconstructor) - { - case common_method_node commonMethod: return commonMethod.cont_type; - case common_namespace_function_node commonNamespaseFunction: return GetSelfParameter(commonNamespaseFunction).type; - default: return null; - } + if (deconstructor is common_method_node commonMethod) + return commonMethod.cont_type; + if (deconstructor is common_namespace_function_node commonNamespaseFunction) + return GetSelfParameter(commonNamespaseFunction).type; + return null; } private bool AreTheSameType(type_node type1, type_node type2) => diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 05f3a050..924433f6 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -21281,24 +21281,26 @@ namespace PascalABCCompiler.TreeConverter semantic_check_for_indices(expr); }*/ // Patterns - else if (st.typ is SemanticCheckType.MatchedExpression) // Это безобразие - SemanticCheckType в TreeHelper.cs помещать!!! + else if + ((SemanticCheckType)st.typ == SemanticCheckType + .MatchedExpression) // Это безобразие - SemanticCheckType в TreeHelper.cs помещать!!! { var expr = st.lst[0] as expression; CheckMatchedExpression(expr); } - else if (st.typ is SemanticCheckType.MatchedExpressionAndType) + else if ((SemanticCheckType)st.typ == SemanticCheckType.MatchedExpressionAndType) { var expr = st.lst[0] as expression; var type = st.lst[1] as type_definition; CheckIfCanBeMatched(expr, type); } - else if (st.typ is SemanticCheckType.MatchedExpressionAndExpression) + else if ((SemanticCheckType)st.typ == SemanticCheckType.MatchedExpressionAndExpression) { var matchedExpr = st.lst[0] as expression; var patternExpr = st.lst[1] as expression; CheckIfCanBeMatched(matchedExpr, patternExpr); } - else if (st.typ is SemanticCheckType.MatchedTuple) + else if ((SemanticCheckType)st.typ == SemanticCheckType.MatchedTuple) { var tuple = st.lst[0] as expression; var length = st.lst[1] as int32_const; @@ -21306,7 +21308,7 @@ namespace PascalABCCompiler.TreeConverter } // !Patterns // Slices - else if (st.typ is SemanticCheckType.SliceAssignmentTypeCompatibility) + else if ((SemanticCheckType)st.typ == SemanticCheckType.SliceAssignmentTypeCompatibility) { var to = st.lst[0] as expression; var from = st.lst[1] as expression;