|
Packit |
4a5d52 |
/***************************************************************************
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
lexer.l (IDL lex scanner)
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
Copyright (C) 1998, 1999 Andrew T. Veliath
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
This library is free software; you can redistribute it and/or
|
|
Packit |
4a5d52 |
modify it under the terms of the GNU Library General Public
|
|
Packit |
4a5d52 |
License as published by the Free Software Foundation; either
|
|
Packit |
4a5d52 |
version 2 of the License, or (at your option) any later version.
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
This library is distributed in the hope that it will be useful,
|
|
Packit |
4a5d52 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4a5d52 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4a5d52 |
Library General Public License for more details.
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
You should have received a copy of the GNU Library General Public
|
|
Packit |
4a5d52 |
License along with this library; if not, write to the Free
|
|
Packit |
4a5d52 |
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
$Id: lexer.l,v 1.83 2003/05/09 15:19:06 jody Exp $
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
***************************************************************************/
|
|
Packit |
4a5d52 |
%{
|
|
Packit |
4a5d52 |
#include <assert.h>
|
|
Packit |
4a5d52 |
#include <stdio.h>
|
|
Packit |
4a5d52 |
#include <stdlib.h>
|
|
Packit |
4a5d52 |
#include <ctype.h>
|
|
Packit |
4a5d52 |
#include <string.h>
|
|
Packit |
4a5d52 |
#include <glib.h>
|
|
Packit |
4a5d52 |
#include "rename.h"
|
|
Packit |
4a5d52 |
#include "util.h"
|
|
Packit |
4a5d52 |
#include "parser.h"
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#ifdef XP_MAC
|
|
Packit |
4a5d52 |
# include <unix.h>
|
|
Packit |
4a5d52 |
# define YY_NEVER_INTERACTIVE 1
|
|
Packit |
4a5d52 |
#endif
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
/* Eliminate warning */
|
|
Packit |
4a5d52 |
#define YY_NO_UNPUT 1
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#define YY_INPUT(buf,result,the_max_size) do { \
|
|
Packit |
4a5d52 |
if (__IDL_inputcb == NULL) { \
|
|
Packit |
4a5d52 |
if ((result = fread (buf, 1, the_max_size, yyin)) == YY_NULL && \
|
|
Packit |
4a5d52 |
ferror (yyin)) \
|
|
Packit |
4a5d52 |
YY_FATAL_ERROR ("input in scanner failed"); \
|
|
Packit |
4a5d52 |
} else { \
|
|
Packit |
4a5d52 |
union IDL_input_data data; \
|
|
Packit |
4a5d52 |
\
|
|
Packit |
4a5d52 |
data.fill.buffer = buf; \
|
|
Packit |
4a5d52 |
data.fill.max_size = the_max_size; \
|
|
Packit |
4a5d52 |
result = (*__IDL_inputcb) (IDL_INPUT_REASON_FILL, &data, \
|
|
Packit |
4a5d52 |
__IDL_inputcb_user_data); \
|
|
Packit |
4a5d52 |
if (result < 0) \
|
|
Packit |
4a5d52 |
YY_FATAL_ERROR ("input callback returned failure"); \
|
|
Packit |
4a5d52 |
} \
|
|
Packit |
4a5d52 |
} while (0)
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#define tokreturn(token) do { \
|
|
Packit |
4a5d52 |
__IDL_prev_token_line = __IDL_cur_token_line; \
|
|
Packit |
4a5d52 |
__IDL_cur_token_line = __IDL_cur_line; \
|
|
Packit |
4a5d52 |
return token; \
|
|
Packit |
4a5d52 |
} while (0)
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#define SELECT_START \
|
|
Packit |
4a5d52 |
/* Parser driven start conditions */ \
|
|
Packit |
4a5d52 |
if (__IDL_flagsi & IDLFP_PROPERTIES) \
|
|
Packit |
4a5d52 |
BEGIN (PROP); \
|
|
Packit |
4a5d52 |
else if (__IDL_flagsi & IDLFP_NATIVE) \
|
|
Packit |
4a5d52 |
BEGIN (NATIVE); \
|
|
Packit |
4a5d52 |
/* Global syntax start conditions */ \
|
|
Packit |
4a5d52 |
else if (__IDL_flags & IDLF_XPIDL) \
|
|
Packit |
4a5d52 |
BEGIN (XP); \
|
|
Packit |
4a5d52 |
else if (__IDL_flags & IDLF_CODEFRAGS) \
|
|
Packit |
4a5d52 |
BEGIN (CFRG);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#define SELECT_RESTART \
|
|
Packit |
4a5d52 |
SELECT_START \
|
|
Packit |
4a5d52 |
else \
|
|
Packit |
4a5d52 |
BEGIN (INITIAL);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
static int count_nl (const char *s);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
static void IDL_parse_cpp_status(char *mytext) {
|
|
Packit |
4a5d52 |
gint line;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
line = atoi (mytext);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (g_ascii_isdigit (*mytext))
|
|
Packit |
4a5d52 |
mytext++;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
if (g_ascii_isspace (*mytext)) {
|
|
Packit |
4a5d52 |
mytext++;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
if (mytext [0] == '"') {
|
|
Packit |
4a5d52 |
gchar *p = ++mytext;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (*p && *p != '"') p++;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
*p = '\0';
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
if (mytext [0] == '<' &&
|
|
Packit |
4a5d52 |
(!strcmp (mytext, "<builtin>") ||
|
|
Packit |
4a5d52 |
!strcmp (mytext, "<built-in>") ||
|
|
Packit |
4a5d52 |
!strcmp (mytext, "<stdin>") ||
|
|
Packit |
4a5d52 |
!strcmp (mytext, "<command-line>") ||
|
|
Packit |
4a5d52 |
!strcmp (mytext, "<command line>")))
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
yylval.tree = IDL_file_set ("", line);
|
|
Packit |
4a5d52 |
else {
|
|
Packit |
4a5d52 |
gchar *filename = g_strdup (mytext);
|
|
Packit |
4a5d52 |
#ifdef G_OS_WIN32
|
|
Packit |
4a5d52 |
/*
|
|
Packit |
4a5d52 |
* On Windows when using MSVC, the file name
|
|
Packit |
4a5d52 |
* output by cl.exe may have "\\" as the path
|
|
Packit |
4a5d52 |
* separator. We need to strip the extra '\'
|
|
Packit |
4a5d52 |
* so we can compare to our internal file
|
|
Packit |
4a5d52 |
* name.
|
|
Packit |
4a5d52 |
*/
|
|
Packit |
4a5d52 |
gchar *dst, *src;
|
|
Packit |
4a5d52 |
for (dst = filename, src = mytext;
|
|
Packit |
4a5d52 |
*src != '\0'; src++, dst++) {
|
|
Packit |
4a5d52 |
if (*src == '\\' && *(src + 1) == '\\') {
|
|
Packit |
4a5d52 |
src++;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
*dst = *src;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
*dst = '\0';
|
|
Packit |
4a5d52 |
#endif
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
yylval.tree = IDL_file_set (filename, line);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
g_free (filename);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
else
|
|
Packit |
4a5d52 |
yylval.tree = IDL_file_set ("", line);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
#ifdef YYDEBUG
|
|
Packit |
4a5d52 |
extern int yydebug;
|
|
Packit |
4a5d52 |
#endif
|
|
Packit |
4a5d52 |
int __IDL_prev_token_line;
|
|
Packit |
4a5d52 |
int __IDL_cur_token_line;
|
|
Packit |
4a5d52 |
static int warn_underscores;
|
|
Packit |
4a5d52 |
static char * codefrag_desc;
|
|
Packit |
4a5d52 |
static GSList * codefrag_list;
|
|
Packit |
4a5d52 |
static GSList * codefrag_list_tail;
|
|
Packit |
4a5d52 |
%}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
whitespace [ \t\v\f\r]*
|
|
Packit |
4a5d52 |
whitespacenl [ \t\v\f\r\n]*
|
|
Packit |
4a5d52 |
newline \n
|
|
Packit |
4a5d52 |
cpp_pragma ^{whitespace}#{whitespace}pragma{whitespace}.*
|
|
Packit |
4a5d52 |
cpp_status ^{whitespace}#{whitespace}[0-9][0-9]*.*
|
|
Packit |
4a5d52 |
cpp_status_ms ^{whitespace}#line{whitespace}[0-9][0-9]*.*
|
|
Packit |
4a5d52 |
cpp_other ^{whitespace}#.*
|
|
Packit |
4a5d52 |
b8_int 0[0-9]*
|
|
Packit |
4a5d52 |
b10_uint [1-9][0-9]*
|
|
Packit |
4a5d52 |
b16_int 0[xX][0-9A-Fa-f]+
|
|
Packit |
4a5d52 |
float_lit [0-9]*\.[0-9]+([eE]-?[0-9]+)?|[0-9]+\.?([eE]-?[0-9]+)?
|
|
Packit |
4a5d52 |
fixed_lit ([0-9]*\.[0-9]+|-?[0-9]+\.?[0-9]*)[dD]
|
|
Packit |
4a5d52 |
declspec __declspec{whitespacenl}\({whitespacenl}[A-Za-z]*{whitespacenl}\)
|
|
Packit |
4a5d52 |
happy_ident [A-Za-z][A-Za-z0-9]*
|
|
Packit |
4a5d52 |
escaped_ident _[A-Za-z0-9_]+
|
|
Packit |
4a5d52 |
warn1_ident [A-Za-z][A-Za-z0-9_]*
|
|
Packit |
4a5d52 |
prop_key [A-Za-z][A-Za-z0-9_]*
|
|
Packit |
4a5d52 |
prop_value \([^\)]+\)
|
|
Packit |
4a5d52 |
native_type [^\)]+\)
|
|
Packit |
4a5d52 |
sqstring \'[^\'\n]*[\'\n]
|
|
Packit |
4a5d52 |
dqstring \"[^\"\n]*[\"\n]
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%p 5000
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%s XP
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%x PROP
|
|
Packit |
4a5d52 |
%x NATIVE
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%s CFRG
|
|
Packit |
4a5d52 |
%x CFRGX
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%%
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
SELECT_START;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
<INITIAL,XP,CFRG>^%\{.* {
|
|
Packit |
4a5d52 |
char *s = yytext + 2;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (g_ascii_isspace (*s)) ++s;
|
|
Packit |
4a5d52 |
codefrag_desc = g_strdup (s);
|
|
Packit |
4a5d52 |
codefrag_list = codefrag_list_tail = NULL;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
if (!(__IDL_flags & IDLF_XPIDL || __IDL_flags & IDLF_CODEFRAGS))
|
|
Packit |
4a5d52 |
yyerror ("Code fragment syntax not enabled");
|
|
Packit |
4a5d52 |
else
|
|
Packit |
4a5d52 |
BEGIN (CFRGX);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<CFRGX>^%\}.* {
|
|
Packit |
4a5d52 |
yylval.tree = IDL_codefrag_new (codefrag_desc, codefrag_list);
|
|
Packit |
4a5d52 |
tokreturn (TOK_CODEFRAG);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<CFRGX>.* {
|
|
Packit |
4a5d52 |
char *s;
|
|
Packit |
4a5d52 |
GSList *slist;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
s = g_strdup (yytext);
|
|
Packit |
4a5d52 |
slist = g_slist_alloc ();
|
|
Packit |
4a5d52 |
slist->data = s;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
if (codefrag_list == NULL) {
|
|
Packit |
4a5d52 |
codefrag_list = slist;
|
|
Packit |
4a5d52 |
codefrag_list_tail = slist;
|
|
Packit |
4a5d52 |
} else {
|
|
Packit |
4a5d52 |
codefrag_list_tail->next = slist;
|
|
Packit |
4a5d52 |
codefrag_list_tail = slist;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>{cpp_pragma} {
|
|
Packit |
4a5d52 |
int n;
|
|
Packit |
4a5d52 |
char *p = yytext;
|
|
Packit |
4a5d52 |
char *s, *t;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (g_ascii_isspace (*p) || *p == '#') ++p;
|
|
Packit |
4a5d52 |
s = p;
|
|
Packit |
4a5d52 |
sscanf (p, "%*6s%n", &n); s += n;
|
|
Packit |
4a5d52 |
while (g_ascii_isspace (*s)) ++s;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
t = s + strlen(s) - 1;
|
|
Packit |
4a5d52 |
while(g_ascii_isspace(*t) && t > s) *(t--) = '\0'; /* Chomp trailing spaces */
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
__IDL_do_pragma (s);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>{cpp_status} {
|
|
Packit |
4a5d52 |
gchar *mytext = yytext;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (g_ascii_isspace (*mytext))
|
|
Packit |
4a5d52 |
mytext++;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
g_assert (mytext [0] == '#' && mytext [1] == ' ');
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
mytext += 2;
|
|
Packit |
4a5d52 |
IDL_parse_cpp_status(mytext);
|
|
Packit |
4a5d52 |
if (yylval.tree)
|
|
Packit |
4a5d52 |
tokreturn (TOK_SRCFILE);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>{cpp_status_ms} {
|
|
Packit |
4a5d52 |
gchar *mytext = yytext;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (g_ascii_isspace (*mytext))
|
|
Packit |
4a5d52 |
mytext++;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
g_assert (mytext [0] == '#' &&
|
|
Packit |
4a5d52 |
mytext [1] == 'l' &&
|
|
Packit |
4a5d52 |
mytext [2] == 'i' &&
|
|
Packit |
4a5d52 |
mytext [3] == 'n' &&
|
|
Packit |
4a5d52 |
mytext [4] == 'e' &&
|
|
Packit |
4a5d52 |
g_ascii_isspace(mytext [5]));
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
mytext += 6;
|
|
Packit |
4a5d52 |
IDL_parse_cpp_status(mytext);
|
|
Packit |
4a5d52 |
if (yylval.tree)
|
|
Packit |
4a5d52 |
tokreturn (TOK_SRCFILE);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>{cpp_other} ;
|
|
Packit |
4a5d52 |
<*>{whitespace} ;
|
|
Packit |
4a5d52 |
{b8_int} {
|
|
Packit |
4a5d52 |
yylval.integer = 0;
|
|
Packit |
4a5d52 |
sscanf (yytext, "%" IDL_LL "o", &yylval.integer);
|
|
Packit |
4a5d52 |
tokreturn (TOK_INTEGER);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{b10_uint} {
|
|
Packit |
4a5d52 |
yylval.integer = 0;
|
|
Packit |
4a5d52 |
sscanf (yytext, "%" IDL_LL "u", &yylval.integer);
|
|
Packit |
4a5d52 |
tokreturn (TOK_INTEGER);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{b16_int} {
|
|
Packit |
4a5d52 |
yylval.integer = 0;
|
|
Packit |
4a5d52 |
sscanf (yytext + 2, "%" IDL_LL "x", &yylval.integer);
|
|
Packit |
4a5d52 |
tokreturn (TOK_INTEGER);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{fixed_lit} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_FIXEDP);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{float_lit} {
|
|
Packit |
4a5d52 |
yylval.floatp = atof (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_FLOATP);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
FALSE tokreturn (TOK_FALSE);
|
|
Packit |
4a5d52 |
TRUE tokreturn (TOK_TRUE);
|
|
Packit |
4a5d52 |
any tokreturn (TOK_ANY);
|
|
Packit |
4a5d52 |
attribute tokreturn (TOK_ATTRIBUTE);
|
|
Packit |
4a5d52 |
boolean tokreturn (TOK_BOOLEAN);
|
|
Packit |
4a5d52 |
case tokreturn (TOK_CASE);
|
|
Packit |
4a5d52 |
char tokreturn (TOK_CHAR);
|
|
Packit |
4a5d52 |
const tokreturn (TOK_CONST);
|
|
Packit |
4a5d52 |
context tokreturn (TOK_CONTEXT);
|
|
Packit |
4a5d52 |
default tokreturn (TOK_DEFAULT);
|
|
Packit |
4a5d52 |
double tokreturn (TOK_DOUBLE);
|
|
Packit |
4a5d52 |
enum tokreturn (TOK_ENUM);
|
|
Packit |
4a5d52 |
exception tokreturn (TOK_EXCEPTION);
|
|
Packit |
4a5d52 |
fixed tokreturn (TOK_FIXED);
|
|
Packit |
4a5d52 |
float tokreturn (TOK_FLOAT);
|
|
Packit |
4a5d52 |
in tokreturn (TOK_IN);
|
|
Packit |
4a5d52 |
inout tokreturn (TOK_INOUT);
|
|
Packit |
4a5d52 |
interface tokreturn (TOK_INTERFACE);
|
|
Packit |
4a5d52 |
long tokreturn (TOK_LONG);
|
|
Packit |
4a5d52 |
module tokreturn (TOK_MODULE);
|
|
Packit |
4a5d52 |
native tokreturn (TOK_NATIVE);
|
|
Packit |
4a5d52 |
octet tokreturn (TOK_OCTET);
|
|
Packit |
4a5d52 |
oneway tokreturn (TOK_ONEWAY);
|
|
Packit |
4a5d52 |
out tokreturn (TOK_OUT);
|
|
Packit |
4a5d52 |
raises tokreturn (TOK_RAISES);
|
|
Packit |
4a5d52 |
readonly tokreturn (TOK_READONLY);
|
|
Packit |
4a5d52 |
sequence tokreturn (TOK_SEQUENCE);
|
|
Packit |
4a5d52 |
short tokreturn (TOK_SHORT);
|
|
Packit |
4a5d52 |
string tokreturn (TOK_STRING);
|
|
Packit |
4a5d52 |
struct tokreturn (TOK_STRUCT);
|
|
Packit |
4a5d52 |
switch tokreturn (TOK_SWITCH);
|
|
Packit |
4a5d52 |
typedef tokreturn (TOK_TYPEDEF);
|
|
Packit |
4a5d52 |
union tokreturn (TOK_UNION);
|
|
Packit |
4a5d52 |
unsigned tokreturn (TOK_UNSIGNED);
|
|
Packit |
4a5d52 |
<XP>\.\.\. tokreturn (TOK_VARARGS);
|
|
Packit |
4a5d52 |
void tokreturn (TOK_VOID);
|
|
Packit |
4a5d52 |
wchar tokreturn (TOK_WCHAR);
|
|
Packit |
4a5d52 |
wstring tokreturn (TOK_WSTRING);
|
|
Packit |
4a5d52 |
:: tokreturn (TOK_OP_SCOPE);
|
|
Packit |
4a5d52 |
\>\> tokreturn (TOK_OP_SHR);
|
|
Packit |
4a5d52 |
\<\< tokreturn (TOK_OP_SHL);
|
|
Packit |
4a5d52 |
{declspec} {
|
|
Packit |
4a5d52 |
char *s = g_strdup (yytext);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
/* Get the parenthesized expression (ignoring whitespace) */
|
|
Packit |
4a5d52 |
sscanf (yytext, "__declspec %*[(] %[A-Za-z_] %*[)]", s);
|
|
Packit |
4a5d52 |
yylval.str = s;
|
|
Packit |
4a5d52 |
__IDL_cur_line += count_nl (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_DECLSPEC);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{happy_ident} {
|
|
Packit |
4a5d52 |
#if 0
|
|
Packit |
4a5d52 |
if ((__IDL_flags & IDLF_TYPECODES) && strcmp (yytext, "TypeCode") == 0)
|
|
Packit |
4a5d52 |
tokreturn (TOK_TYPECODE);
|
|
Packit |
4a5d52 |
#endif
|
|
Packit |
4a5d52 |
if (__IDL_typecodes_as_tok>0 && strcmp (yytext, "TypeCode") == 0)
|
|
Packit |
4a5d52 |
tokreturn (TOK_TYPECODE);
|
|
Packit |
4a5d52 |
if ( (__IDL_pidl <= 0) && strcmp(yytext, "Object")==0 )
|
|
Packit |
4a5d52 |
tokreturn (TOK_OBJECT);
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_IDENT);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{escaped_ident} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (&yytext[1]);
|
|
Packit |
4a5d52 |
tokreturn (TOK_IDENT);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{warn1_ident} {
|
|
Packit |
4a5d52 |
if (!warn_underscores) {
|
|
Packit |
4a5d52 |
yywarningv (IDL_WARNING2,
|
|
Packit |
4a5d52 |
"`%s' underscores within identifiers are discouraged for use "
|
|
Packit |
4a5d52 |
"with C-language IDL mappings", yytext);
|
|
Packit |
4a5d52 |
warn_underscores = 1;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_IDENT);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<PROP>] {
|
|
Packit |
4a5d52 |
__IDL_flagsi &= ~IDLFP_PROPERTIES;
|
|
Packit |
4a5d52 |
SELECT_RESTART;
|
|
Packit |
4a5d52 |
tokreturn (yytext[0]);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<PROP>{prop_key} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext);
|
|
Packit |
4a5d52 |
tokreturn (TOK_PROP_KEY);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<PROP>{prop_value} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext + 1);
|
|
Packit |
4a5d52 |
yylval.str[strlen (yylval.str) - 1] = 0;
|
|
Packit |
4a5d52 |
tokreturn (TOK_PROP_VALUE);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<NATIVE>{native_type} {
|
|
Packit |
4a5d52 |
__IDL_flagsi &= ~IDLFP_NATIVE;
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext);
|
|
Packit |
4a5d52 |
yylval.str[strlen (yylval.str) - 1] = 0;
|
|
Packit |
4a5d52 |
tokreturn (TOK_NATIVE_TYPE);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{sqstring} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext + 1);
|
|
Packit |
4a5d52 |
yylval.str[strlen (yytext) - 2] = 0;
|
|
Packit |
4a5d52 |
tokreturn (TOK_SQSTRING);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
{dqstring} {
|
|
Packit |
4a5d52 |
yylval.str = g_strdup (yytext + 1);
|
|
Packit |
4a5d52 |
yylval.str[strlen (yytext) - 2] = 0;
|
|
Packit |
4a5d52 |
tokreturn (TOK_DQSTRING);
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>{newline} ++__IDL_cur_line;
|
|
Packit |
4a5d52 |
<*>\/\/.* ;
|
|
Packit |
4a5d52 |
<*>\/\* {
|
|
Packit |
4a5d52 |
int c;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
while (1) {
|
|
Packit |
4a5d52 |
while ((c = input ()) != '*' && c != EOF)
|
|
Packit |
4a5d52 |
if (c == '\n') ++__IDL_cur_line;
|
|
Packit |
4a5d52 |
if (c == '*') {
|
|
Packit |
4a5d52 |
while ((c = input ()) == '*') ;
|
|
Packit |
4a5d52 |
if (c == '/') break;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
if (c == '\n') ++__IDL_cur_line;
|
|
Packit |
4a5d52 |
if (c == EOF) {
|
|
Packit |
4a5d52 |
yywarning (IDL_WARNING1, "End of file in comment");
|
|
Packit |
4a5d52 |
break;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
<*>. tokreturn (yytext[0]);
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
%%
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
void __IDL_lex_init (void)
|
|
Packit |
4a5d52 |
{
|
|
Packit |
4a5d52 |
__IDL_inputcb = NULL;
|
|
Packit |
4a5d52 |
__IDL_cur_line = 1;
|
|
Packit |
4a5d52 |
__IDL_cur_token_line = 0;
|
|
Packit |
4a5d52 |
__IDL_prev_token_line = 0;
|
|
Packit |
4a5d52 |
__IDL_cur_filename = NULL;
|
|
Packit |
4a5d52 |
__IDL_cur_fileinfo = NULL;
|
|
Packit |
4a5d52 |
warn_underscores = 0;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
void __IDL_lex_cleanup (void)
|
|
Packit |
4a5d52 |
{
|
|
Packit |
4a5d52 |
__IDL_cur_filename = NULL;
|
|
Packit |
4a5d52 |
#ifdef YY_NEW_FILE
|
|
Packit |
4a5d52 |
YY_NEW_FILE; /* obsolete with newer versions of flex */
|
|
Packit |
4a5d52 |
#endif
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
int yywrap (void)
|
|
Packit |
4a5d52 |
{
|
|
Packit |
4a5d52 |
return 1;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
static int count_nl (const char *s)
|
|
Packit |
4a5d52 |
{
|
|
Packit |
4a5d52 |
int i;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
for (i = 0;
|
|
Packit |
4a5d52 |
(s = strchr (s, '\n')) != NULL;
|
|
Packit |
4a5d52 |
++s, ++i) ;
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
return i;
|
|
Packit |
4a5d52 |
}
|
|
Packit |
4a5d52 |
|
|
Packit |
4a5d52 |
/*
|
|
Packit |
4a5d52 |
* Local variables:
|
|
Packit |
4a5d52 |
* mode: C
|
|
Packit |
4a5d52 |
* c-basic-offset: 8
|
|
Packit |
4a5d52 |
* tab-width: 8
|
|
Packit |
4a5d52 |
* indent-tabs-mode: t
|
|
Packit |
4a5d52 |
* End:
|
|
Packit |
4a5d52 |
*/
|