Paradox Community

Items in pnews.paradox-dos

Subject:Re: Operator precedence
Date:Fri, 8 Sep 2017 12:34:48 +0100
From:Michael Kennedy <Info@KennedySoftware.ie>
Newsgroups:pnews.paradox-dos
Good!

My original thoughts were that maybe the same contortions can apply to 
NOT, but, with NOT higher than AND/OR, then it should be OK also:
   True_or_False = Condition_1 AND NOT Condition_2

And many parsers/compilers accept:
   Result_1 = Value_1 * Cond_1
   Result_1 = 5 * (aa > bb)
   Result_1 = Value_1 * NOT Cond_1
   Result_1 = Value_1 * (NOT Cond_1)

I think PDoxDos cannot, but I've not checked...

   - Mike


On 07/09/2017 22:53, Bernie van't Hof wrote:
>      a = 1
>      b = 2
>      c = a *-b
> becomes
>      $a = 1;
>      $b = 2;
>      $c = $a *- $b;
>          // I should probably tidy up the positioning of the '-'
> and correctly produces -2
> 
> But you had me going there for a moment!
> 
> -B
> On 8/9/17 2:28 am, Michael Kennedy wrote:
>> Bernie, that looks very good - but my opinion here is worthless! I'm 
>> not tuned in to all the "NOT" details, not very familiar with PHP, etc.
>>
>> One other interesting find: I looked through the "help" system on 
>> PlayRightPro (PDox-DOS), and found "precedence", and... its list is 
>> exactly as I posted yesterday, but it also has that #$%#$%#$% Unary 
>> Minus as a separate item in the list, just after the first "()" entry!
>>
>> Which, IMO, is good news.
>>
>> So, seems the PDox Exp-Eval code does recognise that special "-", and 
>> handles it separately. And, presumably the PHP evaluator behaves 
>> identically?
>>
>>    - Mike
>>
>>
>> On 07/09/2017 07:16, Bernie van't Hof wrote:
>>> What I came up with ..
>>>
>>> public function Parser()
>>> {
>>>      $out = '';
>>>      while ( ! $this->lexer->Eof()) {
>>>          switch($this->lexer->Next()->type){
>>>              case whatever:
>>>                  $out .= $this->Expression();
>>>          }
>>>      }
>>>      return $out;
>>> }
>>>
>>> public function Expression()
>>> {
>>>      $exp = '';
>>>      do{
>>>          $exp .= $this->SubExpr();
>>>      } while ($this->lexer->Peek()->type == 'logical');
>>>      return $exp;
>>> }
>>> private function SubExpr()
>>> {
>>>      $exp = '';
>>>      do{
>>>          switch($this->Peek()->type){
>>>              case 'logical':
>>>                  // PAL's NOT, AND, OR
>>>                  // use php's && and || instead of AND
and OR
>>>                  // (higher precedence than ops)
>>>                  $exp .= $this->lexer->Next()->val . '('
. 
>>> Expression() . ')';
>>>                  break;
>>>              case 'op':
>>>                  // PAL's +-*/%=<>
>>>                  switch($this->lexer->Next()->val)
>>>                  {
>>>                      // etc
>>>                  }
>>>              //etc (dozens of 'em)
>>>          }
>>>      } while($this->lexer->Peek()->type == 'op');
>>>      return $exp;
>>> }
>>>
>>> - B
>>> On 7/9/17 7:54 am, Michael Kennedy wrote:
>>>> Wow - that's real nasty! But you seem to have resolved it.
>>>>
>>>> Back, maybe 20-25 years ago, I recall writing an 
>>>> expression-evaluator from scratch, and I still recall major hassle 
>>>> with that damn "-" and with "NOT" - probably the same issue with 
>>>> both. I don't remember the details, nor good examples, but maybe 
>>>> something like:
>>>>
>>>>    A * -B --> A * (-B) --> A * (0-B)
>>>>
>>>> So the meaning of each "-" had to be determined first, before 
>>>> deciding how/when to evaluate it.
>>>>
>>>> Maybe the same approach was/is needed for NOT?
>>>>
>>>>    - Mike
>>>>
>>>>
>>>> On 06/09/2017 18:56, Bernie van't Hof wrote:
>>>>> Thanks, Mike.
>>>>>
>>>>> What I realised in the mean-time ..
>>>>>
>>>>> php has precedence of ! (NOT) above all those on your list except ()
>>>>> So
>>>>>      IF NOT Retval = "Esc" ; which works fine
>>>>> does not become
>>>>>      if( ! $Retval == 'Esc') // valid php but wrong result!
>>>>> it should be
>>>>>      if( ! ($Retval == 'Esc'))
>>>>>
>>>>> I used the above pal construct only twice in 30k lines of pal, more 
>>>>> commonly using
>>>>>      IF Retval <> "Esc"
>>>>> which converts nicely to
>>>>>      if($Retval <> 'Esc')
>>>>> so I didn't spot it in earlier run-time testing.
>>>>>
>>>>>
>>>>> -B
>>>>>
>>>>> On 7/9/17 2:10 am, Michael Kennedy wrote:
>>>>>> The manuals say:
>>>>>>   () - Inner pairs first
>>>>>>   (All the following are Left-to-Right]...
>>>>>>   * /
>>>>>>   + -
>>>>>>   = <> < <= > >=
>>>>>>   NOT
>>>>>>   AND
>>>>>>   OR
>>>>>>
>>>>>> ...all as expected...
>>>>>>
>>>>>> There's no mention of that darn "unary minus", nor of different 
>>>>>> contexts of "NOT", etc...
>>>>>>
>>>>>> I assume that PDoxDOS represents (1=2), [False], internally as 0, 
>>>>>> but I don't recall how it represents (1=1) [True, = NOT False]. I 
>>>>>> think most systems use "-1", but some systems use just "1", and 
>>>>>> maybe some use "any non-zero value"?.....
>>>>>>
>>>>>>    - Mike
>>>>>>
>>>>>>
>>>>>> On 04/09/2017 18:40, Bernie van't Hof wrote:
>>>>>>> Anyone have handy a operator precedence list for PDOX DOS?
>>>>>>>
>>>>>>> Having an issue with 'NOT' and darned if I can see why.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> B


Copyright © 2004 thedbcommunity.com