前提・実現したいこと
C言語で,字句解析プログラムを作成したいのですが,
発生している問題・エラーメッセージ
エラーメッセージがでます。領域改善するのは大体わかるのですが,具体的にどこをどのように直すべきか教えて頂きたいです。
###エラーメッセージ
Abort trao:6
##該当のソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define STR_MAX 256 /* 1行の最大長 */
/* グローバル変数 /
char gt_line[STR_MAX]; / get_token()用の1行データバッファ /
char token[STR_MAX]; / 取得トークン */
//予約語
char *pre[]={
"void",
"char",
"short",
"int",
"long",
"float",
"double",
"auto",
"static",
"const",
"signed",
"unsigned",
"extern",
"volatile",
"register",
"return",
"goto",
"if",
"else",
"switch",
"case",
"default",
"break",
"for",
"while",
"do",
"continue",
"typedef",
"struct",
"enum",
"union",
"sizeof",
"printf",
"scanf",
"sprintf",
"gets",
"puts",
};
/* プロトタイプ宣言 */
char get_token(void); / トークン取りだし */
void jiku(char *); //字句解析関数
char *get_token(void)
{
char *p, *ptk, ch;
p = gt_line; /* ポインタの初期化 */ ptk = token; /* ポインタの初期化 */ while(*p == ' ' || *p == '\t') /* 空白を読み飛ばす */ ++p; if(*p == '\0'){ /* バッファが空 */ token[0] = '\0'; return(token); }
if(isalpha(*p)){
do{
*ptk++ = *p++;
}while(isalnum(*p) && p !='\0'); / 2文字目以降は英数字 /
/ ----- 数字 ----- */
}else if(isdigit(*p)){
do{
*ptk++ = *p++;
}while((isdigit(*p) || *p == '.' || toupper(*p) == 'E') && p !='\0');
/ ----- 文字・文字列定数 ----- */
}else if(*p == ''' || *p == '"'){
ch = *p;
*ptk++ = *p++;
do{
if(p == ''){ / エスケープ文字 */
*ptk++ = *p++;
*ptk++ = *p++;
}else if(p != '\n') / 改行コード無視 */
*ptk++ = *p++;
}while(p != ch);
++p;
/ ----- その他の文字 ----- */
}else
*ptk++ = *p++;
ptk = '\0'; / 文字列終端 /
strcpy(gt_line, p); / 残りの文字列をバッファにコピー */
return(token);
}
//字句解析関数
void jiku(char *token){
int i;
//予約語判定 i=0; while(pre[i]!='\0'){ if(!strcmp(token,pre[i])){ puts("予約語"); /*このままだとさらに名前判定に引っかかるため、 goto文を用いて判定部分の最後まで飛ばす。*/ goto end; } i++; } //演算子判定 if(*token=='+'||*token=='-'||*token=='*'|| *token=='/'||*token=='%'||*token=='<'|| *token=='>'||*token=='<'||*token=='=') puts("演算子"); //区切り子判定 else if(*token=='['||*token==']'||*token=='('|| *token==')'||*token=='{'||*token=='}'|| *token==','||*token==':'||*token==';'|| *token=='='||*token=='#'||*token=='.'|| *token=='\n'||*token=='"') puts("区切り子"); else {//それ以外は数字か名前として処理 if(isdigit(*token)) puts("名前(数字)"); else puts("名前"); } end:;
}
int main(void)
{
FILE *bf; char file[80]; /* ファイル名 */ printf("ファイル名 : "); /* プロンプト表示 */ gets(file); /* ファイル名入力 */ if((bf = fopen(file, "r")) == NULL){ /* ファイルオープン */ printf("ファイルがオープンできない\n"); exit(1); /* 強制終了 */ } puts(""); while(fgets(gt_line, STR_MAX, bf) != NULL){ /* 1行読み込み */ while(1){ get_token(); if(*token == '\0') /* 1行分終了 */ break; if(*token == '\n') printf("(\n)"); /* 改行コード */ else printf("%s ", token); /* 表示 */ //ここで解析を行う jiku(token); } } fclose(bf); /* ファイルクローズ */
}
補足情報(FW/ツールのバージョンなど)
CotEditord,ターミナル使用です
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。