bintools/rcomp/src/RCOMP.LEX
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/rcomp/src/RCOMP.LEX	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,317 @@
+%option yylineno
+%{
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). 
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+// 
+// Description:
+// RCOMPL.INL
+// Generated from RCOMP.L
+
+
+#include <limits.h>
+#include <string.h>
+#include "main.h"
+#include "structst.h"
+#include "parser.h"
+#include "localise.h"
+
+#define YY_SKIP_YYWRAP 1
+#define YY_NEVER_INTERACTIVE 1
+int yywrap();
+void yyerror(const char* string, ...);
+
+// Redefine YY_INPUT so we can parse binary data.
+#undef YY_INPUT
+#define YY_INPUT(buf, result, max_size) (result = new_yy_input(buf, max_size))
+
+int new_yy_input(char *buf, int max_size)
+{
+   int result;
+   result = fread(buf, 1, max_size, yyin);
+   if (result == 0)
+      return YY_NULL;
+   
+   // check for utf8 (BOM) header in buf
+   for (int i = 0; i < result-3; i++)
+   {
+      if (buf[i] == 0xffffffef && buf[i+1] == 0xffffffbb && buf[i+2] == 0xffffffbf)
+      {
+		buf[i] = ' ';
+		buf[i+1] = ' ';
+		buf[i+2] = ' ';
+      }
+   }
+   return result;
+}
+
+#include "rcomp.hpp"
+#include "fileline.h"
+
+#define VALUE_LEN   (1024*8)	// must match sizeof(YYSTYPE.Value)
+char buf[VALUE_LEN];
+char * pCh;
+#define CHECK_APPEND(x)	\
+    if (pCh-buf==VALUE_LEN-1) { yyerror("string too long - %c ignored", (x)); } else {*pCh++ = (x); }
+
+int isCharLiteral;
+
+extern String		InputBaseName;
+extern FileLineManager* pFileLineHandler;
+extern int*		pCurrentLineNumber;
+char RealLineNumber[200];
+//
+// Disable MSVC warnings
+//
+#ifdef __VC32__
+#if 0
+..\src\RCOMP.L(95) : warning C4127: conditional expression is constant
+..\src\RCOMP.L(114) : warning C4244: 'initializing' : conversion from 'const int' to 'YY_CHAR', possible loss of data
+..\src\RCOMP.L(119) : warning C4244: '=' : conversion from 'const int' to 'YY_CHAR', possible loss of data
+..\src\RCOMP.L(130) : warning C4102: 'find_rule' : unreferenced label
+..\src\RCOMP.L(513) : warning C4244: 'initializing' : conversion from 'int' to 'YY_CHAR', possible loss of data
+..\src\RCOMP.L(518) : warning C4244: '=' : conversion from 'const int' to 'YY_CHAR', possible loss of data
+..\src\RCOMP.L(548) : warning C4244: '=' : conversion from 'const int' to 'YY_CHAR', possible loss of data
+..\src\RCOMP.L(63) : warning C4505: 'yyunput' : unreferenced local function has been removed
+\epoc32\BUILD\generatedcpp\rcomp\rcompl.cpp(243) : warning C4505: 'yy_flex_realloc' : unreferenced local function has been removed
+#endif
+
+#pragma warning( disable : 4100 )
+#pragma warning( disable : 4102 )
+#pragma warning( disable : 4127 )
+#pragma warning( disable : 4244 )
+#pragma warning( disable : 4245 )
+#pragma warning( disable : 4505 )
+#endif //__VC32__
+
+#include "errorhan.h"
+
+#define REGISTER_LINE	ErrorHandler::Register(pFileLineHandler->GetCurrentFile(), pFileLineHandler->GetErrorLine(* pCurrentLineNumber))
+
+
+%}
+    
+Digit [0-9]
+Lower [a-z]
+Upper [A-Z]
+Letter {Lower}|{Upper}
+Alphanumeric {Letter}|{Digit}
+LetterOrUnderscore {Letter}|_
+AlphanumUscore {Alphanumeric}|_
+HexChar [A-Fa-f0-9]
+ExpChar [eE]
+FileNameChar [^"]
+
+%s string_rules
+	/* Rule set for string literals.			        */
+	/* n.b. Exclusive rule sets i.e. %x are available in MKS only	*/
+	/* so they are not used here; hence all the <INITIAL>'s.        */
+				
+%s file_line_rules
+	/* Rule set for file_line_directive.*/
+
+%s cpp_comment
+	/* C++ comment to end of line */
+
+%s c_comment
+	/* C comment */
+
+%s comment_tag
+	/* Doxygen-style comment tag */
+
+%%
+
+
+	/* Translations section */
+	/* ==================== */
+
+	/*******************************************/
+	/* Main keywords                           */
+	/*******************************************/
+<INITIAL>STRUCT				return L_STRUCT;
+<INITIAL>RESOURCE				return L_RESOURCE;
+<INITIAL>NAME					return L_NAME;
+<INITIAL>CHARACTER_SET			return L_CHARACTER_SET;
+<INITIAL>OFFSET				return L_OFFSET;
+<INITIAL>SYSTEM				return L_SYSTEM;
+<INITIAL>GLOBAL				return L_GLOBAL;
+<INITIAL>LOCAL				return L_LOCAL;
+<INITIAL>ENUM					return L_ENUM;
+<INITIAL>enum					return L_ENUM;
+<INITIAL>UID2					return L_UID_TWO;
+<INITIAL>UID3					return L_UID_THREE;
+<INITIAL>rls_string		return L_RLS_STRING;
+<INITIAL>rls_string8		return L_RLS_STRING8;
+<INITIAL>rls_double		return L_RLS_DOUBLE;
+<INITIAL>rls_byte		return L_RLS_BYTE;
+<INITIAL>rls_word		return L_RLS_WORD;
+<INITIAL>rls_long		return L_RLS_LONG;
+<INITIAL>multi		return L_MULTI;
+
+	/*******************************************/
+	/* Types                                   */
+	/*******************************************/
+<INITIAL>BUF					return L_BUF;
+<INITIAL>BUF8					return L_BUF8;
+<INITIAL>BUF16				return L_BUF16;
+<INITIAL>WORD					return L_WORD;
+<INITIAL>BYTE					return L_BYTE;
+<INITIAL>LONG					return L_LONG;
+<INITIAL>DOUBLE				return L_DOUBLE;
+<INITIAL>TEXT					return L_TEXT;
+<INITIAL>LTEXT				return L_LTEXT;
+<INITIAL>TEXT8				return L_TEXT8;
+<INITIAL>LTEXT8				return L_LTEXT8;
+<INITIAL>TEXT16				return L_TEXT16;
+<INITIAL>LTEXT16				return L_LTEXT16;
+<INITIAL>LINK					return L_LINK;
+<INITIAL>LLINK				return L_LLINK;
+<INITIAL>SRLINK				return L_SRLINK;
+
+
+	/*******************************************/
+	/* Others                                  */
+	/*******************************************/
+<INITIAL>LEN					return L_LEN;
+
+
+	/*******************************************/
+	/* String & character literals             */
+	/*******************************************/
+<INITIAL>\"					{ BEGIN(string_rules); pCh = buf; isCharLiteral=0; }
+<INITIAL>'					{ BEGIN(string_rules); pCh = buf; isCharLiteral=1; }
+
+	/* Escaped single- and double-quotes.*/
+<string_rules>\\\"		{ CHECK_APPEND('"'); }
+<string_rules>\\'		{ CHECK_APPEND('\''); };
+
+	/* Convert escaped character into corresponding actual character e.g. \t to tab. */
+<string_rules>\\[rbfntv]	{ CHECK_APPEND( * ( strchr("\rr\bb\ff\nn\tt\vv\aa", yytext[1])-1));}
+
+	/* Escaped backslash */
+<string_rules>\\\\			{ CHECK_APPEND('\\'); }
+
+<string_rules>\\\n				/* Escaped newline ignored*/ ;
+
+	/* End of line before terminating double-quotes.*/
+<string_rules>(\r)?\n		{ yyerror( isCharLiteral?"Unterminated character literal":"Unterminated string"); BEGIN 0; }
+
+	/* End of string reached.*/
+<string_rules>\"	{ 
+    if (!isCharLiteral) 
+	    {
+	    *pCh = '\0'; BEGIN(0); strcpy( yylval.Value, buf); 
+		return L_STRING_LITERAL; 
+	    }
+    CHECK_APPEND(*yytext);
+    }
+
+<string_rules>'		{ 
+    if (isCharLiteral) 
+	    {
+	    *pCh = '\0'; BEGIN(0); strcpy( yylval.Value, buf); return L_CHAR_LITERAL;
+	    }
+    CHECK_APPEND(*yytext);
+    }
+
+	/* Anything other than \n is stored.*/
+<string_rules>.			{ CHECK_APPEND(*yytext); }
+
+
+	/*******************************************/
+	/* Labels                                  */
+	/*******************************************/
+<INITIAL>{LetterOrUnderscore}{AlphanumUscore}*    {	
+    BEGIN(0);
+    strcpy( yylval.Value, yytext);
+    return L_LABEL;
+    }
+
+	/*******************************************/
+	/* Numbers                                 */
+	/*******************************************/
+<INITIAL>{Digit}+					{	strcpy( yylval.Value, yytext); return L_NUM_NATURAL; }
+<INITIAL>0x{HexChar}+					{	strcpy( yylval.Value, yytext); return L_NUM_NATURAL; }
+<INITIAL>{Digit}+\.{Digit}+{ExpChar}{Digit}+		{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+<INITIAL>-{Digit}+\.{Digit}+{ExpChar}{Digit}+		{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+<INITIAL>{Digit}+\.{Digit}+				{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+<INITIAL>-{Digit}+\.{Digit}+				{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+<INITIAL>{Digit}+{ExpChar}{Digit}+			{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+<INITIAL>-{Digit}+{ExpChar}{Digit}+			{	strcpy( yylval.Value, yytext); return L_NUM_FLOAT;}
+
+	/*******************************************/
+	/* file_line_directive                     */
+	/*******************************************/
+<INITIAL>[#][ ]{Digit}+[ ]\"					{	BEGIN(file_line_rules); strcpy( RealLineNumber, yytext+2); }
+
+<file_line_rules>\"(\r)?$					{	BEGIN(0); // # <line> "" means start of base file.
+											pFileLineHandler->SetBase( InputBaseName, * pCurrentLineNumber);
+										}
+										
+<file_line_rules>{FileNameChar}*\"(\r)?$		{	BEGIN(0); // # <line> <filename> means @ line <line> of named base file.
+											pFileLineHandler->PostInclude( yytext, RealLineNumber, * pCurrentLineNumber);
+										}
+
+<file_line_rules>{FileNameChar}*\"[ ]1([ ]3){0,1}(\r)?$	{
+											BEGIN(0); // # <line> <filename> 1 means start of an included file.
+											pFileLineHandler->SetInclude( yytext, * pCurrentLineNumber);
+										}
+
+<file_line_rules>{FileNameChar}*\"[ ]2([ ]3){0,1}(\r)?$	{
+											BEGIN(0); // # <line> <filename> 2 means end of an included file and now at <line> in <filename>.
+											pFileLineHandler->PostInclude( yytext, RealLineNumber, * pCurrentLineNumber);
+										}
+
+
+
+	/*******************************************/
+	/* White space                             */
+	/*******************************************/
+<INITIAL,file_line_rules>[ \t]			; // skipped
+<INITIAL>[\n\r]							; // skipped
+<file_line_rules>[\n\r]					; // skipped
+<INITIAL,file_line_rules>"//"			{ BEGIN(cpp_comment); }
+<cpp_comment>[\n\r]						{ BEGIN(0); }
+<cpp_comment>.			    ;			// skipped
+<INITIAL,file_line_rules>"/*"/[^&\n]	{ BEGIN(c_comment); }
+<INITIAL,file_line_rules>"/*"[\n\r]		{ BEGIN(c_comment); }
+<c_comment>"*/"							{ BEGIN(0); }
+<c_comment>[\n\r]						; // skipped
+<c_comment>.							; // skipped
+
+	/*******************************************/
+	/* Comment tags                            */
+	/*******************************************/
+
+<INITIAL,file_line_rules>[ \t]*"/*&"	{ 
+										BEGIN(comment_tag);
+										pGL->SetStart(*(pFileLineHandler->GetCurrentFile()), pFileLineHandler->GetErrorLine(* pCurrentLineNumber));
+										return L_TAG_START; 
+										}	// any comment beginning with a slash followed by a star followed by an ampersand
+<comment_tag>"*/"						{ 
+										BEGIN(0); 
+										return L_TAG_END; 
+										}
+<comment_tag>"@"[^* \t\r\n]+			{ strcpy( yylval.Value, yytext);	return L_TAG_COMMAND; }
+<comment_tag>[^*@ \t\n\r][^ *\t\r\n]*	{ strcpy( yylval.Value, yytext);	return L_TAG_WORD; }
+<comment_tag>[\n\r]						{ strcpy( yylval.Value, "\n");		return L_TAG_NEW_LINE; }
+<comment_tag>[* \t]						;
+
+	/*******************************************/
+	/* Special single characters               */
+	/*******************************************/
+<INITIAL>[.{};=\[\],()+\-*/|<>]		return * yytext;
+
+
+	/*******************************************/
+	/* Everything else cannot be recognised    */
+	/*******************************************/
+.                       { yyerror("*** Unknown character '%c' (value 0x%x) ", *yytext, *yytext);}