C言語関係掲示板

過去ログ

No.1056 数式を数値、演算子、ピリオド、改行コードと4種類のトークンで判定

[戻る] [ホームページ]
No.13740

数式の判定
投稿者---gammd(2004/04/25 12:06:20)


以下のように作りました。こんな感じのものを、
読み込んだ数式を数値、演算子、ピリオド、改行コードと
4種類のトークンを判定するような関数を作って表示
出来るように拡張させたいのですが、どう作ったらいいんでしょうか?

#include<stdio.h>
#include<string.h>
#define infinity 1

int main(void)
{
    char mozi[50];

    while(infinity){

        printf(">");
        fgets(mozi, sizeof(mozi), stdin);

        mozi[strlen(mozi)-1] = '\0';

        if(!strcmp(mozi, ".")){
            break;
        }else printf("%s\n", mozi);
    }

    return 0;
}




No.13744

Re:数式の判定
投稿者---かずま(2004/04/25 13:59:29)


> 以下のように作りました。こんな感じのものを、
> 読み込んだ数式を数値、演算子、ピリオド、改行コードと
> 4種類のトークンを判定するような関数を作って表示
> 出来るように拡張させたいのですが、どう作ったらいいんでしょうか?

参考になりますか?
#include <stdio.h>
#include <ctype.h>

enum { NUMBER, OPERATOR, PERIOD, NEWLINE };

int token_val;

int get_token(void)
{
    int c;
    while (c = getchar(), isspace(c))
        if (c == '\n') return NEWLINE;
    if (c == EOF) return EOF;
    if (c == '.') return PERIOD;
    if (isdigit(c)) {
        ungetc(c, stdin);
        scanf("%d", &token_val);
        return NUMBER;
    }
    token_val = c;
    return OPERATOR;
}

int main(void)
{
    int token;
    printf("> ");
    while (token = get_token(), token != EOF)
        switch (token) {
        case NUMBER:   printf("NUMBER: %d\n", token_val);   break;
        case OPERATOR: printf("OPERATOR: %c\n", token_val); break;
        case PERIOD:   printf("PERIOD\n");    return 0;
        case NEWLINE:  printf("NEWLINE\n> "); break;
        }
}



No.13745

Re:数式の判定
投稿者---かずま(2004/04/25 14:04:20)


> 参考になりますか?

訂正。main の最後に return 0; を追加してください。


No.13754

Re:数式の判定
投稿者---gammd(2004/04/25 19:27:47)


>> 参考になりますか?
>
>訂正。main の最後に return 0; を追加してください。

かずまさん、ありがとうございます。
いい参考になりました。



No.13803

Re:数式の判定
投稿者---勉強中(2004/04/29 15:11:25)


かずまさん、もう一つ質問があります。
さっきのソースでトークンを空白で区切りたい場合はどうしたらいいの
でしょうか?