From d754bdbf4bc47eab8ee61bca021f70be40b476a3 Mon Sep 17 00:00:00 2001 From: Randy Hollines Date: Sun, 18 Feb 2024 04:08:54 -0800 Subject: [PATCH] usage of 'xxxRange' and 'in' --- core/compiler/parser.cpp | 35 +++++++++++++++++++++++++---------- docs/api.zip | Bin 417379 -> 417379 bytes programs/tests/prgm277.obs | 6 +++--- programs/tests/prgm283.obs | 5 ++--- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/core/compiler/parser.cpp b/core/compiler/parser.cpp index b0649b8b09..b08d53fb20 100644 --- a/core/compiler/parser.cpp +++ b/core/compiler/parser.cpp @@ -5068,15 +5068,12 @@ For* Parser::ParseEach(bool reverse, int depth) NextToken(); // add count entry + Assignment* bind_assign = nullptr; std::wstring bound_ident; if(bind_var) { bound_ident = count_ident; count_ident = L'#' + count_ident + L"_index"; - } - - // add bind variable entry - Assignment* bind_assign = nullptr; - if(bind_var) { + const std::wstring bind_scope_name = GetScopeName(bound_ident); Type* bind_left_type = TypeFactory::Instance()->MakeType(VAR_TYPE); SymbolEntry* bind_entry = TreeFactory::Instance()->MakeSymbolEntry(file_name, line_num, line_pos, bind_scope_name, @@ -5098,10 +5095,28 @@ For* Parser::ParseEach(bool reverse, int depth) if(Match(TOKEN_IDENT)) { const std::wstring ident_type = scanner->GetToken()->GetIdentifier(); if(ident_type == L"CharRange" || ident_type == L"System.CharRange") { - count_type = TypeFactory::Instance()->MakeType(CHAR_TYPE); + if(!bind_var) { + count_type = TypeFactory::Instance()->MakeType(CHAR_TYPE); + } + else { + ProcessError(L"Range class '" + ident_type + L"' cannot be bound to index variable '" + bound_ident + L"', try using the ':' operator"); + } + } + else if((ident_type == L"IntRange" || ident_type == L"System.IntRange")) { + if(!bind_var) { + count_type = TypeFactory::Instance()->MakeType(INT_TYPE); + } + else { + ProcessError(L"Range class '" + ident_type + L"' cannot be bound to index variable '" + bound_ident + L"', try using the ':' operator"); + } } else if(ident_type == L"FloatRange" || ident_type == L"System.FloatRange") { - count_type = TypeFactory::Instance()->MakeType(FLOAT_TYPE); + if(!bind_var) { + count_type = TypeFactory::Instance()->MakeType(FLOAT_TYPE); + } + else { + ProcessError(L"Range class '" + ident_type + L"' cannot be bound to index variable '" + bound_ident + L"', try using the ':' operator"); + } } } @@ -5220,7 +5235,7 @@ For* Parser::ParseEach(bool reverse, int depth) // left_pre_count = ParseExpression(depth + 1); - if(left_pre_count->GetExpressionType() == VAR_EXPR) { + if(left_pre_count && left_pre_count->GetExpressionType() == VAR_EXPR) { Variable* variable = static_cast(left_pre_count); if(!variable->GetIndices()) { // set method call to 'x->Size()' @@ -5229,7 +5244,7 @@ For* Parser::ParseEach(bool reverse, int depth) variable->GetName(), L"Size", TreeFactory::Instance()->MakeExpressionList()); } } - else if(left_pre_count->GetExpressionType() == METHOD_CALL_EXPR) { + else if(left_pre_count && left_pre_count->GetExpressionType() == METHOD_CALL_EXPR) { // add count entry const std::wstring count_scope_name = GetScopeName(L'#' + count_ident + L"_range"); Type* count_type = TypeFactory::Instance()->MakeType(CLASS_TYPE); @@ -5242,7 +5257,7 @@ For* Parser::ParseEach(bool reverse, int depth) ProcessError(L"Variable already defined in this scope: '" + count_ident + L"'"); } } - else if(left_pre_count->GetExpressionType() != METHOD_CALL_EXPR) { + else if(left_pre_count && left_pre_count->GetExpressionType() != METHOD_CALL_EXPR) { ProcessError(L"Expected variable or literal expression", TOKEN_SEMI_COLON); } } diff --git a/docs/api.zip b/docs/api.zip index 1bb8c0c817f877b578c82caf13284c97aa0d76a6..7cce5593409e4526e5a46e8c26497c3fad2313e1 100644 GIT binary patch delta 7708 zcmZXZd0fxw7RP_z<$3xQm9%K1kZ7eeX<^bvzZC6@$~w#?2Hj~AGqx<_%D6~BL}MRw zM|W)XvqZ*JmNBF$W^TqX7-QsG!j#ZGzwasIbpLW*@8@%t=bYzx`j%VeHn+-cjAKSg zvV}^eQmZnp;|>_-G70`Yw31nwD#i|rYFRNdZJZ> z-9=+bz6Tly*EyhjUC}Bme$w_X28#Ray`$O#?tg;fL%OM0hW+sz%wAY^6_;jTs6sEl zx@oA{b=4dL9=o=?J@T*dxOC*sZcIAiVG0_@n@eyh^QDI())fiDRM9&k zvgp=W2xrhrwHJ0OCFt7v2&DKfY)}z(WUHB5M%Y%eujN;}i1b5Z%P&X??XhJq6 zLYSd!R#z7zv|!|#6k#*^ⅆ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 D+F--_ delta 7708 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 x := 13.3; - +#~ for(i := 5; i < x; i += 3;) { i->PrintLine(); } - - each(i : IntRange->New(5., x, 3)) { +~# + each(i : IntRange->New(5)) { i->PrintLine(); } diff --git a/programs/tests/prgm283.obs b/programs/tests/prgm283.obs index ab8d82884f..7b31fe30ae 100644 --- a/programs/tests/prgm283.obs +++ b/programs/tests/prgm283.obs @@ -1,8 +1,7 @@ class Test { function : Main(args : String[]) ~ Nil { - values := [1,2,3,4,5]; - each(value in values) { - value->PrintLine() + each(value in IntRange->New(1,4)) { + value->Print() } } } \ No newline at end of file