tools/linguist/lupdate/java.cpp
changeset 33 3e2da88830cd
parent 18 2f34d5167611
child 37 758a864f9613
equal deleted inserted replaced
30:5dc02b23752f 33:3e2da88830cd
    49 #include <QtCore/QStack>
    49 #include <QtCore/QStack>
    50 #include <QtCore/QStack>
    50 #include <QtCore/QStack>
    51 #include <QtCore/QString>
    51 #include <QtCore/QString>
    52 #include <QtCore/QTextCodec>
    52 #include <QtCore/QTextCodec>
    53 
    53 
       
    54 #include <iostream>
       
    55 
    54 #include <ctype.h>
    56 #include <ctype.h>
    55 
    57 
    56 QT_BEGIN_NAMESPACE
    58 QT_BEGIN_NAMESPACE
    57 
    59 
    58 enum { Tok_Eof, Tok_class, Tok_return, Tok_tr,
    60 enum { Tok_Eof, Tok_class, Tok_return, Tok_tr,
   104 
   106 
   105 // The parser maintains the following global variables.
   107 // The parser maintains the following global variables.
   106 static QString yyPackage;
   108 static QString yyPackage;
   107 static QStack<Scope*> yyScope;
   109 static QStack<Scope*> yyScope;
   108 static QString yyDefaultContext;
   110 static QString yyDefaultContext;
       
   111 
       
   112 std::ostream &yyMsg(int line = 0)
       
   113 {
       
   114     return std::cerr << qPrintable(yyFileName) << ':' << (line ? line : yyLineNo) << ": ";
       
   115 }
   109 
   116 
   110 static QChar getChar()
   117 static QChar getChar()
   111 {
   118 {
   112     if (yyInPos >= yyInStr.size())
   119     if (yyInPos >= yyInStr.size())
   113         return EOF;
   120         return EOF;
   187                     bool metAsterSlash = false;
   194                     bool metAsterSlash = false;
   188 
   195 
   189                     while ( !metAsterSlash ) {
   196                     while ( !metAsterSlash ) {
   190                         yyCh = getChar();
   197                         yyCh = getChar();
   191                         if ( yyCh == EOF ) {
   198                         if ( yyCh == EOF ) {
   192                             qFatal( "%s: Unterminated Java comment starting at"
   199                             yyMsg() << "Unterminated Java comment.\n";
   193                                     " line %d\n",
       
   194                                     qPrintable(yyFileName), yyLineNo );
       
   195 
       
   196                             return Tok_Comment;
   200                             return Tok_Comment;
   197                         }
   201                         }
   198 
   202 
   199                         yyComment.append( yyCh );
   203                         yyComment.append( yyCh );
   200 
   204 
   226                                     unicode += yyCh.digitValue();
   230                                     unicode += yyCh.digitValue();
   227                                 }
   231                                 }
   228                                 else {
   232                                 else {
   229                                     int sub(yyCh.toLower().toAscii() - 87);
   233                                     int sub(yyCh.toLower().toAscii() - 87);
   230                                     if( sub > 15 || sub < 10) {
   234                                     if( sub > 15 || sub < 10) {
   231                                         qFatal( "%s:%d: Invalid Unicode",
   235                                         yyMsg() << "Invalid Unicode value.\n";
   232                                             qPrintable(yyFileName), yyLineNo );
   236                                         break;
   233                                     }
   237                                     }
   234                                     unicode += sub;
   238                                     unicode += sub;
   235                                 }
   239                                 }
   236                                 yyCh = getChar();
   240                                 yyCh = getChar();
   237                             }
   241                             }
   249                         yyCh = getChar();
   253                         yyCh = getChar();
   250                     }
   254                     }
   251                 }
   255                 }
   252 
   256 
   253                 if ( yyCh != QLatin1Char('"') )
   257                 if ( yyCh != QLatin1Char('"') )
   254                     qFatal( "%s:%d: Unterminated string",
   258                     yyMsg() << "Unterminated string.\n";
   255                         qPrintable(yyFileName), yyLineNo );
       
   256 
   259 
   257                 yyCh = getChar();
   260                 yyCh = getChar();
   258 
   261 
   259                 return Tok_String;
   262                 return Tok_String;
   260 
   263 
   363     while ( yyTok == Tok_Plus ) {
   366     while ( yyTok == Tok_Plus ) {
   364         yyTok = getToken();
   367         yyTok = getToken();
   365         if (yyTok == Tok_String)
   368         if (yyTok == Tok_String)
   366             s += yyString;
   369             s += yyString;
   367         else {
   370         else {
   368             qWarning( "%s:%d: String used in translation can only contain strings"
   371             yyMsg() << "String used in translation can contain only literals"
   369                 " concatenated with other strings, not expressions or numbers.",
   372                        " concatenated with other literals, not expressions or numbers.\n";
   370                 qPrintable(yyFileName), yyLineNo );
       
   371             return false;
   373             return false;
   372         }
   374         }
   373         yyTok = getToken();
   375         yyTok = getToken();
   374     }
   376     }
   375     return true;
   377     return true;
   473             yyTok = getToken();
   475             yyTok = getToken();
   474             if(yyTok == Tok_Ident) {
   476             if(yyTok == Tok_Ident) {
   475                 yyScope.push(new Scope(yyIdent, Scope::Clazz, yyLineNo));
   477                 yyScope.push(new Scope(yyIdent, Scope::Clazz, yyLineNo));
   476             }
   478             }
   477             else {
   479             else {
   478                 qFatal( "%s:%d: Class must be followed by a classname",
   480                 yyMsg() << "'class' must be followed by a class name.\n";
   479                                           qPrintable(yyFileName), yyLineNo );
   481                 break;
   480             }
   482             }
   481             while (!match(Tok_LeftBrace)) {
   483             while (!match(Tok_LeftBrace)) {
   482                 yyTok = getToken();
   484                 yyTok = getToken();
   483             }
   485             }
   484             break;
   486             break;
   545             yyTok = getToken();
   547             yyTok = getToken();
   546             break;
   548             break;
   547 
   549 
   548         case Tok_RightBrace:
   550         case Tok_RightBrace:
   549             if ( yyScope.isEmpty() ) {
   551             if ( yyScope.isEmpty() ) {
   550                 qFatal( "%s:%d: Unbalanced right brace in Java code\n",
   552                 yyMsg() << "Excess closing brace.\n";
   551                         qPrintable(yyFileName), yyLineNo );
       
   552             }
   553             }
   553             else
   554             else
   554                 delete (yyScope.pop());
   555                 delete (yyScope.pop());
   555             extracomment.clear();
   556             extracomment.clear();
   556             yyTok = getToken();
   557             yyTok = getToken();
   575                         break;
   576                         break;
   576                     case Tok_Dot:
   577                     case Tok_Dot:
   577                         yyPackage.append(QLatin1String("."));
   578                         yyPackage.append(QLatin1String("."));
   578                         break;
   579                         break;
   579                     default:
   580                     default:
   580                          qFatal( "%s:%d: Package keyword should be followed by com.package.name;",
   581                          yyMsg() << "'package' must be followed by package name.\n";
   581                                           qPrintable(yyFileName), yyLineNo );
       
   582                          break;
   582                          break;
   583                 }
   583                 }
   584                 yyTok = getToken();
   584                 yyTok = getToken();
   585             }
   585             }
   586             break;
   586             break;
   589             yyTok = getToken();
   589             yyTok = getToken();
   590         }
   590         }
   591     }
   591     }
   592 
   592 
   593     if ( !yyScope.isEmpty() )
   593     if ( !yyScope.isEmpty() )
   594         qFatal( "%s:%d: Unbalanced braces in Java code\n",
   594         yyMsg(yyScope.top()->line) << "Unbalanced opening brace.\n";
   595                  qPrintable(yyFileName), yyScope.top()->line );
       
   596     else if ( yyParenDepth != 0 )
   595     else if ( yyParenDepth != 0 )
   597         qFatal( "%s:%d: Unbalanced parentheses in Java code\n",
   596         yyMsg(yyParenLineNo) << "Unbalanced opening parenthesis.\n";
   598                  qPrintable(yyFileName), yyParenLineNo );
       
   599 }
   597 }
   600 
   598 
   601 
   599 
   602 bool loadJava(Translator &translator, const QString &filename, ConversionData &cd)
   600 bool loadJava(Translator &translator, const QString &filename, ConversionData &cd)
   603 {
   601 {