Skip to content

Instantly share code, notes, and snippets.

@y-taka-23
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save y-taka-23/fdfa8a309f77e691e09a to your computer and use it in GitHub Desktop.
Save y-taka-23/fdfa8a309f77e691e09a to your computer and use it in GitHub Desktop.
COBOL による逆ポーランド電卓
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