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
|