2016-10-02 8 views
0

特定の入力ファイルを解析するこのプログラムで作業していたので、キーワード一覧を除いてほとんどすべてが正しく出力されています。このリストは最後の文字だけが印刷されるのはなぜですか?

キーワードリストと関連機能についてHERESにコードスニペット:持つ

public class Token //Token structure to be added for each Token in the tokenTable 
{ 
    public string value; 
    public string type; 
} 

internal static class Define_input_output 
{ 
    public const string inFile = "input.txt"; //set file to read 
    public const string outFile = "output.txt"; //set file to write to 
} 

public static void placeKeywords_in_keywordsTable(List<string> keywords, List<Token> keywordTable) 
{ 
    Token newToken = new Token(); 

    for (int i = 0; i < keywords.Count; i++) //loop through each keyword 
    { 
     newToken.value = keywords[i]; //add keyword[i] to newToken's value 
     newToken.type = "KW"; //assign "kw" to newToken's type 
     keywordTable.Add(newToken); //push newToken to keywordTable 
    } 
} 

public static void print_Tables_to_outputFile(StreamWriter output, List<Token> keywordTable) 
{ 
    output.Write("\r\n"); 
    output.Write("-".PadRight(21, '-')); 
    output.Write("\r\n"); 
    output.Write(' '); 
    output.Write("Keyword ".PadRight(11)); 
    output.Write("|".PadRight(2)); 
    output.Write("Index"); 
    output.Write("\r\n"); 
    output.Write("-".PadRight(21, '-')); 
    output.Write("\r\n"); 

    for (int i = 0; i < keywordTable.Count; i++) //loop through each element in keywordTable 
    { 
     output.Write(' '); 
     output.Write((keywordTable[i].value).PadRight(10)); 
     output.Write(" |".PadRight(7)); 
     output.Write(i); 
     output.Write("\r\n"); 
    } 
} 

static int Main() 
{ 
    StreamReader input = new StreamReader(Define_input_output.inFile);//input file 
    StreamWriter output = new StreamWriter(Define_input_output.outFile);//output file 

    List<string> keywords = new List<string>() { "else", "if", "int", "return", "void", "while", "+", "-", "*", "/", "<", "<=", ">", ">=", "==", "!=", "=", ";", ",", "(", ")", "[", "]", "{", "}", "/*", "*/" }; 
    List<Token> keywordTable = new List<Token>(); 

    placeKeywords_in_keywordsTable(keywords, keywordTable); //place all the keywords into keywordTable 

    while (!input.EndOfStream) //read each line until end of file 
    { 
     read_inputFile(input, output, keywordTable); 
    } 

    print_Tables_to_outputFile(output, keywordTable); 

    input.Close(); //close input file 
    output.Close(); //close output file 

    return 0; 
} 

問題イムは、この「* /」の文字がキーワードテーブルにプリントアウトされています。そのインデックスは26回(これはリストの中にいくつの文字があるかということから正しい索引量です)。 リストから最後の2文字を削除することでこれをテストし、代わりに「}」文字が26回印刷を開始しました。

私はコードを何回も注意深く見ているので、何が欠けているのか分かりません。問題点がわかりません。 何か助けていただければ幸いです。ありがとう!

keywordTable output image

答えて

4

問題は、あなたのplaceKeywords_in_keywordsTable方法です。 Tokenを一度だけ初期化してから、ループの各反復で更新します。だから、基本的にあなたがして残されているだけに、最後のkeyword

変更:

for (int i = 0; i < keywords.Count; i++) //loop through each keyword 
{ 
    Token newToken = new Token(); 
    newToken.value = keywords[i]; //add keyword[i] to newToken's value 
    newToken.type = "KW"; //assign "kw" to newToken's type 
    keywordTable.Add(newToken); //push newToken to keywordTable 
} 

は、よりよい方法は、初期化のこのフォームを使用することです:

for (int i = 0; i < keywords.Count; i++) //loop through each keyword 
{ 
    Token newToken = new Token 
    { 
     value = keywords[i], 
     type = "KW" 
    }; 
    keywordTable.Add(newToken); //push newToken to keywordTable 
} 

より良いforeachを使用するようになりますループの代わりにループを使用します。for

foreach(var i in keywords) 
{ 
    Token newToken = new Token 
    { 
     value = i, 
     type = "KW" 
    }; 
    keywordTable.Add(newToken); 
} 

そしてlinqを使ってそれをしたい場合:

keywordTable = keywords.Select(item => new Token { value = item, type = "KW" }).ToList(); 
+0

AWESOME!ありがとうございます – masterofcatastrophe

+0

@masterofcatastrophe - あなたは歓迎です:) –

+1

確かに、私はちょうどタイマーを待っている笑 – masterofcatastrophe

関連する問題