home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ssvpar.zip / SSCALCRX.CMD < prev    next >
OS/2 REXX Batch file  |  1994-12-15  |  8KB  |  252 lines

  1. /*--------------------------------------------------------------*/
  2. /* Visual Yacc++ REXX function                                  */
  3. /*                                                              */
  4. /* Note - If you changed the default directory when you         */
  5. /*        installed Visual Parse++, you must change the         */
  6. /*        SSDll variable to reflect that change.                */
  7. /*                                                              */
  8. /*--------------------------------------------------------------*/
  9.  
  10. arg expr
  11.  
  12. numeric digits 12
  13.  
  14. SSDll = 'SSVPREXX'
  15. call RxFuncAdd 'SSLoadRexxFunctions', SSDll, 'SSLoadRexxFunctions'
  16. call SSLoadRexxFunctions SSDll
  17.  
  18. signal on error name SSTerminate
  19. signal on syntax name SSTerminate
  20. signal on failure name SSTerminate
  21.  
  22. ALexEnd         = 4
  23. ALexPlus        = 5
  24. ALexMinus       = 6
  25. ALexDiv         = 7
  26. ALexMult        = 8
  27. ALexMod         = 9
  28. ALexPow         = 10
  29. ALexOr          = 11
  30. ALexAnd         = 12
  31. ALexNot         = 13
  32. ALexOParen      = 14
  33. ALexCParen      = 15
  34. ALexDec         = 16
  35. ALexOct         = 17
  36. ALexHex         = 18
  37.  
  38. AYaccStart      = 1
  39. AYaccStartList  = 2
  40. AYaccExprSingle = 3
  41. AYaccExprError  = 4
  42. AYaccExprPlus   = 5
  43. AYaccExprMinus  = 6
  44. AYaccExprMult   = 7
  45. AYaccExprDiv    = 8
  46. AYaccExprMod    = 9
  47. AYaccExprNot    = 10
  48. AYaccExprAnd    = 11
  49. AYaccExprOr     = 12
  50. AYaccExprNested = 13
  51. AYaccExprNumber = 14
  52. AYaccNumberDec  = 15
  53. AYaccNumberOct  = 16
  54. AYaccNumberHex  = 17
  55.  
  56. ALexClassTable = 'sscalc.dfa'
  57. ALexClass = SSLexCreate( ALexClassTable, expr, SSBuffer)
  58. ALexClassTable = ""
  59. AYaccClassTable = 'sscalc.llr'
  60. AYaccClass = SSYaccCreate( ALexClass, AYaccClassTable)
  61. AYaccClassTable = ""
  62.  
  63. do forever
  64.    SSRet = SSYaccParse( AYaccClass, SSParm)
  65.    select
  66.       when SSRet = SSOK then
  67.          nop /*say "Lexeme "SSParm.0", "SSParm.1*/
  68.       when SSRet = SSMORE then do
  69.          SSRet = ALexClassProcessMore()
  70.          if SSRet <> "" then
  71.             SSRet = SSLexAddData( ALexClass, SSRet)
  72.          end
  73.       when SSRet = SSSHIFT then
  74.          nop /*say "Shift "SSParm.0", "SSParm.1*/
  75.       when SSRet = SSREDUCE then
  76.          call AYaccClassReduce
  77.       when SSRet = SSACCEPT then do
  78.          leave
  79.          end
  80.       when SSRet = SSLEXERROR then do
  81.          SSRet = ALexClassProcessError()
  82.          if SSRet < 0 then leave
  83.          end
  84.       when SSRet = SSYACCERROR then do
  85.          SSRet = AYaccClassProcessError()
  86.          if SSRet < 0 then leave
  87.          end
  88.       otherwise
  89.          say 'Unprocessed parse 'SSRet
  90.    end
  91. end
  92.  
  93. call SSCleanup
  94. return 0
  95.  
  96.  
  97.  
  98. AYaccClassProcessError:
  99.    if SSParm.2 = 4294967295 then
  100.       say 'Syntax error: Probable missing semicolon'
  101.    else
  102.       say 'Syntax error at 'SSParm.2','SSParm.3': 'SSParm.0', 'SSParm.1
  103.    return -1
  104.  
  105. ALexClassProcessMore:
  106.    return ''
  107.  
  108. ALexClassProcessError:
  109.    say 'Invalid lexeme on line 'SSParm.2' at offset 'SSParm.3': 'SSParm.0
  110.    return -1
  111.  
  112. AYaccClassReduce:
  113.    select
  114.       when SSParm.0 = AYaccStart then do
  115.       /* start -> exprStatement */
  116.          end
  117.  
  118.       when SSParm.0 = AYaccStartList then do
  119.       /* start -> start exprStatement */
  120.          end
  121.  
  122.       when SSParm.0 = AYaccExprSingle then do
  123.       /* exprStatement -> expr ; */
  124.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  125.          if substr( Expr0.4, 1, 1) <> '-' then
  126.             say Expr0.4','d2x(trunc( Expr0.4))
  127.          else
  128.             say Expr0.4
  129.          end
  130.  
  131.       when SSParm.0 = AYaccExprError then do
  132.       /* exprStatement -> %error ; */
  133.          end
  134.  
  135.       when SSParm.0 = AYaccExprPlus then do
  136.       /* expr -> expr + expr */
  137.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  138.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  139.          Calc = Expr0.4 + Expr2.4
  140.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  141.          end
  142.  
  143.       when SSParm.0 = AYaccExprMinus then do
  144.       /* expr -> expr - expr */
  145.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  146.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  147.          Calc = Expr0.4 - Expr2.4
  148.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  149.          end
  150.  
  151.       when SSParm.0 = AYaccExprMult then do
  152.       /* expr -> expr * expr */
  153.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  154.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  155.          Calc = Expr0.4 * Expr2.4
  156.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  157.          end
  158.  
  159.       when SSParm.0 = AYaccExprDiv then do
  160.       /* expr -> expr / expr */
  161.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  162.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  163.          if Expr2.4 = 0 then do
  164.             say "Divide by 0 error, terminating"
  165.             exit 1
  166.             end
  167.          Calc = Expr0.4 / Expr2.4
  168.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  169.          end
  170.  
  171.       when SSParm.0 = AYaccExprMod then do
  172.       /* expr -> expr % expr */
  173.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  174.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  175.          Calc = Expr0.4 // Expr2.4
  176.          if Expr2.4 = 0 then do
  177.             say "Divide by 0 error, terminating"
  178.             exit 1
  179.             end
  180.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  181.          end
  182.  
  183.       when SSParm.0 = AYaccExprNot then do
  184.       /* expr -> not expr */
  185.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr1, 1)
  186.          Calc = SSBitNot( Expr1.4)
  187.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  188.          end
  189.  
  190.       when SSParm.0 = AYaccExprAnd then do
  191.       /* expr -> expr and expr */
  192.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  193.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  194.          Calc = SSBitAnd( Expr0.4, Expr2.4)
  195.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  196.          end
  197.  
  198.       when SSParm.0 = AYaccExprOr then do
  199.       /* expr -> expr or expr */
  200.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  201.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr2, 2)
  202.          Calc = SSBitOr( Expr0.4, Expr2.4)
  203.          SSRet = SSYaccSetStackParm( AYaccClass, Calc)
  204.          end
  205.  
  206.       when SSParm.0 = AYaccExprNested then do
  207.       /* expr -> ( expr ) */
  208.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr1, 1)
  209.          SSRet = SSYaccSetStackParm( AYaccClass, Expr1.4)
  210.          end
  211.  
  212.       when SSParm.0 = AYaccExprNumber then do
  213.       /* expr -> number */
  214.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  215.          SSRet = SSYaccSetStackParm( AYaccClass, Expr0.4)
  216.          end
  217.  
  218.       when SSParm.0 = AYaccNumberDec then do
  219.       /* number -> dec */
  220.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  221.          SSRet = SSYaccSetStackParm( AYaccClass, Expr0.0)
  222.          end
  223.  
  224.       when SSParm.0 = AYaccNumberOct then do
  225.       /* number -> oct */
  226.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  227.          SSRet = SSYaccSetStackParm( AYaccClass, Expr0.0)
  228.          end
  229.  
  230.       when SSParm.0 = AYaccNumberHex then do
  231.       /* number -> hex */
  232.          SSRet = SSYaccGetStackParmsFromProduction( AYaccClass, Expr0, 0)
  233.          Number = x2d( substr( Expr0.0, 3))
  234.          SSRet = SSYaccSetStackParm( AYaccClass, Number)
  235.          end
  236.  
  237.    end
  238.    return
  239.  
  240. SSCleanup:
  241.    if ALexClassTable = "" then
  242.       call SSLexDestroy ALexClass
  243.    if AYaccClassTable = "" then
  244.       call SSYaccDestroy AYaccClass
  245.    call SSUnloadRexxFunctions
  246.    return
  247.  
  248. SSTerminate:
  249.    say 'Error on line 'sigl': 'SSResult
  250.    call SSCleanup
  251.    exit 1
  252.