Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 7

*&---------------------------------------------------------------------*

*& Report ZTIND2


*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ztind1 NO STANDARD PAGE HEADING LINE-COUNT 65 LINE-SIZE 255.


INCLUDE ztind1_top.
INCLUDE ztind1_sel.
INCLUDE ztind1_f1.
AT SELECTION-SCREEN ON p_expr.
PERFORM validate_expr.
START-OF-SELECTION.
PERFORM find_length_expr.
DATA: i TYPE i VALUE 0,
j TYPE i.
j = length_string.

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.

"IF p_expr+i(1) EQ '#'.


" length_string = length_string + 1.
IF i = length_string.
EXIT.
ENDIF.

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 '+' OR '-' OR '*' OR '/' OR '%'.


PERFORM operator_precedence_function.
PERFORM push.

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.

WHEN '+' OR '-'.


p_precedence = 1.
WHEN '*' OR '/' OR '%'.
p_precedence = 2.
WHEN '^'.
p_precedence = 3.

ENDCASE.

ENDFORM. "
*&---------------------------------------------------------------------*
*& Form OPERATOR_PRECEDENCE_FUNCTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM operator_precedence_function.

PERFORM string_calc_prec CHANGING precedence.


string_precedence = precedence.
* write: / string_precedence.
DO.
PERFORM stack_calc_prec CHANGING precedence.
stack_precedence = precedence.
IF stack+top(1) NE '#' AND string_precedence <= stack_precedence.
PERFORM pop CHANGING next.
REPLACE SECTION OFFSET cnt LENGTH 1 OF postfix WITH next.
cnt = cnt + 1.
ELSE.
EXIT.
ENDIF.
ENDDO.
ENDFORM. " OPERATOR_PRECEDENCE_FUNCTION
*&---------------------------------------------------------------------*
*& Form STACK_CALC_PREC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_PRECEDENCE text
*----------------------------------------------------------------------*
FORM stack_calc_prec CHANGING p_precedence.
DATA: top1 TYPE i.
top1 = top - 1.
CASE stack+top1(1).
WHEN '('.
p_precedence = 0.

WHEN '+' OR '-'.


p_precedence = 1.
WHEN '*' OR '/' OR '%'.
p_precedence = 2.
WHEN '^'.
p_precedence = 3.
ENDCASE.
ENDFORM. " STACK_CALC_PREC
*&---------------------------------------------------------------------*
*& Form EVAL_POSTFIX
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM eval_postfix.
i = 0.
top = 0.
length_string = STRLEN( postfix ).
DO length_string TIMES.
CASE postfix+i(1).
when '0' OR '1' OR '2' OR '3' OR '4' OR '5' OR '6' OR '7' OR '8' OR '9'.
PERFORM push_post.

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 ' '.

ENDFORM. " POP_POST


*&---------------------------------------------------------------------*
*& Form PUSH_RESULT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form PUSH_RESULT .
REPLACE SECTION OFFSET top LENGTH 1 OF stack WITH var3.
top = top + 1.
endform. " PUSH_RESULT

You might also like