2017-12-15 5 views
0

私は字句解析プログラムで作業していますが、1行のコメントを検出するとすべて正常に動作します。これは私の単一行コメントの検出コードです。C言語での字句解析 - 複数行コメントの検出時にアスタリスクを読み込んで出力する方法は?

マルチラインコメントを検出しようとすると、アスタリスクを検出できない論理エラーが発生します。ここでは複数行コメント検出のための私のコードは次のとおりです。

//Multi-Line Comment 
if((Current_Character == '/') && (fgetc(File_Input) == '*')){ 
    printf ("%c", fgetc(File_Input)); 
    do{ 
     printf ("%c", Current_Character); 
     Current_Character = fgetc(File_Input); 
    }while(Current_Character != '/'); 

    printf("\b | COMMENT\n", Current_Character); 
    i = -1; 
    Lexeme_Count++; 
    Comment_Count++; 
} 

現在の文字は、(fgetc関数であるバックスラッシュと二番目の文字である複数行のコメントのための最初の文字(FILE_INPUT)(最新の次を取得するためでありますファイルから文字)askteriskを開くためである

これは私が入力されたファイルの内容です:。

#include <conio.h> 

{ 

int a[3],t1,t2; 

t1=2; a[0]=1; a[1]=2; a[t1]=3; 

t2= 

- 

(a[2]+t1*6)/(a[2] 

- 

t1); 

if t2>5 then 

print(t2); 

else { 

int t3; 

t3=99; 

t2= 

- 

25; 

print(

- 

t1+t2*t3); // this is a comment on 2 lines 

} endif /* THIS IS A MUTLI-LINE COMMENT ON 2 LINES 
*/ } 

This is my current output

答えて

2

あなたは持っている:printf("%c", '*')またはprintf("*")を(あなたが本当に主張すれば)あなたがputchar('*');かを使用することができるように

if((Current_Character == '/') && (fgetc(File_Input) == '*')){ 
    printf ("%c", fgetc(File_Input)); 
    do{ 
     printf ("%c", Current_Character); 
     Current_Character = fgetc(File_Input); 
    }while(Current_Character != '/'); 

は最初printf()は、あなたが*であることを知っている、fgetc()によって返された文字を印刷する必要があります。あなたが潜んでいる別の問題を持っている

注:

x = a/b; 

あなたのコメントブロックの最初に実行する明確ではないが、それらの両方が分割後bを失います。 Cのコメント検出には他にもたくさんの微妙な点があります。私はあなたにそれらのすべてを教えてくれるのではなく、「Cのコメントを削除するのは難しい作業です」あなたが対処していない問題の1つは、予期しないEOF(ファイルの終わり)です。

int peek(FILE *fp) 
{ 
    int c = fgetc(fp); 
    if (c != EOF) 
     ungetc(c, fp); 
    return c; 
} 
0

あなたが*/を検出するまで、このコードスニペットは、あなたが***/のような結末を持っている特別な場合を考慮し、すべての文字をスキップします:あなたはおそらくそれを消費することなく、次の文字を見てpeek()機能を必要とする

int state = 0; 
while((c = getchar()) != EOF) { 
    switch(state) { 
    case 0: 
     switch(c) { 
     case '*': state = 1; continue; 
     default: /* process as comment char, but ignore */ 
      continue; 
     } /* NOTREACHED */ 
    case 1: 
     switch(c) { 
     case '*': continue; 
     case '/': /* end comment processing and return */ 
      state = 0; 
      return COMMENT; /* or continue, depending on scanner */ 
     default: /* any other char returns to state 0 */ 
      state = 0; 
      /* process comment char */ 
      continue; 
     } /* NOTREACHED */ 
    } /* switch */ 
} /* while */ 
関連する問題