equal
deleted
inserted
replaced
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 { |