Paradox Community

Items in pnews.paradox-dos

Subject:Re: Operator precedence
Date:Thu, 7 Sep 2017 16:16:57 +1000
From:Bernie van't Hof <berniev@bje.com.au>
Newsgroups:pnews.paradox-dos
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