summaryrefslogtreecommitdiffstats
path: root/dcop/dcopidl/scanner.ll
diff options
context:
space:
mode:
Diffstat (limited to 'dcop/dcopidl/scanner.ll')
-rw-r--r--dcop/dcopidl/scanner.ll293
1 files changed, 293 insertions, 0 deletions
diff --git a/dcop/dcopidl/scanner.ll b/dcop/dcopidl/scanner.ll
new file mode 100644
index 000000000..767594ac6
--- /dev/null
+++ b/dcop/dcopidl/scanner.ll
@@ -0,0 +1,293 @@
+%{
+/*****************************************************************
+Copyright (c) 1999 Torben Weis <weis@kde.org>
+Copyright (c) 2000 Matthias Ettrich <ettrich@kde.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************/
+
+#define YY_NO_UNPUT
+#include <stdlib.h>
+#include <ctype.h>
+
+class QString;
+
+#ifndef KDE_USE_FINAL
+#include "yacc.cc.h"
+#endif
+
+extern int idl_line_no;
+int comment_mode;
+int function_mode = 0;
+
+#include <qstring.h>
+#include <qregexp.h>
+
+static long ascii_to_longlong( long base, const char *s )
+{
+ long ll = 0;
+ while( *s != '\0' ) {
+ char c = *s++;
+ if( c >= 'a' )
+ c -= 'a' - 'A';
+ c -= '0';
+ if( c > 9 )
+ c -= 'A' - '0' - 10;
+ ll = ll * base + c;
+ }
+ return ll;
+}
+
+static double ascii_to_longdouble (const char *s)
+{
+ double d;
+#ifdef HAVE_SCANF_LF
+ sscanf (s, "%Lf", &d);
+#else
+ /*
+ * this is only an approximation and will probably break fixed<>
+ * parameter calculation on systems where
+ * sizeof(double) < sizeof(long double). but fortunately all
+ * systems where scanf("%Lf") is known to be broken (Linux/Alpha
+ * and HPUX) have sizeof(double) == sizeof(long double).
+ */
+ d = strtod (s, NULL);
+#endif
+ return d;
+}
+
+static char translate_char( const char *s )
+{
+ char c = *s++;
+
+ if( c != '\\' )
+ return c;
+ c = *s++;
+ switch( c ) {
+ case 'n':
+ return '\n';
+ case 't':
+ return '\t';
+ case 'v':
+ return '\v';
+ case 'b':
+ return '\b';
+ case 'r':
+ return '\r';
+ case 'f':
+ return '\f';
+ case 'a':
+ return '\a';
+ case '\\':
+ return '\\';
+ case '?':
+ return '\?';
+ case '\'':
+ return '\'';
+ case '"':
+ return '"';
+ case 'x':
+ case 'X':
+ return (char) ascii_to_longlong( 16, s );
+ default:
+ // Gotta be an octal
+ return (char) ascii_to_longlong( 8, s );
+ }
+}
+
+
+%}
+
+%option noyywrap
+%option never-interactive
+/*--------------------------------------------------------------------------*/
+
+Digits [0-9]+
+Oct_Digit [0-7]
+Hex_Digit [a-fA-F0-9]
+Int_Literal [1-9][0-9]*L?
+Oct_Literal 0{Oct_Digit}*
+Hex_Literal (0x|0X){Hex_Digit}*
+Esc_Sequence1 "\\"[ntvbrfa\\\?\'\"]
+Esc_Sequence2 "\\"{Oct_Digit}{1,3}
+Esc_Sequence3 "\\"(x|X){Hex_Digit}{1,2}
+Esc_Sequence ({Esc_Sequence1}|{Esc_Sequence2}|{Esc_Sequence3})
+Char ([^\n\t\"\'\\]|{Esc_Sequence})
+Char_Literal "'"({Char}|\"|\\)"'"
+String_Literal \"({Char}|"'")*\"
+Float_Literal1 {Digits}"."{Digits}(e|E)("+"|"-")?{Digits}
+Float_Literal2 {Digits}(e|E)("+"|"-")?{Digits}
+Float_Literal3 {Digits}"."{Digits}
+Float_Literal4 "."{Digits}
+Float_Literal5 "."{Digits}(e|E)("+"|"-")?{Digits}
+
+/*--------------------------------------------------------------------------*/
+
+Kidl_Identifier [_a-zA-Z][a-zA-Z0-9_]*
+
+/*--------------------------------------------------------------------------*/
+
+
+
+%%
+
+[ \t] ;
+[\n] { idl_line_no++; }
+
+"/\*" { comment_mode = 1; }
+"\*/" { if (!comment_mode) { REJECT; } else { comment_mode = 0; } }
+"}" {
+ if (! comment_mode) {
+ if (!function_mode) { REJECT; } else {
+ function_mode = 0;
+ return T_RIGHT_CURLY_BRACKET;
+ }
+ }
+ }
+[^\n}*]* { if (!comment_mode && !function_mode) { REJECT; } }
+"*" { if (!comment_mode) { REJECT; } }
+
+"//"[^\n]* ;
+"#!"[^\n]* {
+ exit( 1 );
+ }
+"#include"[ \t]*[<\"][^>"]*[>\"]\s*\n {
+ QString s( yytext );
+ int i = s.find(QRegExp("[\"<]"))+1;
+ int j = s.find(QRegExp("[\">]"), i);
+ yylval._str = new QString( s.mid( i, j - i ) );
+ idl_line_no++;
+ return T_INCLUDE;
+ }
+"#"[^\n]*\n {
+ idl_line_no++;
+ }
+"{" return T_LEFT_CURLY_BRACKET;
+"}" return T_RIGHT_CURLY_BRACKET;
+"(" return T_LEFT_PARANTHESIS;
+")" return T_RIGHT_PARANTHESIS;
+":" return T_COLON;
+"+" return T_PLUS;
+"-" return T_MINUS;
+"~" return T_TILDE;
+"," return T_COMMA;
+"*" return T_ASTERISK;
+";" return T_SEMICOLON;
+"&" return T_AMPERSAND;
+"<" return T_LESS;
+">" return T_GREATER;
+"::" return T_SCOPE;
+"=" return T_EQUAL;
+"." return T_ACCESS;
+"..." return T_TRIPLE_DOT;
+"[" return T_ARRAY_OPEN;
+"]" return T_ARRAY_CLOSE;
+"->" return T_ACCESS;
+(">>"|"<<") return T_SHIFT;
+(">="|"<="|"!="|"==") return T_MISCOPERATOR;
+
+
+const return T_CONST;
+enum return T_ENUM;
+namespace return T_NAMESPACE;
+using return T_USING;
+class return T_CLASS;
+struct return T_STRUCT;
+operator return T_FUNOPERATOR;
+virtual return T_VIRTUAL;
+public return T_PUBLIC;
+inline return T_INLINE;
+static return T_STATIC;
+mutable return T_MUTABLE;
+signed return T_SIGNED;
+unsigned return T_UNSIGNED;
+short return T_SHORT;
+long return T_LONG;
+friend return T_FRIEND;
+protected return T_PROTECTED;
+private return T_PRIVATE;
+signals return T_SIGNAL;
+return return T_RETURN;
+slots return T_SLOT;
+true return T_TRUE;
+int return T_INT;
+char return T_CHAR;
+false return T_FALSE;
+TRUE return T_TRUE;
+FALSE return T_FALSE;
+"k_dcop" return T_DCOP_AREA;
+"k_dcop_signals" return T_DCOP_SIGNAL_AREA;
+typedef return T_TYPEDEF;
+K_DCOP return T_DCOP;
+Q_OBJECT ;
+("0"|"0L") return T_NULL;
+"extern "[A-Za-z0-9_ \t*]+ return T_EXTERN;
+"extern \"C\"" return T_EXTERN_C;
+
+{Kidl_Identifier} {
+ yylval._str = new QString( yytext );
+ return T_IDENTIFIER;
+ }
+
+{Float_Literal1} |
+{Float_Literal2} |
+{Float_Literal3} |
+{Float_Literal4} |
+{Float_Literal5} {
+ yylval._float = ascii_to_longdouble( yytext );
+ return T_DOUBLE_LITERAL;
+ }
+{Int_Literal} {
+ yylval._int = ascii_to_longlong( 10, yytext );
+ return T_INTEGER_LITERAL;
+ }
+{Oct_Literal} {
+ yylval._int = ascii_to_longlong( 8, yytext );
+ return T_INTEGER_LITERAL;
+ }
+{Hex_Literal} {
+ yylval._int = ascii_to_longlong( 16, yytext + 2 );
+ return T_INTEGER_LITERAL;
+ }
+{Char_Literal} {
+ QCString s( yytext );
+ s = s.mid( 1, s.length() - 2 );
+ yylval._char = translate_char( s );
+ return T_CHARACTER_LITERAL;
+ }
+{String_Literal} {
+ QString s( yytext );
+ yylval._str = new QString( s.mid( 1, s.length() - 2 ) );
+ return T_STRING_LITERAL;
+ }
+. {
+ if (function_mode)
+ return yylex(); // call once again
+
+ qFatal("could not parse %c(%d) at line %d" , yytext[0], yytext[0], idl_line_no);
+ return T_UNKNOWN;
+ }
+
+%%
+
+void dcopidlInitFlex( const char *_code )
+{
+ comment_mode = 0;
+ yy_switch_to_buffer( yy_scan_string( _code ) );
+}