Professional Documents
Culture Documents
Ds 1
Ds 1
DO.
IF i = j.
EXIT.
ENDIF.
WRITE: / p_expr+i(1).
i = i + 1.
ENDDO.
WRITE: / 'checking'.
DATA: next(1),
cnt TYPE i,
postfix(100),
stack(100),
top TYPE i VALUE 0,
precedence TYPE i,
string_precedence TYPE i,
stack_precedence TYPE i,
var1(1),
var2(1),
var3(2).
"stack+top(1) = '#'.
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH '#'.
REPLACE SECTION OFFSET length_string LENGTH 1 OF p_expr WITH '#'.
"p_expr+length_string(1) = '#'.
*
*replace
*
i = 0.
cnt = 0.
DO.
CASE p_expr+i(1).
WHEN '('.
PERFORM push.
WHEN ')'.
DO.
PERFORM pop CHANGING next.
IF next = '('.
EXIT.
ELSE.
REPLACE SECTION OFFSET cnt LENGTH 1 OF postfix WITH next.
cnt = cnt + 1.
ENDIF.
"postfix+cnt(1) = next.
ENDDO.
WHEN '0' OR '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8' OR '9'.
REPLACE SECTION OFFSET cnt LENGTH 1 OF postfix WITH p_expr+i(1).
cnt = cnt + 1.
ENDCASE.
i = i + 1.
ENDDO.
"REPLACE SECTION OFFSET cnt LENGTH 1 OF postfix WITH '#'.
WRITE: / stack.
WRITE:/ 'postfix expression'.
WRITE:/ postfix.
PERFORM eval_postfix.
data: result(2).
perform pop changing result.
write: / ' the result is:'.
write: result.
*&---------------------------------------------------------------------*
*& Form PUSH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM push .
"top = top + 1.
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH p_expr+i(1).
top = top + 1.
"stack+top(1) = p_expr+i(1).
ENDFORM. " PUSH
*&---------------------------------------------------------------------*
*& Form POP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_NEXT text
*----------------------------------------------------------------------*
FORM pop CHANGING p_next TYPE c.
IF top = 0.
MESSAGE: 'Stack UnderFlow' TYPE 'E'.
ELSE.
top = top - 1.
p_next = stack+top(1).
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH ' '.
ENDIF.
ENDFORM. " POP
*&---------------------------------------------------------------------*
*& Form CALC_PREC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_EXPR+I(1) text
* <--P_PRECEDENCE text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form STRING_CALC_PREC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_PRECEDENCE text
*----------------------------------------------------------------------*
FORM string_calc_prec CHANGING p_precedence TYPE i.
CASE p_expr+i(1).
WHEN '('.
p_precedence = 0.
ENDCASE.
ENDFORM. "
*&---------------------------------------------------------------------*
*& Form OPERATOR_PRECEDENCE_FUNCTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM operator_precedence_function.
WHEN '+'.
PERFORM pop_post CHANGING var1.
PERFORM pop_post CHANGING var2.
var3 = var2 + var1.
perform push_result.
WHEN '-'.
PERFORM pop_post CHANGING var1.
PERFORM pop_post CHANGING var2.
var3 = var2 - var1.
perform push_result.
WHEN '*'.
PERFORM pop_post CHANGING var1.
PERFORM pop_post CHANGING var2.
var3 = var2 * var1.
perform push_result.
WHEN '/'.
PERFORM pop_post CHANGING var1.
PERFORM pop_post CHANGING var2.
var3 = var2 / var1.
perform push_result.
* WHEN '%'.
* PERFORM pop_post CHANGING var1.
* PERFORM pop_post CHANGING var2.
* var3 = var2 % var1.
WHEN '^'.
PERFORM pop_post CHANGING var1.
PERFORM pop_post CHANGING var2.
var3 = var2 ** var1.
perform push_result.
ENDCASE.
i = i + 1.
ENDDO.
ENDFORM. " EVAL_POSTFIX
*&---------------------------------------------------------------------*
*& Form PUSH_POST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM push_post .
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH postfix+i(1).
top = top + 1.
ENDFORM. " PUSH_POST
*&---------------------------------------------------------------------*
*& Form POP_POST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_VAR1 text
*----------------------------------------------------------------------*
FORM pop_post CHANGING p_var1.
top = top - 1.
p_var1 = stack+top(1).
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH ' '.