初心者です。for文の判定についてお伺いしたいのですが

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ben

初心者です。for文の判定についてお伺いしたいのですが

#1

投稿記事 by ben » 13年前

以下のサイトを参考にfor文の条件判定を
http://masudahp.web.fc2.com/cl/algo/lex01.html
http://masudahp.web.fc2.com/cl/algo/lex02.html

このような形で作成しました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "gettoken.h"

#define true	1
#define false	0

typedef int bool;

char *c_get_token(void)
{
	char    token_1[STR_MAX];
	char    flag = 0;		/* 連続記号用フラグ */

	if(*get_token() == '\0')        /* 1番目のトークン取得 */
		return(token);

	strcpy(token_1, token);         /* token_1に保存 */

	if(*get_token() == '\0')	/* 2番目のトークン取得 */
	{       
		strcpy(token, token_1);
		return(token);
	}

	switch(*token_1)
	{
	case '+':					/* ++, &&, ||, == */
	case '&':
	case '|':
	case '=':
		if(*token_1 == *token)			/* 1番目と2番目が同じ */
                flag = 1;
            break;
	case '<':					/* <=, >=, <<, >> */
	case '>':
		if(*token_1 == *token || *token == '=') /* 同じか=である */
                	flag = 1;
			break;
	case '-':
		if(*token_1 == *token || *token == '>') /* 同じか>である */
			flag = 1;
			break;
	case '!':					/* != */
		if(*token == '=')			/* 2番目が=である */
			flag = 1;
			break;
	case '/':					/*  / *  */
		if(*token == '*')      	 		/* 2番目が*である */
			flag = 1;
			break;
	case '*':					/*  * /  */
		if(*token == '/')			/* 2番目が/である */
			flag = 1;
			break;
	}

	if(flag){
		strcat(token_1, token);			/* トークンの連結 */
		strcpy(token, token_1);			/* tokenに格納 */
	}else
	{
		unget_token(token);			/* 2番目を戻す */
		strcpy(token, token_1);			/* 1番目をtokenに格納 */
	}
	return(token);
}


int main(void)
{
	FILE	*bf;
	char	file[80];		/* ファイル名 */

	printf("ファイル名 : ");	/* プロンプト表示 */
	gets(file);			/* ファイル名入力 */

	 /* ファイルが開けない場合は終了 */
	if((bf = fopen(file, "r")) == NULL)
	{
		printf("ファイルがオープンできない\n");
		return 0;
	}

	while(fgets(gt_line, STR_MAX, bf) != NULL)    /* 1行ずつ読み込み */
	{

		bool	isFor			= false;	// for文を見つけた時のフラグ
		bool	isForBegin		= false;	// for文の最初の'('を見つけた時のフラグ
		int	openKakkoCount		= 0;		// for文の中に複数の'('があるときの対応


		while (1)
		{
			char *token = get_token();

			// 終端記号の判定
			if (token[0] == '\0')
			{
				break;
			}

			// for文を見つけている時
			if (isFor == true)
			{

				// for文を見つけ、必ずある最初の'('を見つけた時
				if (strcmp(token, "(") == 0 && isForBegin == false)
				{
					isForBegin = true;
					openKakkoCount++;
					continue;
				}
				else if (strcmp(token, "(") == 0 && isForBegin == true)
				{
					openKakkoCount++;
				}
				else if (strcmp(token, ")") == 0 && isForBegin == true)
				{
					openKakkoCount--;

					if (openKakkoCount == 0 )
					{
						printf("\n");
						isForBegin	= false;
						isFor		= false;
						continue;
					}
				}
			}

			// for文の'('内にいる時の処理
			if (isForBegin == true)
			{
				printf("(%s)", token);
			}

			// for文かどうかの判定
			if (strcmp(token, "for") == 0 && isFor == false)
			{
				isFor = true;
				printf("for文の判定条件は");
			}
		}
	}

	fclose(bf);         /* ファイルクローズ */

	return 0;
}
そこで、for文の{・・・・・}内の文字列、数列も条件と一緒に出力したいのですが
どういった方法があるのでしょうか。長文ですみませんが、お願いします。

ぬっち
記事: 105
登録日時: 13年前
連絡を取る:

Re: 初心者です。for文の判定についてお伺いしたいのですが

#2

投稿記事 by ぬっち » 13年前

構文解析ってあまりやったことがないのでよくわからないのですが、まず{の時を処理するために、
switch(*token_1)に{の時の処理を追加する。
そして{}内にいるということを表す状態変数を作成する。(isForのようなもの。)
この状態変数が{}内にいるという条件では読み込んだ1行をそのまま出力する。
例えば、

コード:

// for文の'('内にいる時の処理
if (isForBegin == true)
{
      printf("(%s)", token);
}
と似たようなものを{}内にいるという条件に対しても行う。
そして、}を見つけたら、その状態変数を変化させ、現在for文内にはいないことを知らせる。

こんな感じで、いけると思うのですが、どうでしょう。
間違っていたらごめんなさい。。。

閉鎖

“C言語何でも質問掲示板” へ戻る