/**************************************************************************** ** $Id$ ** ** Lexical analyzer for meta object compiler ** ** Created : 930417 ** ** Copyright (C) 1992-2001 Trolltech AS. All rights reserved. ** ** This file is part of the Qt GUI Toolkit. ** ** This file may be distributed under the terms of the Q Public License ** as defined by Trolltech AS of Norway and appearing in the file ** LICENSE.QPL included in the packaging of this file. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition ** licenses may use this file in accordance with the Qt Commercial License ** Agreement provided with the Software. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for ** information about Qt Commercial License Agreements. ** See http://www.trolltech.com/qpl/ for QPL licensing information. ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** *****************************************************************************/ %{ #ifdef MOC_YACC_CODE #ifdef MOC_MWERKS_PLUGIN #ifdef Q_OS_MAC9 # define isascii(c) ((int)( (unsigned int) (c) <= (unsigned char)0x7F )) #endif const char *buf_buffer = NULL; long buf_size_total = 0, buf_index = 0; #define YY_INPUT(buf, result, max_size) \ { \ if(buf_index < buf_size_total ) { \ while(!isascii(buf_buffer[buf_index])) buf_index++; \ int ms = ((max_size < buf_size_total) ? max_size : buf_size_total); \ for(result = 0; result < ms; result++) { \ char c = buf_buffer[buf_index + result]; \ if(!isascii(c)) { \ buf_index++; \ break; \ } \ buf[result] = c == '\r' ? '\n' : c; \ } \ buf_index += result; \ } else result = YY_NULL; \ } #endif #include "qstring.h" #define input yyinput // yyinput in C++ #define X if(lexDebug){fprintf(stderr,"LEX (%i) : %s\n",lineNo,yytext);}; #define Y if(lexDebug){fprintf(stderr,"LEX (%i) : %s\n",lineNo,yytext);}; /* #define Y if(lexDebug){fprintf(stderr,"LEX (%i) : %s updates level to %i\n"\ ,lineNo,yytext,templLevel);}; */ #define Z if(lexDebug){fprintf(stderr,"LEX (%i) : skipped the string %s\"\n"\ ,lineNo,yytext);}; #define BEGIN_INSIDE #define linput() \ ( (c = input()) == '\n' ? (lineNo++, c) : (c == EOF) ? 0 : c ) #include #include int classPLevel = 1; /* Depth of nested curly braces in IN_CLASS */ int namespacePLevel = 1; /* Depth of nested curly braces in IN_NAMESPACE */ int expLevel = 1; /* Depth of nested parentheses in IN_EXPR */ int enumLevel = 1; /* Depth of nested parentheses in IN_ENUM */ int fctLevel = 1; /* Depth of nested parentheses in IN_FCT */ int templLevel = 1; /* Depth of levels in IN_TEMPL_ARGS */ int lastState = 0; /* Remembers the state when a MOC_SKIP_BEGIN is encountered */ int skipLevel = 0; /* Depth of MOC_SKIP_BEGINs */ class QString; extern void addExpressionChar( const char ); extern void addExpressionString( const char * ); extern void moc_warn( const char *msg ); %} %start OUTSIDE QT_DEF IN_CLASS IN_NAMESPACE IN_ENUM IN_EXPR IN_DEF_ARG IN_FCT IN_TEMPL_ARGS GIMME_SEMICOLON SKIP IN_PROPERTY IN_CLASSINFO ALMOSTSTRING \"([^"\n\\]|\\(.|\n))* STRING {ALMOSTSTRING}\" %% "class" { X; BEGIN QT_DEF; return CLASS; } "namespace" { X; BEGIN QT_DEF; return NAMESPACE; } "using" { X; BEGIN QT_DEF; return USING; } "template" { X; BEGIN QT_DEF; return TEMPLATE; } "Q_OBJECT" { X; return Q_OBJECT; } "signals" { X; return SIGNALS; } "slots" { X; return SLOTS; } "Q_CLASSINFO" { X; return Q_CLASSINFO; } "Q_PROPERTY" { X; return Q_PROPERTY; } "Q_OVERRIDE" { X; return Q_OVERRIDE; } "Q_ENUMS" { X; return Q_ENUMS; } "Q_SETS" { X; return Q_SETS; } "{" { fctLevel++;Y; } "}" { fctLevel--;Y;if (fctLevel==0){X;return '}';}} "{" { classPLevel++;Y; } "}" { classPLevel--;Y;if (classPLevel == 0) {X;return '}';} } "public" { X;if( classPLevel == 1 ) return PUBLIC; } "protected" { X;if( classPLevel == 1 ) return PROTECTED; } "private" { X;if( classPLevel == 1 ) return PRIVATE; } "signals" { X;if( classPLevel == 1 ) return SIGNALS; } "slots" { X;if( classPLevel == 1 ) return SLOTS; } "Q_CLASSINFO" { X;if( classPLevel == 1 ) return Q_CLASSINFO; } "Q_OBJECT" { X; if ( classPLevel == 1 ) return Q_OBJECT; else if ( classPLevel > 1 ) moc_warn( "Cannot use Q_OBJECT in nested class." ); } "Q_PROPERTY" { X;if( classPLevel == 1 ) return Q_PROPERTY; } "Q_OVERRIDE" { X;if( classPLevel == 1 ) return Q_OVERRIDE; } "Q_ENUMS" { X;if( classPLevel == 1 ) return Q_ENUMS; } "Q_SETS" { X;if( classPLevel == 1 ) return Q_SETS; } "{" { namespacePLevel++;Y; } "}" { namespacePLevel--;Y;if (namespacePLevel == 0) {X;return '}';}} "class" { X; BEGIN QT_DEF; return CLASS; } "template" { X; BEGIN QT_DEF; return TEMPLATE; } "namespace" { X; BEGIN QT_DEF; return NAMESPACE; } "using" { X; BEGIN QT_DEF; return USING; } "(" { X; return '('; } ")" { X; return ')'; } "READ" { X; return READ; } "WRITE" { X; return WRITE; } "STORED" { X; return STORED; } "RESET" { X; return RESET; } "DESIGNABLE" { X; return DESIGNABLE; } "SCRIPTABLE" { X; return SCRIPTABLE; } "(" { expLevel++;X; } ")" { expLevel--;Y;if (expLevel == 0) { X; BEGIN QT_DEF; return ')';} } "[" { expLevel++;X; } "]" { expLevel--;X;if (expLevel == 0) { X; BEGIN QT_DEF; return ']';} } "," { if (expLevel == 0) { X; BEGIN QT_DEF; return ',' ;} } ";" { if (expLevel == 0) { X; BEGIN QT_DEF; return ';' ;} } "(" { expLevel++;X; } ")" { expLevel--;Y;if (expLevel == 0) { X; BEGIN QT_DEF; return ')';} } "[" { expLevel++;X; } "]" { expLevel--;X;if (expLevel == 0) { X; BEGIN QT_DEF; return ']';} } "," { if (expLevel <= 1) { X; BEGIN QT_DEF; return ',' ;} } ";" { if (expLevel == 0) { X; BEGIN QT_DEF; return ';' ;} } "(" { enumLevel++;X; } ")" { enumLevel--;X; } "[" { enumLevel++;X; } "]" { enumLevel--;X } "," { if (enumLevel == 0) { X; BEGIN QT_DEF; return ',' ;} } ";" { if (enumLevel == 0) { X; BEGIN QT_DEF; return ';' ;} } "}" { if (enumLevel == 0) { X; BEGIN QT_DEF; return '}' ;} } [[(<] { templLevel++; Y; addExpressionChar( yytext[0] ); } [])>] { templLevel--; Y; if ( templLevel == 0 ) { X; BEGIN QT_DEF; return yytext[0]; } else { addExpressionChar( yytext[0] ); } } "friend" { X;return FRIEND; } "typedef" { X;return TYPEDEF; } "auto" { X;return AUTO; } "register" { X;return REGISTER; } "static" { X;return STATIC; } "extern" { X;return EXTERN; } "inline" { X;return INLINE; } "__inline__" { X;return INLINE; } "virtual" { X;return VIRTUAL; } "const" { X;return CONST; } "volatile" { X;return VOLATILE; } "char" { X;return CHAR; } "short" { X;return SHORT; } "int" { X;return INT; } "long" { X;return LONG; } "signed" { X;return SIGNED; } "unsigned" { X;return UNSIGNED; } "float" { X;return FLOAT; } "double" { X;return DOUBLE; } "void" { X;return VOID; } "enum" { X;return ENUM; } "class" { X;return CLASS; } "struct" { X;return STRUCT; } "union" { X;return UNION; } "asm" { X;return ASM; } "private" { X;return PRIVATE; } "protected" { X;return PROTECTED; } "public" { X;return PUBLIC; } "operator" { X;return OPERATOR; } "::" { X;return DBL_COLON; } "..." { X;return TRIPLE_DOT; } "template" { X;return TEMPLATE; } "mutable" { X;return MUTABLE; } "throw" { X;return THROW; } "using" { X;return USING; } "namespace" { X;return NAMESPACE; } [_a-zA-Z][_a-zA-Z0-9]* { X; yylval.string = qstrdup(yytext); return IDENTIFIER; } [_a-zA-Z][_a-zA-Z0-9]* { X; yylval.string = qstrdup(yytext); return IDENTIFIER; } "(" { X; return '('; } ")" { X; return ')'; } "," { X; return ','; } {ALMOSTSTRING} { X; yylval.string = qstrdup( yytext + 1 ); input(); /* discard the '"' */ return STRING; } [_a-zA-Z][_a-zA-Z0-9]* ; [_a-zA-Z][_a-zA-Z0-9]* ; [_a-zA-Z][_a-zA-Z0-9]* ; {STRING} { /* discard strings */ Z; } {STRING} { /* discard strings */ Z; } {STRING} { /* discard strings */ Z; } {ALMOSTSTRING} { /* discard strings */ Z; addExpressionString( yytext ); input(); /* discard the '"' */ } {ALMOSTSTRING} { X; addExpressionString( yytext ); input(); /* discard the '"' */ return STRING; } {ALMOSTSTRING} { X; yylval.string = qstrdup( yytext + 1 ); input(); /* discard the '"' */ return STRING; } '.' { X; yylval.char_val = yytext[1]; return CHAR_VAL; } '\\a' { X; yylval.char_val = '\a'; return CHAR_VAL; } '\\b' { X; yylval.char_val = '\b'; return CHAR_VAL; } '\\f' { X; yylval.char_val = '\f'; return CHAR_VAL; } '\\n' { X; yylval.char_val = '\n'; return CHAR_VAL; } '\\r' { X; yylval.char_val = '\r'; return CHAR_VAL; } '\\t' { X; yylval.char_val = '\t'; return CHAR_VAL; } '\\v' { X; yylval.char_val = '\v'; return CHAR_VAL; } '\\\\' { X; yylval.char_val = '\\'; return CHAR_VAL; } '\\?' { X; yylval.char_val = '\?'; return CHAR_VAL; } '\\'' { X; yylval.char_val = '\''; return CHAR_VAL; } '\\\"' { X; yylval.char_val = '\"'; /* " */ return CHAR_VAL; } '\\0' { X; yylval.char_val = '\0'; return CHAR_VAL; } '\\[0-7]+' { X; yylval.char_val = (char)strtol( &yytext[1], 0, 8 ); return CHAR_VAL; } '\\x[0-9a-fA-F]+' { X; yylval.char_val = (char)strtol( &yytext[2], 0, 16 ); return CHAR_VAL; } '\\.' { X; yylval.char_val = ' '; return CHAR_VAL; } [0-9]+ { X; yylval.int_val = atoi(yytext); return INT_VAL; } [0-9]+\.[0-9]* { X; yylval.double_val = atof(yytext); return DOUBLE_VAL; } \.[0-9]+ { X; yylval.double_val = atof(yytext); return DOUBLE_VAL; } ^#define.*\\$ { /* skip multi-line macro-definitions */ int c, c1; input(); /* Discard the '\n'. */ do { c1=' '; while((c = linput()) != '\n' && c != 0) c1=c; if (c == 0) break; } while(c1=='\\'); unput(c); /* put back the '\n' or the EOF */ } ^[ \t]*#.* { /* preprocessor commands are skipped */} "//"[^\n]* { /* C++ comment */ QCString s = yytext; if ( s.contains( "MOC_SKIP_BEGIN" ) ) { skipLevel++; if ( skipLevel == 1 ) { lastState = YYSTATE; BEGIN SKIP; } } else if ( s.contains( "MOC_SKIP_END" ) ) { if ( skipLevel == 0 ) { moc_warn(" MOC_SKIP_END without MOC_SKIP_BEGIN"); } else { skipLevel--; if ( skipLevel == 0 ) { BEGIN lastState; } } } } "/*" { /* C comment */ int c = ' '; do { if ( c!= '*' ) { while((c = linput()) != '*' && c != 0) ; } if (c == 0) break; } while(((c = linput())) != '/' && c != 0); if (c == 0) unput(c); } . { addExpressionChar( yytext[0] ); } [ \t\r\b\f]+ { /* spaces are important in template args, e.g. Foo */ addExpressionChar( yytext[0] ); } [ \t\r\b\f]+ ; . ; . ; . ; . { addExpressionChar( yytext[0] ); } . ; . { addExpressionChar( yytext[0] ); } . ; . ; . { X; return yytext[0]; } . { X; return ';'; } \n { lineNo++; } %% #endif // MOC_YACC_CODE