预期的主表达式的C ++错误

时间:2012-03-20 22:10:54

标签: c++ compilation

我用我的.cpp代码得到的错误是我无法弄清楚的。我相信它可能是一个错过匹配的支架或什么的,但我不明白。这是代码和错误:

错误:

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
}

请帮助!

1 个答案:

答案 0 :(得分: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 = ' ';  
  }

所以你最后得到一个额外的},这会让一切都变得混乱。