home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
wxos2233.zip
/
wxOS2-2_3_3.zip
/
wxWindows-2.3.3
/
src
/
common
/
lexer.l
< prev
next >
Wrap
Text File
|
1999-10-25
|
4KB
|
193 lines
SIGN [+-]
DIGIT [0-9]
ALPHA [a-zA-Z_]
ALPHADIGIT [a-zA-Z_0-9]
STRINGCHAR [^"\\]
WORDCHAR [^'\\]
%{
/*
* File: lexer.l
* Description: Lexical analyser for PROLOGIO; can be used with
* either lex and flex.
*/
#include <string.h>
#include <unistd.h>
/* +++steve162e: added, otherwise, PROIO_input will be undefined (at least under LINUX)
please check, if this is also TRUE under other UNIXes.
*/
#if defined(FLEX_SCANNER) && defined(_LINUX)
#define PROIO_input my_input
#endif
/* ---steve162e */
#include "wx/expr.h"
#define Return(x) return x;
#if defined(VMS) && !defined(strdup)
#define strdup(s) (strcpy((char *)malloc(strlen(s)+1), s));
#endif
static size_t lex_buffer_length = 0;
static const char *lex_buffer = NULL;
static size_t lex_string_ptr = 0;
static int lex_read_from_string = 0;
static int my_input(void);
#ifdef FLEX_SCANNER
# undef YY_INPUT
# define YY_INPUT(buf,result,max_size) \
if (lex_read_from_string) \
{ int c = my_input(); result = (c == 0) ? YY_NULL : ((buf)[0]=(c), 1); } \
else \
if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \
YY_FATAL_ERROR( "read() in flex scanner failed" );
#else
# undef unput
# define unput(_c) my_unput(_c)
static int my_unput(char);
#endif
%}
%%
{SIGN}?{DIGIT}+ {yylval.s = strdup(yytext); Return(INTEGER);}
"e" Return(EXP);
{ALPHA}{ALPHADIGIT}* {yylval.s = strdup(yytext); Return(WORD);}
"'"{WORDCHAR}*"'" {int len = strlen(yytext);
yytext[len-1] = 0;
yylval.s = strdup(yytext+1);
Return(WORD);}
\"({STRINGCHAR}|\\\"|\|\\\\|\\)*\" {yylval.s = strdup(yytext); Return(STRING);}
"(" Return(OPEN);
")" Return(CLOSE);
"," Return(COMMA);
"[" Return(OPEN_SQUARE);
"]" Return(CLOSE_SQUARE);
"=" Return(EQUALS);
"." Return(PERIOD);
[ \t] ;
\n ;
"/*" { loop:
#ifdef __cplusplus
while (yyinput() != '*');
switch (yyinput())
#else
while (input() != '*');
switch (input())
#endif
{
case '/': break;
case '*': unput('*');
default: goto loop;
}
}
. Return(ERROR);
%%
#ifdef FLEX_SCANNER
static int lex_input() {
return input();
}
#else /* BSD/AT&T lex */
#ifndef input
# error "Sorry, but need either flex or AT&T lex"
#endif
static int lex_input() {
return input();
}
# undef input
# define input() my_input()
static int my_unput(char c)
{
if (lex_read_from_string != 0) {
/* Make sure we have something */
if (lex_string_ptr) {
if (c == '\n') yylineno--;
lex_string_ptr--;
}
} else {
yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;
/* unput(c); Causes infinite recursion! */
}
return c;
}
#endif
/* Public */
void LexFromFile(FILE *fd)
{
lex_read_from_string = 0;
yyin = fd;
/* Don't know why this is necessary, but otherwise
* lex only works _once_!
*/
#ifdef FLEX_SCANNER
yyrestart(fd);
yy_init = 1;
#endif
}
void LexFromString(char *buffer)
{
lex_read_from_string = 1;
lex_buffer = buffer;
lex_buffer_length = strlen(buffer);
lex_string_ptr = 0;
/* Don't know why this is necessary, but otherwise
* lex only works _once_!
*/
#ifdef FLEX_SCANNER
yy_init = 1;
#endif
}
static int my_input( void )
{
if (lex_read_from_string) {
if (lex_string_ptr == lex_buffer_length)
return 0;
else {
char c = lex_buffer[lex_string_ptr++];
#ifndef FLEX_SCANNER
if (c == '\n') yylineno++;
#endif
return c;
}
} else {
return lex_input();
}
}
void wxExprCleanUp()
{
#ifdef FLEX_SCANNER
if (yy_current_buffer)
yy_delete_buffer(yy_current_buffer);
#endif
}