トップC-Tips > 数式の字句解析

数式の字句解析[2012.09.15]

1.対象とする数式

(123 + 45.23) * 10 / 2.5 のように、四則演算記号 +, -, *, / とかっこ ( ) と数値だけからなる式を対象とする。 空白文字(スペース、タブ)は無視する。

C言語の場合、strtod関数を使えば、数値の末尾を検出できるため、 次のような簡単なプログラムで数式の字句解析が行える。 また、printf文で %.*s の書式を使えば、指定した文字数だけ文字を切り出せる。

このように、標準ライブラリ関数を使いこなすことにより、 シンプルなプログラムが書けるようになる。 strtod関数はポインタを持つC言語ならではの関数の一つである。

lexer01.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
    char buf[256], *p, *end;
    printf("式: ");
    fgets(buf, sizeof(buf), stdin);
    for (p = buf; *p != '\0'; ) {
	if (*p <= ' ') {
	    p++;    // 空白文字は無視する
	} else if (isdigit(*p)) {
	    strtod(p, &end);
	    printf("%.*s\n", end-p, p);
	    p = end;
	} else {   // 演算子, (, または )
	    printf("%c\n", *p++);
	}
    }
}

実行例を下に示す。

c:\mh\www\c-tips\c>lexer01
式: 234 +(23.6 * 4)
234
+
(
23.6
*
4
)