Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re^2: Generic RPN Translator available?

by dfaure (Chaplain)
on Jan 20, 2005 at 22:22 UTC ( [id://423814]=note: print w/replies, xml ) Need Help??


in reply to Re: Generic RPN Translator available?
in thread Generic RPN Translator available?

I don't know how (or if) functions with variable numbers of arguments are handle in RPN?

As a previous life's HP-48 owner, number of arguments is pushed onto the stack after them. Since functions know how to unstack their args, in this case this is a two steps operation

____
HTH, Dominique
My two favorites:
If the only tool you have is a hammer, you will see every problem as a nail. --Abraham Maslow
Bien faire, et le faire savoir...

Replies are listed 'Best First'.
Re^3: Generic RPN Translator available?
by saintmike (Vicar) on Jan 21, 2005 at 03:37 UTC
    Update: Looks like I spoke too soon:
    "sin(ab)"
    yields
    sin, a, b
    instead of the correct
    sin, ab
    Hmmm ...

    Actually, I was looking for exactly the solution browserUK provided. Outstanding job, browserUK! It even works for nested function calls like

    "max(min(a,b-c), c, min(d-f,e) ) * atan( pi*4, -1 )"
    which gets transformed to
    a, b, c, -, min, c, d, f, -, e, min, max, pi, 4, *, -1, atan, *
    Now, anyone up for a Parse::Descent grammar, just for kicks :) ?

      Fixed. Update: But it still has another bug!..

      P:\test>423305 -XLATE 1+2+3 1, 2, ADD, 3, ADD a+b+c a, b, ADD, c, ADD abc+def+Efg_hij abc, def, ADD, Efg_hij, ADD 2.0+1e-2/0.01E-21 2.0, 1e-2, ADD, 0.01E-21, DIV max( a, b, c, d ) * atan( pi*4, -1 ) a, b, c, d, 4, max, pi, 4, MULT, -1, 2, atan, MULT sin( cos( x ) - tan( y ) ) + f( g( z ) ) x, cos, y, tan, SUBT, sin, z, g, f, ADD 2*(somevar+other) + max(this, that) 2, somevar, other, ADD, MULT, this, that, 2, max, ADD A+(B*C-D)/E A, B, C, MULT, D, SUBT, ADD, E, DIV (a*(b)-c^(3.4e-2)) a, b, MULT, c, SUBT, 3.4e-2, POW 5^((-2e-3+x)*sin(p+4.0)/fred) 5, -2e-3, x, ADD, p, 4.0, ADD, sin, MULT, fred, DIV, POW sin(a) + sin(ab) + sin( a, b ) a, sin, ab, sin, ADD, a, b, 2, sin, ADD Func_1( 1, Func_2( Func3( 1* 2 * 3) * aFunc( 3 ) )+FuNc(4,5,6), -2,e, +-10, -2e-10 ) +1 1, 1, 2, MULT, 3, MULT, Func3, 3, aFunc, MULT, Func_2, 4, 5, +6, 3, FuNc, ADD, -2, e, -10, -2e-10, 6, Func_1, 1, ADD

      Anyone have a ready source of expressions plus their RPN forms? Or a clever way of verifying them?


      Examine what is said, not who speaks.
      Silence betokens consent.
      Love the truth but pardon error.

        An updated version of the above with all the bugs I am aware of fixed.

        It attempts to verify the results by reversing them. The caveat being that as far as I can see, there is no easy way to put back parenthesis around subexpressions? Hence it will flag expressions that contain parenthesised subexpression as not being correctly.

        In every case I have tested, the expression has been reversed correctly except for the replacement of the parens.

        It's not a perfect test method, but the best I have come up with. Anyone have a better one?

        Results

        Code:


        Examine what is said, not who speaks.
        Silence betokens consent.
        Love the truth but pardon error.
Re^3: Generic RPN Translator available?
by BrowserUk (Patriarch) on Jan 20, 2005 at 22:33 UTC

    It had to be either that, or a sentinel. So, the following expression => RPN would be correct?

    P:\test>423305 "max( a, b, c, d ) * atan( pi*4, -1 )" a, b, c, d, 4, max, pi, 4, *, -1, 2, atan, *

    Modified code


    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.

      Seems OK.

      On a real HP, the max function handles only 2 parameters, but your max definition could be emulated with a loop and the number of parameters to manage is required.

      ____
      HTH, Dominique
      My two favorites:
      If the only tool you have is a hammer, you will see every problem as a nail. --Abraham Maslow
      Bien faire, et le faire savoir...

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://423814]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (4)
As of 2024-03-29 02:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found