From bd0f3345a938b35ce6a12f6150373b0955b8dd12 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 10 Jul 2011 15:24:15 -0500 Subject: Add Qt3 development HEAD version --- src/moc/moc.l | 498 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 498 insertions(+) create mode 100644 src/moc/moc.l (limited to 'src/moc/moc.l') diff --git a/src/moc/moc.l b/src/moc/moc.l new file mode 100644 index 0000000..f032fd0 --- /dev/null +++ b/src/moc/moc.l @@ -0,0 +1,498 @@ +/**************************************************************************** +** +** Lexical analyzer for meta object compiler +** +** Created : 930417 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free Qt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.QPL +** included in the packaging of this file. Licensees holding valid Qt +** Commercial 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 WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +*****************************************************************************/ + +%{ +#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 -- cgit v1.2.1