Last active
August 29, 2015 14:04
-
-
Save y-taka-23/fdfa8a309f77e691e09a to your computer and use it in GitHub Desktop.
COBOL による逆ポーランド電卓
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
IDENTIFICATION DIVISION. | |
PROGRAM-ID. RNPCALC. | |
DATA DIVISION. | |
WORKING-STORAGE SECTION. | |
01 STACK-POS PIC 9(2) VALUE 1. | |
01 STACK. | |
03 STACK-DATA PIC 9(4) OCCURS 10 VALUE 0. | |
01 EXPR PIC X(20). | |
01 EXPR-POS PIC 9(2). | |
01 TOKEN PIC X(1). | |
01 OPERAND-1 PIC 9(4). | |
01 OPERAND-2 PIC 9(4). | |
01 TEMP PIC 9(4). | |
01 RESULT PIC Z(4). | |
PROCEDURE DIVISION. | |
*> 主処理 | |
MAIN SECTION. | |
*> 評価すべき式の受け取り | |
DISPLAY "Input: ". | |
ACCEPT EXPR. | |
*> 1 文字ずつ読み込んで評価 | |
MOVE 1 TO EXPR-POS. | |
PERFORM UNTIL EXPR-POS > FUNCTION LENGTH(EXPR) | |
MOVE EXPR(EXPR-POS:EXPR-POS) TO TOKEN | |
IF TOKEN NOT = " " THEN | |
PERFORM EVAL-TOKEN | |
END-IF | |
ADD 1 TO EXPR-POS | |
END-PERFORM. | |
*> 結果表示 | |
PERFORM POP. | |
MOVE TEMP TO RESULT. | |
DISPLAY "Result: " RESULT. | |
STOP RUN. | |
*> TOKEN に格納された文字を評価する | |
EVAL-TOKEN SECTION. | |
IF TOKEN IS NUMERIC THEN | |
*> 数字ならばその値を push | |
MOVE TOKEN TO TEMP | |
PERFORM PUSH | |
ELSE | |
*> スタックの先頭 2 つの値を取り出す | |
PERFORM POP | |
MOVE TEMP TO OPERAND-1 | |
PERFORM POP | |
MOVE TEMP TO OPERAND-2 | |
*> 演算を実行 | |
EVALUATE TOKEN | |
WHEN "+" | |
ADD OPERAND-1 TO OPERAND-2 GIVING TEMP | |
WHEN "-" | |
SUBTRACT OPERAND-1 FROM OPERAND-2 GIVING TEMP | |
WHEN "*" | |
MULTIPLY OPERAND-1 BY OPERAND-2 GIVING TEMP | |
WHEN "/" | |
DIVIDE OPERAND-1 INTO OPERAND-2 GIVING TEMP | |
END-EVALUATE | |
*> 結果をスタックに戻す | |
PERFORM PUSH | |
END-IF. | |
*> TEMP に格納されている値をスタックにプッシュ | |
PUSH SECTION. | |
IF STACK-POS <= 10 THEN | |
MOVE TEMP TO STACK-DATA(STACK-POS) | |
ADD 1 TO STACK-POS | |
END-IF. | |
*> スタックをポップしてその値を TEMP に格納 | |
POP SECTION. | |
IF STACK-POS > 1 THEN | |
SUBTRACT 1 FROM STACK-POS | |
MOVE STACK-DATA(STACK-POS) TO TEMP | |
END-IF. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment