2012-03-20 7 views
0

私の知り得ない.cppコードでエラーが発生しています。私はそれがおそらく不一致のブラケットか何かであると信じていますが、私はそれを見ません。ここでは、コードとエラーは次のとおりです。期待されるプライマリ式を持つC++エラー

エラー:

C:\Users\Tyler\Desktop\Program 2\p2.cpp:202: error: expected primary-expression before "else" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:202: error: expected `;' before "else" 

C:\Users\Tyler\Desktop\Program 2\p2.cpp:222: error: expected `while' before '(' token 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:223: error: expected `;' before '{' token 

C:\Users\Tyler\Desktop\Program 2\p2.cpp:236: error: expected primary-expression before "else" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:236: error: expected `;' before "else" 

C:\Users\Tyler\Desktop\Program 2\p2.cpp: At global scope: 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:250: error: expected unqualified-id before "while" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:250: error: expected `,' or `;' before "while" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:251: error: expected unqualified-id before "return" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:251: error: expected `,' or `;' before "return" 
C:\Users\Tyler\Desktop\Program 2\p2.cpp:252: error: expected declaration before '}' token 

コード:

int main() 
{ 
    Stack s; //variable declarations 
    StackItem *newItem; 
    char token, nextChar, prevChar, response, check; 
    int lineCount, apostCount; 
    char filename[50]; 
    bool insideComment = false, insideString = false, error, isMatch, delimError = false; 
    fstream sourceFile; 

    do //do while response is y 
    { 
     do //do while opening the source file fails 
     { 
     cout << "Enter filename of source file: "; 
     cin.getline (filename,51); 
     sourceFile.open(filename); //opens the file with given filename 
     if (sourceFile.fail()) 
      cout << "File could not be opened" << endl; //error if can't open 
     sourceFile.clear(); 
     } 
     while (sourceFile.fail()); //exits if source file doesn't fail 

     sourceFile.clear(); 
     lineCount = 0; //initializes line count to zero 

     while (!sourceFile.eof()) //exits if end of source file is reached 
     { 
     sourceFile.get(nextChar); //gets the next character in file 

     if (!sourceFile.eof()) //if not the end of source file 
     { 
      if ((int)nextChar == '\n') //if next character is an end line 
      { 
       lineCount++; //increments line count 
       cout << "Line count: " << lineCount << endl; //echoes line count 
      } 

      else if (nextChar == '{' || nextChar == '[' || nextChar == '(') 
      { //continues if next char is an opening token 
       newItem->token = nextChar; //sets newItem's token 
       newItem->lineNumber = lineCount; //sets newItem's line count 
       if (!s.isFull()) //continues if stack isn't full 
        s.push(newItem); //pushes newItem onto the stack 
       s.displayStack(); //displays the stack 
      } 

      else if (nextChar == '}' || nextChar == ']' || nextChar == ')') 
      { //continues if next char is a closing token 
       if (!s.isEmpty()) //continues if stack isn't empty 
       { 
        isMatch = s.matchStack(nextChar); //checks if token matches top 

        if (isMatch == true) //if true, pops the top of the stack 
        s.pop(); 

        else //continues if match is false 
        { 
        newItem->token = nextChar; //sets newItem's token 
        newItem->lineNumber = lineCount; //sets newITem's line count 
        s.trailingItem(newItem); //calls the trailingItem function 
        cout << endl << endl << "Process another file? (y/n): "; 
        cin >> response; //asks user whether to continue 

        while (response != 'y' && response != 'n') //checks for input error 
        { 
         cout << "Error! Must enter either y for yes or n for no." << endl; 
         cout << endl << endl << "Process another file? (y/n): "; 
         cin >> response; 
        } 
        break; //leaves the while loop 
        } 
       } 

       else if (s.isEmpty()) //continues if stack is empty 
       { 
        newItem->token = nextChar; //sets newItem's token 
        newItem->lineNumber = lineCount; //sets newItem's line count 
        s.push(newItem); //pushes newItem onto the top of the stack 
        s.processStack(); //processes the error 
        cout << endl << endl << "Process another file? (y/n): "; 
        cin >> response; //asks user whether to continue 

        while (response != 'y' && response != 'n') //checks for input error 
        { 
        cout << "Error! Must enter either y for yes or n for no." << endl; 
        cout << endl << endl << "Process another file? (y/n): "; 
        cin >> response; //gets user input 
        } 

        break; //leaves the while loop 
       } 

       s.displayStack(); //displays the items on the stack 
      } 

      else if (nextChar == '/') //continues if next char is a/
      { 
       sourceFile.get(nextChar); //gets the next character in file 

       if (nextChar == '*') //continues if next char is a * 
       { //at this point a comment has started because of/then * 
        insideComment = true; //sets bool to true 
        newItem->token = 'c'; //sets newItem's token to c for "comment" 
        newItem->lineNumber = lineCount; //sets newItem's line count 
        s.push(newItem); //pushes the item onto the stack 

        while (insideComment == true && !sourceFile.eof()) 
        { //continues while inside a comment and end of file isn't reached 
        sourceFile.get(nextChar); //gets the next character in file 

        if (nextChar == '*') //continues if next char is * 
        { 
         sourceFile.get(nextChar); //gets the next character in file 

         if (nextChar == '/') //continues if next char is/
         { //at this point the comment has ended because of * then/
          insideComment = false; //sets bool to false 
          s.pop(); //pops off the c in the stack 
         } 
        } 
        } 
       } 

       else if (nextChar == '/') //continues if next char is a/
       { //at this point a comment has started because of/then another/
        insideComment = true; //sets bool to true 

        while (insideComment == true && !sourceFile.eof()) 
        { //continues while inside a comment and not at end of file 
        sourceFile.get(nextChar); //gets the next character in file 

        if (nextChar == '\n') //leaves comment if next line is entered 
         insideComment = false; //sets bool to false 
        } 
       } 
      } 

      else if (nextChar == '\n') //continues if next char is an end line 
      { 
       lineCount++; //increments line count 
       cout << "Line count: " << lineCount << endl; //echoes line count 
      } 

      else if (nextChar == '\"' && insideComment == false) 
      { //continues if next char is a " and is not currently inside a comment 
       insideString = true; //sets bool to true b/c " starts a string 

       while (insideString == true && !sourceFile.eof()) 
       { 
        sourceFile.get(nextChar); //gets the next character in file 

        if (nextChar == '\"') 
        insideString = false; 

        else if (nextChar == '\n') 
        { 
        lineCount++; //increments line count 
        cout << "Line count: " << lineCount << endl; //echoes line count 
        } 
       } 
      } 

      else if (nextChar == '\'' && insideComment == false && insideString == false) 
      { //continues if next char is a ' and not in a comment or string 
       apostCount = 1; //initializes apostrophe count (chars after first apostrophe) 

       while (nextChar != '\'' && !sourceFile.eof()) 
       { //continues while next char isn't another ' and not end of file 
        sourceFile.get(nextChar); //gets the next character in file 
        apostCount++; //increments apostrophe count 

        if (nextChar == '\\') //continues if next char is a \ 
        { 
        sourceFile.get(nextChar); //gets the next character in file 
        apostCount++; //increments apostrophe count 

        if (nextChar == '\'' && apostCount <= 3) //must be less than/= 3 spaces 
         nextChar = ' '; //sets next char to space if another apostrophe 
        } 

        else if (nextChar == '\n') //continues if next char is an end line 
        { 
        lineCount++; //increments line count 
        cout << "Line count: " << lineCount << endl; //echoes line count 
        } 
       } 

       if (apostCount >= 4) //if more than 3 chars come after apostrophe 
       { //displays delimeter error 
        cout << "Character delimeter error on line " << lineCount << endl; 
        delimError = true; 
        break; //leaves while loop after displaying error 
       } 

       if (delimError == true) //continues if delimiter error occured 
        break; //leaves 2nd while loop 
      } 
     } 
     } //end of while loop 

     if (s.isEmpty() == false) //continues if no errors within stack 
     { //displays successful nesting structure to user 
     cout << "Source file of " << lineCount << " lines has proper nesting structure"; 
     cout << endl << endl << "Process another file? (y/n): "; //asks to continue 
     cin >> response; //gets user's response 

     while (response != 'y' && response != 'n') //checks for input error 
      { 
       cout << "Error! Must enter either y for yes or n for no." << endl; 
       cout << endl << endl << "Process another file? (y/n): "; 
       cin >> response; //gets user input 
      } 
     } 

     else //continues if errors are present 
     { 
     s.processStack(); //processes and displays the delimiter errors 
     cout << endl << endl << "Process another file? (y/n): "; //asks to continue 
     cin >> response; //gets user's response 

     while (response != 'y' && response != 'n') //checks for input error 
     { 
      cout << "Error! Must enter either y for yes or n for no." << endl; 
      cout << endl << endl << "Process another file? (y/n): "; 
      cin >> response; //gets user input 
     } 
     } 
    } 
    while (response == 'y'); //opens another file if user entered y for yes 
    return 0; //quits program 
} 

助けてください!ここで

+4

これはStack Overflowの問題の**ロット**のコードです。これを[最小限のテストケース](http://sscce.org)に減らすことを検討してください。関連する行(例:202行目)にコメントを付けることで、少なくとも私たちを助けてください。 –

+0

男の子、あなた本当に*真剣にコメントを取る! (残念なことに、 'sourceFile.clear()'のように実際に*面白い*のコードはコメントがありません!) –

+1

Kerrekのポイントを拡張します。 「boolをfalseに設定する」などのコメントは画面スペースを占有するだけであり、対応するコードからはっきりしないものは何も表示しないため、有用ではありません。 –

答えて

7

if (nextChar == '\\') //continues if next char is a \ 

末尾\は、次のいずれかで現在の行の継続をマークします。

次の行は{です。

したがって、この状態の直後の{は、コメントの一部とみなされます。

スニペット:

if (nextChar == '\\') //continues if next char is a \ 
{ 
     sourceFile.get(nextChar); //gets the next character in file 
     apostCount++; //increments apostrophe count 

     if (nextChar == '\'' && apostCount <= 3) //must be less than/= 3 spaces 
      nextChar = ' '; //sets next char to space if another apostrophe 
    } 

は、あなたがすべてを台無しにされ、末尾に余分な}を取得

if (nextChar == '\\') 
     sourceFile.get(nextChar); 
     apostCount++; 

     if (nextChar == '\'' && apostCount <= 3) 
      nextChar = ' '; 
    } 

としてコンパイラによって見られています。

+0

ありがとうございます!しかし、今私はsegFaultエラーが発生しています:STATUS_ACCESS_VIOLATION –

+0

@TylerGavinは更新されたコードで新しい質問をします。 –

+0

ああ、ちょっと、これは私の問題に関連しているのだろうか? –

関連する問題