summaryrefslogtreecommitdiffstats
path: root/src/moc/moc.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/moc/moc.l')
-rw-r--r--src/moc/moc.l498
1 files changed, 498 insertions, 0 deletions
diff --git a/src/moc/moc.l b/src/moc/moc.l
new file mode 100644
index 000000000..7249d7c19
--- /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 TQt 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 TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements 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 [email protected].
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** 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 <string.h>
+#include <stdlib.h>
+
+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 TQString;
+
+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}\"
+
+%%
+
+<OUTSIDE>"class" { X;
+ BEGIN QT_DEF;
+ return CLASS; }
+<OUTSIDE>"namespace" { X;
+ BEGIN QT_DEF;
+ return NAMESPACE; }
+<OUTSIDE>"using" { X;
+ BEGIN QT_DEF;
+ return USING; }
+<OUTSIDE>"template" { X;
+ BEGIN QT_DEF;
+ return TEMPLATE; }
+<QT_DEF>"Q_OBJECT" { X; return Q_OBJECT; }
+<QT_DEF>"signals" { X; return SIGNALS; }
+<QT_DEF>"slots" { X; return SLOTS; }
+<QT_DEF>"Q_CLASSINFO" { X; return Q_CLASSINFO; }
+<QT_DEF>"Q_PROPERTY" { X; return Q_PROPERTY; }
+<QT_DEF>"Q_OVERRIDE" { X; return Q_OVERRIDE; }
+<QT_DEF>"Q_ENUMS" { X; return Q_ENUMS; }
+<QT_DEF>"Q_SETS" { X; return Q_SETS; }
+
+<IN_FCT>"{" { fctLevel++;Y; }
+<IN_FCT>"}" { fctLevel--;Y;if (fctLevel==0){X;return '}';}}
+<IN_CLASS>"{" { classPLevel++;Y; }
+<IN_CLASS>"}" { classPLevel--;Y;if (classPLevel == 0)
+ {X;return '}';} }
+<IN_CLASS>"public" { X;if( classPLevel == 1 ) return PUBLIC; }
+<IN_CLASS>"protected" { X;if( classPLevel == 1 ) return PROTECTED; }
+<IN_CLASS>"private" { X;if( classPLevel == 1 ) return PRIVATE; }
+<IN_CLASS>"signals" { X;if( classPLevel == 1 ) return SIGNALS; }
+<IN_CLASS>"slots" { X;if( classPLevel == 1 ) return SLOTS; }
+<IN_CLASS>"Q_CLASSINFO" { X;if( classPLevel == 1 ) return Q_CLASSINFO; }
+<IN_CLASS>"Q_OBJECT" { X;
+ if ( classPLevel == 1 )
+ return Q_OBJECT;
+ else if ( classPLevel > 1 )
+ moc_warn( "Cannot use Q_OBJECT in nested class." );
+ }
+<IN_CLASS>"Q_PROPERTY" { X;if( classPLevel == 1 ) return Q_PROPERTY; }
+<IN_CLASS>"Q_OVERRIDE" { X;if( classPLevel == 1 ) return Q_OVERRIDE; }
+<IN_CLASS>"Q_ENUMS" { X;if( classPLevel == 1 ) return Q_ENUMS; }
+<IN_CLASS>"Q_SETS" { X;if( classPLevel == 1 ) return Q_SETS; }
+
+<IN_NAMESPACE>"{" { namespacePLevel++;Y; }
+<IN_NAMESPACE>"}" { namespacePLevel--;Y;if (namespacePLevel == 0)
+ {X;return '}';}}
+<IN_NAMESPACE>"class" { X;
+ BEGIN QT_DEF;
+ return CLASS; }
+<IN_NAMESPACE>"template" { X;
+ BEGIN QT_DEF;
+ return TEMPLATE; }
+<IN_NAMESPACE>"namespace" { X;
+ BEGIN QT_DEF;
+ return NAMESPACE; }
+<IN_NAMESPACE>"using" { X;
+ BEGIN QT_DEF;
+ return USING; }
+
+<IN_PROPERTY>"(" { X; return '('; }
+<IN_PROPERTY>")" { X; return ')'; }
+<IN_PROPERTY>"READ" { X; return READ; }
+<IN_PROPERTY>"WRITE" { X; return WRITE; }
+<IN_PROPERTY>"STORED" { X; return STORED; }
+<IN_PROPERTY>"RESET" { X; return RESET; }
+<IN_PROPERTY>"DESIGNABLE" { X; return DESIGNABLE; }
+<IN_PROPERTY>"SCRIPTABLE" { X; return SCRIPTABLE; }
+
+
+<IN_EXPR>"(" { expLevel++;X; }
+<IN_EXPR>")" { expLevel--;Y;if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ')';} }
+<IN_EXPR>"[" { expLevel++;X; }
+<IN_EXPR>"]" { expLevel--;X;if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ']';} }
+<IN_EXPR>"," { if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ',' ;} }
+<IN_EXPR>";" { if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ';' ;} }
+<IN_DEF_ARG>"(" { expLevel++;X; }
+<IN_DEF_ARG>")" { expLevel--;Y;if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ')';} }
+<IN_DEF_ARG>"[" { expLevel++;X; }
+<IN_DEF_ARG>"]" { expLevel--;X;if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ']';} }
+<IN_DEF_ARG>"," { if (expLevel <= 1)
+ { X; BEGIN QT_DEF; return ',' ;} }
+<IN_DEF_ARG>";" { if (expLevel == 0)
+ { X; BEGIN QT_DEF; return ';' ;} }
+<IN_ENUM>"(" { enumLevel++;X; }
+<IN_ENUM>")" { enumLevel--;X; }
+<IN_ENUM>"[" { enumLevel++;X; }
+<IN_ENUM>"]" { enumLevel--;X }
+<IN_ENUM>"," { if (enumLevel == 0)
+ { X; BEGIN QT_DEF; return ',' ;} }
+<IN_ENUM>";" { if (enumLevel == 0)
+ { X; BEGIN QT_DEF; return ';' ;} }
+<IN_ENUM>"}" { if (enumLevel == 0)
+ { X; BEGIN QT_DEF; return '}' ;} }
+<IN_TEMPL_ARGS>[[(<] { templLevel++;
+ Y;
+ addExpressionChar( yytext[0] );
+ }
+<IN_TEMPL_ARGS>[])>] { templLevel--;
+ Y;
+ if ( templLevel == 0 ) {
+ X;
+ BEGIN QT_DEF;
+ return yytext[0];
+ } else {
+ addExpressionChar( yytext[0] );
+ }
+ }
+<QT_DEF>"friend" { X;return FRIEND; }
+<QT_DEF>"typedef" { X;return TYPEDEF; }
+<QT_DEF>"auto" { X;return AUTO; }
+<QT_DEF>"register" { X;return REGISTER; }
+<QT_DEF>"static" { X;return STATIC; }
+<QT_DEF>"extern" { X;return EXTERN; }
+<QT_DEF>"inline" { X;return INLINE; }
+<QT_DEF>"__inline__" { X;return INLINE; }
+<QT_DEF>"virtual" { X;return VIRTUAL; }
+<QT_DEF>"const" { X;return CONST; }
+<QT_DEF>"volatile" { X;return VOLATILE; }
+<QT_DEF>"char" { X;return CHAR; }
+<QT_DEF>"short" { X;return SHORT; }
+<QT_DEF>"int" { X;return INT; }
+<QT_DEF>"long" { X;return LONG; }
+<QT_DEF>"signed" { X;return SIGNED; }
+<QT_DEF>"unsigned" { X;return UNSIGNED; }
+<QT_DEF>"float" { X;return FLOAT; }
+<QT_DEF>"double" { X;return DOUBLE; }
+<QT_DEF>"void" { X;return VOID; }
+<QT_DEF>"enum" { X;return ENUM; }
+<QT_DEF>"class" { X;return CLASS; }
+<QT_DEF>"struct" { X;return STRUCT; }
+<QT_DEF>"union" { X;return UNION; }
+<QT_DEF>"asm" { X;return ASM; }
+<QT_DEF>"private" { X;return PRIVATE; }
+<QT_DEF>"protected" { X;return PROTECTED; }
+<QT_DEF>"public" { X;return PUBLIC; }
+<QT_DEF>"operator" { X;return OPERATOR; }
+<QT_DEF>"::" { X;return DBL_COLON; }
+<QT_DEF>"..." { X;return TRIPLE_DOT; }
+<QT_DEF>"template" { X;return TEMPLATE; }
+<QT_DEF>"mutable" { X;return MUTABLE; }
+<QT_DEF>"throw" { X;return THROW; }
+<QT_DEF>"using" { X;return USING; }
+<QT_DEF>"namespace" { X;return NAMESPACE; }
+
+<QT_DEF>[_a-zA-Z][_a-zA-Z0-9]* {
+ X;
+ yylval.string = qstrdup(yytext);
+ return IDENTIFIER;
+ }
+
+<IN_PROPERTY>[_a-zA-Z][_a-zA-Z0-9]* {
+ X;
+ yylval.string = qstrdup(yytext);
+ return IDENTIFIER;
+ }
+
+<IN_CLASSINFO>"(" { X; return '('; }
+<IN_CLASSINFO>")" { X; return ')'; }
+<IN_CLASSINFO>"," { X; return ','; }
+
+<IN_CLASSINFO>{ALMOSTSTRING} {
+ X;
+ yylval.string = qstrdup( yytext + 1 );
+ input(); /* discard the '"' */
+ return STRING;
+ }
+
+<OUTSIDE>[_a-zA-Z][_a-zA-Z0-9]* ;
+<IN_CLASS>[_a-zA-Z][_a-zA-Z0-9]* ;
+<IN_NAMESPACE>[_a-zA-Z][_a-zA-Z0-9]* ;
+
+<OUTSIDE>{STRING} { /* discard strings */
+ Z;
+ }
+
+<IN_CLASS>{STRING} { /* discard strings */
+ Z;
+ }
+
+<IN_NAMESPACE>{STRING} { /* discard strings */
+ Z;
+ }
+
+<IN_FCT>{ALMOSTSTRING} { /* discard strings */
+ Z;
+ addExpressionString( yytext );
+ input(); /* discard the '"' */
+ }
+
+
+<IN_TEMPL_ARGS>{ALMOSTSTRING} {
+ X;
+ addExpressionString( yytext );
+ input(); /* discard the '"' */
+ return STRING;
+ }
+
+<QT_DEF>{ALMOSTSTRING} {
+ X;
+ yylval.string = qstrdup( yytext + 1 );
+ input(); /* discard the '"' */
+ return STRING;
+ }
+
+<QT_DEF>'.' { X;
+ yylval.char_val = yytext[1];
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\a' { X;
+ yylval.char_val = '\a';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\b' { X;
+ yylval.char_val = '\b';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\f' { X;
+ yylval.char_val = '\f';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\n' { X;
+ yylval.char_val = '\n';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\r' { X;
+ yylval.char_val = '\r';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\t' { X;
+ yylval.char_val = '\t';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\v' { X;
+ yylval.char_val = '\v';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\\\' { X;
+ yylval.char_val = '\\';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\?' { X;
+ yylval.char_val = '\?';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\'' { X;
+ yylval.char_val = '\'';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\\"' { X;
+ yylval.char_val = '\"'; /* " */
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\0' { X;
+ yylval.char_val = '\0';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\[0-7]+' { X;
+ yylval.char_val =
+ (char)strtol( &yytext[1], 0, 8 );
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\x[0-9a-fA-F]+' { X;
+ yylval.char_val =
+ (char)strtol( &yytext[2], 0, 16 );
+ return CHAR_VAL;
+ }
+
+<QT_DEF>'\\.' { X;
+ yylval.char_val = ' ';
+ return CHAR_VAL;
+ }
+
+<QT_DEF>[0-9]+ { X;
+ yylval.int_val = atoi(yytext);
+ return INT_VAL;
+ }
+
+<QT_DEF>[0-9]+\.[0-9]* { X;
+ yylval.double_val = atof(yytext);
+ return DOUBLE_VAL;
+ }
+
+<QT_DEF>\.[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 */
+ TQCString 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);
+ }
+
+<IN_TEMPL_ARGS>. { addExpressionChar( yytext[0] ); }
+
+<IN_TEMPL_ARGS>[ \t\r\b\f]+ {
+ /* spaces are important in template args,
+ e.g. Foo<const int> */
+ addExpressionChar( yytext[0] ); }
+[ \t\r\b\f]+ ;
+<IN_CLASS>. ;
+<IN_NAMESPACE>. ;
+<IN_FCT>. ;
+<IN_EXPR>. { addExpressionChar( yytext[0] ); }
+<IN_DEF_ARG>. ;
+<IN_ENUM>. { addExpressionChar( yytext[0] ); }
+<OUTSIDE>. ;
+<SKIP>. ;
+<QT_DEF>. {
+ X;
+ return yytext[0];
+ }
+<GIMME_SEMICOLON>. {
+ X;
+ return ';';
+ }
+\n {
+ lineNo++;
+ }
+
+
+%%
+
+#endif // MOC_YACC_CODE