C言語-インタプリタminiBASIC
前へ 目次へ 次へ 

 10. 演算子の追加

 条件判定式で比較演算子(=,<>,<,>,<=,>=)が必要になる。例えば、1=1は真であり、1=2は偽である。C言語同様に偽を0と定義すれば、1=2は0という計算結果になる。偽(0)以外は真であるが、ここでは真を1とする。したがって、1=1は1という計算結果になる。

条件判定式
    式1 比較演算子 式2

 式1と式2を比較演算子にしたがって判定し、真のときは1、偽のときは0の計算結果になる。

比較演算子
= 等しい
<> 等しくない
< より大きい
> より小さい
<= 以下
>= 以上
double logic(void)
{
    式1の計算結果を得る
    次のトークン(比較演算子)取得
    永久ループ
        if トークンが < である
            次のトークン取得
            if トークンが = である
                次のトークン取得
                式2の計算結果を得る
                if 式1は式2以上
                    答えを1に設定
                else
                    答えを0に設定
            else if トークンが > である
                次のトークン取得
                式2の計算結果を得る
                if 式1は式2と等しくない
                    答えを1に設定
                else
                    答えを0に設定
            else
                式2の計算結果を得る
                if 式1は式2より大きい
                    答えを1に設定
                else
                    答えを0に設定
        else if トークンが > である
                …
                …
    答えを返す
}
[eval2.c] → download eval2.c
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:

90:
91:
92:

110:
111:
112:

127:
128:
129:

149:
150:
151:

154:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "gettoken.h"       /* gettoken.c */
/* 関数プロトタイプ宣言 */
double logic(void);             /* 論理式     */
double expression(void);        /* 式         */
double term(void);              /* 項         */
double factor(void);            /* 因子       */
double number(void);            /* 数値・変数 */
void errorx(char *, char *);    /* エラー終了 */>
/* グローバル変数 外部参照 */
extern double  hensuu[26];      /* 変数用 A - Z */

double logic(void)
{
    double  ans;

    ans = expression();
    get_token();
    while(1){
        if(*token == '<'){          /* <>,<=,< */
            get_token();
            if(*token == '='){          /* 以下 */
                get_token();
                if(ans <= expression())
                    ans = 1;
                else
                    ans = 0;
            }else if(*token == '>'){    /* 等しくない */
                get_token();
                if(ans != expression())
                    ans = 1;
                else
                    ans = 0;
            }else{                      /* より小さい */
                if(ans < expression())
                    ans = 1;
                else
                    ans = 0;
            }
        }else if(*token == '>'){    /* >=,> */
            get_token();
            if(*token == '='){          /* 以上 */
                get_token();
                if(ans >= expression())
                    ans = 1;
                else
                    ans = 0;
            }else{                      /* より大きい */
                if(ans > expression())
                    ans = 1;
                else
                    ans = 0;
            }
        }else if(*token == '='){    /* 等しい */
            get_token();
            if(ans == expression())
                ans = 1;
            else
                ans = 0;
        }else
            break;
    }
    unget_token(token);
    return(ans);
}
double expression(void)
{
<<省 略>>
}
double term(void)
{
<<省 略>>
}
double factor(void)
{
<<省 略>>
}
double number(void)
{
<<省 略>>
}
void errorx(char *s1, char *s2)
{
<<省 略>>
}

 メインプログラムmbas09.cとサブプログラムmb_cmds5.cの関数expression()をすべてlogic()に変更する。

reidai07.mb
INPUT "Data1 = ",A
INPUT "Data2 = ",B
X = A = B
PRINT "A = B =  "; X
X = A <> B
PRINT "B <> B = "; X
X = A > B
PRINT "A > B =  "; X
X = A >= B
PRINT "A >= B = "; X
X = A < B
PRINT "A < B =  "; X
X = A <= B
PRINT "A <= B = "; X
END

 実行結果にmakeの結果を示していないがmakefileのeval.cとeval.objをeval2.c、eval2.objに変更してメイクする。

実行結果
D:\Data\src>mbas reidai07.mb
Data1 = 321
Data2 = 123
A = B =  0.000000
A <> B = 1.000000
A > B =  1.000000
A >= B = 1.000000
A < B =  0.000000
A <= B = 0.000000
終了します
D:\Data\src>mbas reidai07.mb
Data1 = 123
Data2 = 321
A = B =  0.000000
A <> B = 1.000000
A > B =  0.000000
A >= B = 0.000000
A < B =  1.000000
A <= B = 1.000000
終了します
D:\Data\src>mbas reidai07.mb
Data1 = 123
Data2 = 123
A = B =  1.000000
A <> B = 0.000000
A > B =  0.000000
A >= B = 1.000000
A < B =  0.000000
A <= B = 1.000000
終了します


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system