diff options
Diffstat (limited to 'ace/Svc_Conf.l')
-rw-r--r-- | ace/Svc_Conf.l | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/ace/Svc_Conf.l b/ace/Svc_Conf.l new file mode 100644 index 00000000000..8943882cdf7 --- /dev/null +++ b/ace/Svc_Conf.l @@ -0,0 +1,134 @@ +%{ +// $Id$ +// Sample lexical analysis for regular expression subset. Must be +// compiled with FLEX and an ANSI C++ compiler. + +// Lexical tokens values defined by YACC. +#include "ace/Svc_Conf.h" +#include "ace/Svc_Conf_Tokens.h" +#include "ace/Svc_Conf_Lexer_Guard.h" + +ACE_RCSID (ace, + Svc_Conf_l, + "$Id$") + +#define token(x) x +%} + +%s PARAMETERS +%s NORMAL + +letter [a-zA-Z_] +letter_or_digit [a-zA-Z_0-9] +digit [0-9] +ident {letter}{letter_or_digit}* +pathname ([A-Za-z\%]:)?[a-zA-Z_0-9/\%\.\\~-]+ +symbol [ -~] +string (\"{symbol}*\"|\'{symbol}*\') +white_space [ \t] +newline \n +carrage_retn \r +other . + +%% + +^#{other}*$ ; /* EMPTY */ +dynamic { return token (ACE_DYNAMIC); } +static { return token (ACE_STATIC); } +suspend { return token (ACE_SUSPEND); } +resume { return token (ACE_RESUME); } +remove { return token (ACE_REMOVE); } +stream { return token (ACE_USTREAM); } +Module { return token (ACE_MODULE_T); } +Service_Object { return token (ACE_SVC_OBJ_T); } +STREAM { return token (ACE_STREAM_T); } +active { return token (ACE_ACTIVE); } +inactive { return token (ACE_INACTIVE); } +":" { return token (':'); } +"*" { return token ('*'); } +"(" { return token ('('); } +")" { return token (')'); } +"{" { return token ('{'); } +"}" { return token ('}'); } +{string} { + /* Remove trailing double quote character */ + ACE_TCHAR *s = ACE_OS::strrchr (yytext, yytext[0]); + + ACE_ASSERT (s != 0); + /* Eliminate the opening and closing double or + single quotes. */ + *s = '\0'; + yyleng -= 1; + yylval->ident_ = ACE_SVC_CONF_PARAM->obstack.copy (yytext + 1, yyleng); + return token (ACE_STRING); } +{ident} { + yylval->ident_ = ACE_SVC_CONF_PARAM->obstack.copy (yytext, yyleng); + return token (ACE_IDENT); + } +{pathname} { + yylval->ident_ = ACE_SVC_CONF_PARAM->obstack.copy (yytext, yyleng); + return token (ACE_PATHNAME); + } +{white_space}+ ; /* EMPTY */ +{carrage_retn} ; /* EMPTY */ +{newline} { ACE_SVC_CONF_PARAM->yylineno++; } +{other} { + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT ("unknown character = (%d"), + *yytext)); + if (ACE_OS::ace_isprint (*yytext)) + ACE_ERROR ((LM_ERROR, ACE_LIB_TEXT ("|%c"), *yytext)); + ACE_ERROR ((LM_ERROR, ACE_LIB_TEXT (")\n"))); + } +<<EOF>> { yyterminate (); } +%% +int +yywrap (void) +{ + ACE_OS::fflush (yyin); + yytext[0] = '#'; + yyleng = 0; + + return 1; +} + +void +yy_push_buffer (FILE *file, yy_buffer_state *&buffer) +{ + // External synchronization is required. + + if (buffer == 0) + buffer = yy_create_buffer (file, YY_BUF_SIZE); + + yy_switch_to_buffer (buffer); +} + +void +yy_push_buffer (const ACE_TCHAR *directive, yy_buffer_state *&buffer) +{ + // External synchronization is required. + + // yyparse() may invoke yylex() multiple times when parsing + // a single directive. Prevent a new buffer from created during + // each call to yylex(). + if (YY_CURRENT_BUFFER != 0 + && directive == YY_CURRENT_BUFFER->yy_ch_buf) + return; + + if (buffer == 0) + { + // yy_scan_string() already switches the buffer so there is + // no need to explicitly make the switch. + buffer = yy_scan_string (directive); + } + else + yy_switch_to_buffer (buffer); +} + +void +yy_pop_buffer (yy_buffer_state *buffer) +{ + // External synchronization is required. + + yy_switch_to_buffer (buffer); +} |