|
Packit |
b099d7 |
%{
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#if defined(__STDC__)
|
|
Packit |
b099d7 |
#include <string.h>
|
|
Packit |
b099d7 |
#include <stdlib.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifndef XmConst
|
|
Packit |
b099d7 |
#if defined(__STDC__) || !defined( NO_CONST )
|
|
Packit |
b099d7 |
#define XmConst const
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
#define XmConst
|
|
Packit |
b099d7 |
#endif /* __STDC__ */
|
|
Packit |
b099d7 |
#endif /* XmConst */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* lex program to construct token data for WML to generate token
|
|
Packit |
b099d7 |
* table data.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* stdin is the file Uil.y
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* it is searched for each occurance of a line starting with '%token'
|
|
Packit |
b099d7 |
* when found various fields are extracted.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* when Uil.y has been scanned the collected data is written
|
|
Packit |
b099d7 |
* to stdout.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%a 9999 /* transitions */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <stdio.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define TRUE 1
|
|
Packit |
b099d7 |
#define FALSE 0
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MAX_SYN 10
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef yywrap
|
|
Packit |
b099d7 |
#undef yywrap
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct _token
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
char * name;
|
|
Packit |
b099d7 |
char * id;
|
|
Packit |
b099d7 |
char * class;
|
|
Packit |
b099d7 |
int num_syn;
|
|
Packit |
b099d7 |
char * syn[MAX_SYN];
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
TokenRec, *Token;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
TokenRec token[1000];
|
|
Packit |
b099d7 |
TokenRec temp;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void add_token ();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int phase = 0;
|
|
Packit |
b099d7 |
int keyword_count;
|
|
Packit |
b099d7 |
int line_num = 0;
|
|
Packit |
b099d7 |
int in_comment = 0;
|
|
Packit |
b099d7 |
int in_include = 0;
|
|
Packit |
b099d7 |
int in_token = 0;
|
|
Packit |
b099d7 |
int state = 0;
|
|
Packit |
b099d7 |
int used = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%%
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
[\n] {
|
|
Packit |
b099d7 |
if (in_token == TRUE)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
add_token (&temp);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
in_token = FALSE;
|
|
Packit |
b099d7 |
line_num++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
[ \t] { /* swallow */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
"/\*" { /* swallow */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
^%token {
|
|
Packit |
b099d7 |
in_token = TRUE;
|
|
Packit |
b099d7 |
state = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
[a-zA-Z0-9_]+ {
|
|
Packit |
b099d7 |
if (in_token == TRUE)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
switch (state)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case 0:
|
|
Packit |
b099d7 |
temp.name = (char *)
|
|
Packit |
b099d7 |
strcpy ((char *)
|
|
Packit |
b099d7 |
malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
temp.num_syn = 0;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case 1:
|
|
Packit |
b099d7 |
temp.id = (char *)
|
|
Packit |
b099d7 |
strcpy ((char *)
|
|
Packit |
b099d7 |
malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case 2:
|
|
Packit |
b099d7 |
temp.class = (char *)
|
|
Packit |
b099d7 |
strcpy ((char *)
|
|
Packit |
b099d7 |
malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case 3:
|
|
Packit |
b099d7 |
temp.syn[temp.num_syn] = (char *)
|
|
Packit |
b099d7 |
strcpy ((char *)
|
|
Packit |
b099d7 |
malloc (strlen ((XmConst char *)yytext) + 1), (XmConst char *)yytext);
|
|
Packit |
b099d7 |
temp.num_syn++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (temp.num_syn > MAX_SYN)
|
|
Packit |
b099d7 |
printf (
|
|
Packit |
b099d7 |
"ERROR, too many synonyms, line %d\n",
|
|
Packit |
b099d7 |
line_num);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
state++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
. { /* swallow */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
%%
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
add_token (t) /* keep sorted by name */
|
|
Packit |
b099d7 |
Token t;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i, j;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (j=0; j
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (strcmp (token[j].name, t->name) > 0) /* goes here */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
for (i=used++; i>j; i--) /* make hole */
|
|
Packit |
b099d7 |
token[i] = token[i-1];
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
token[j] = *t; /* insert it */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* if we get there then it goes at the end of the list
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
token[used++] = *t;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
int yywrap ()
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
printf ("%s %s %s\n", token[i].name, token[i].id, token[i].class);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return (1);
|
|
Packit |
b099d7 |
}
|