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;
}
どういった方法があるのでしょうか。長文ですみませんが、お願いします。