[net.sources] Ada parser --- update to accept keywords like 'If'

russell@muddcs.UUCP (Russell Shilling) (11/30/84)

     Here is a slightly modified lex source for the ada parser which was
presented some time back.  You may not wish to change your parser by
using this source, since the size of the lexical analyzer grows
considerably (note the changes in %whatever compared to the original).
     This lex source will make the parser recognize keywords regardless
of the case of the characters in them (i.e. If, Begin, Do, End, etc. will
now be valid).  Hope this will help anyone using the parser code presented.

	Russell Shilling
		UUCP:	{ allegra, ihnp4, seismo }!scgvaxd!muddcs!russell
		ARPA:	muddcs!russell@ucla-cs
	Always eat from the four basic food groups:
		Beer, Ice Cream, Chips and Salsa
----- CUT HERE -----
%{
/*-----------------------------------------------------------------------*/
/* Lexical input for LEX for LALR(1) Grammar for ANSI Ada                */
/*                                                                       */
/*              Herman Fischer                                           */
/*            Litton Data Systems                                        */
/*              March 26, 1984                                           */
/*                                                                       */
/* Accompanies Public Domain YACC format Ada grammar                     */
/*                                                                       */
/*-----------------------------------------------------------------------*/
#include        "y.tab.h"
int             lines = 1;      /* line number being processed*/

char id_string[256];            /* identifier being processed */
char char_lit[256];             /* character or string literal*/
char num_lit[80];               /* numeric literal            */
int num_errors = 0;             /* number of errors encountered*/

#define linenum printf("\n%5d ",++lines)
%}

%e      1500	/* tree nodes array size   */
%p      4500	/* positions               */
%a      4000	/* transitions array size  */
%k      1000	/* packed character classes*/
%o      8000	/* output array size       */

		/* Character Class Definitions so that */
		/* Parser is NOT Case Sensitive        */
A	[Aa]
B	[Bb]
C	[Cc]
D	[Dd]
E	[Ee]
F	[Ff]
G	[Gg]
H	[Hh]
I	[Ii]
J	[Jj]
K	[Kk]
L	[Ll]
M	[Mm]
N	[Nn]
O	[Oo]
P	[Pp]
Q	[Qq]
R	[Rr]
S	[Ss]
T	[Tt]
U	[Uu]
V	[Vv]
W	[Ww]
X	[Xx]
Y	[Yy]
Z	[Zz]

%START IDENT Z

%%
{A}{B}{O}{R}{T}			{ECHO; BEGIN Z; return(ABORT_);}
{A}{B}{S}			{ECHO; BEGIN Z; return(ABS_);}
{A}{C}{C}{E}{P}{T}		{ECHO; BEGIN Z; return(ACCEPT_);}
{A}{C}{C}{E}{S}{S}		{ECHO; BEGIN Z; return(ACCESS_);}
{A}{L}{L}			{ECHO; BEGIN Z; return(ALL_);}
{A}{N}{D}			{ECHO; BEGIN Z; return(AND_);}
{A}{R}{R}{A}{Y}			{ECHO; BEGIN Z; return(ARRAY_);}
{A}{T}				{ECHO; BEGIN Z; return(AT_);}
{B}{E}{G}{I}{N}			{ECHO; BEGIN Z; return(BEGIN_);}
{B}{O}{D}{Y}			{ECHO; BEGIN Z; return(BODY_);}
{C}{A}{S}{E}			{ECHO; BEGIN Z; return(CASE_);}
{C}{O}{N}{S}{T}{A}{N}{T}	{ECHO; BEGIN Z; return(CONSTANT_);}
{D}{E}{C}{L}{A}{R}{E}		{ECHO; BEGIN Z; return(DECLARE_);}
{D}{E}{L}{A}{Y}			{ECHO; BEGIN Z; return(DELAY_);}
{D}{E}{L}{T}{A}			{ECHO; BEGIN Z; return(DELTA_);}
{D}{I}{G}{I}{T}{S}		{ECHO; BEGIN Z; return(DIGITS_);}
{D}{O}				{ECHO; BEGIN Z; return(DO_);}
{E}{L}{S}{E}			{ECHO; BEGIN Z; return(ELSE_);}
{E}{L}{S}{I}{F}			{ECHO; BEGIN Z; return(ELSIF_);}
{E}{N}{D}			{ECHO; BEGIN Z; return(END_);}
{E}{N}{T}{R}{Y}			{ECHO; BEGIN Z; return(ENTRY_);}
{E}{X}{C}{E}{P}{T}{I}{O}{N}	{ECHO; BEGIN Z; return(EXCEPTION_);}
{E}{X}{I}{T}			{ECHO; BEGIN Z; return(EXIT_);}
{F}{O}{R}			{ECHO; BEGIN Z; return(FOR_);}
{F}{U}{N}{C}{T}{I}{O}{N}	{ECHO; BEGIN Z; return(FUNCTION_);}
{G}{E}{N}{E}{R}{I}{C}		{ECHO; BEGIN Z; return(GENERIC_);}
{G}{O}{T}{O}			{ECHO; BEGIN Z; return(GOTO_);}
{I}{F}				{ECHO; BEGIN Z; return(IF_);}
{I}{N}				{ECHO; BEGIN Z; return(IN_);}
{I}{S}				{ECHO; BEGIN Z; return(IS_);}
{L}{I}{M}{I}{T}{E}{D} 		{ECHO; BEGIN Z; return(LIMITED_);}
{L}{O}{O}{P}			{ECHO; BEGIN Z; return(LOOP_);}
{M}{O}{D}			{ECHO; BEGIN Z; return(MOD_);}
{N}{E}{W}			{ECHO; BEGIN Z; return(NEW_);}
{N}{O}{T}			{ECHO; BEGIN Z; return(NOT_);}
{N}{U}{L}{L}			{ECHO; BEGIN Z; return(NULL_);}
{O}{F}				{ECHO; BEGIN Z; return(OF_);}
{O}{R}				{ECHO; BEGIN Z; return(OR_);}
{O}{T}{H}{E}{R}{S}		{ECHO; BEGIN Z; return(OTHERS_);}
{O}{U}{T}			{ECHO; BEGIN Z; return(OUT_);}
{P}{A}{C}{K}{A}{G}{E} 		{ECHO; BEGIN Z; return(PACKAGE_);}
{P}{R}{A}{G}{M}{A}		{ECHO; BEGIN Z; return(PRAGMA_);}
{P}{R}{I}{V}{A}{T}{E}		{ECHO; BEGIN Z; return(PRIVATE_);}
{P}{R}{O}{C}{E}{D}{U}{R}{E}	{ECHO; BEGIN Z; return(PROCEDURE_);}
{R}{A}{I}{S}{E}			{ECHO; BEGIN Z; return(RAISE_);}
{R}{A}{N}{G}{E}			{ECHO; BEGIN Z; return(RANGE_);}
{R}{E}{C}{O}{R}{D}		{ECHO; BEGIN Z; return(RECORD_);}
{R}{E}{M}			{ECHO; BEGIN Z; return(REM_);}
{R}{E}{N}{A}{M}{E}{S}		{ECHO; BEGIN Z; return(RENAMES_);}
{R}{E}{T}{U}{R}{N}		{ECHO; BEGIN Z; return(RETURN_);}
{R}{E}{V}{E}{R}{S}{E}		{ECHO; BEGIN Z; return(REVERSE_);}
{S}{E}{L}{E}{C}{T}		{ECHO; BEGIN Z; return(SELECT_);}
{S}{E}{P}{A}{R}{A}{T}{E}	{ECHO; BEGIN Z; return(SEPARATE_);}
{S}{U}{B}{T}{Y}{P}{E}		{ECHO; BEGIN Z; return(SUBTYPE_);}
{T}{A}{S}{K}			{ECHO; BEGIN Z; return(TASK_);}
{T}{E}{R}{M}{I}{N}{A}{T}{E}	{ECHO; BEGIN Z; return(TERMINATE_);}
{T}{H}{E}{N}			{ECHO; BEGIN Z; return(THEN_);}
{T}{Y}{P}{E}			{ECHO; BEGIN Z; return(TYPE_);}
{U}{S}{E}			{ECHO; BEGIN Z; return(USE_);}
{W}{H}{E}{N}			{ECHO; BEGIN Z; return(WHEN_);}
{W}{H}{I}{L}{E}			{ECHO; BEGIN Z; return(WHILE_);}
{W}{I}{T}{H}			{ECHO; BEGIN Z; return(WITH_);}
{X}{O}{R}			{ECHO; BEGIN Z; return(XOR_);}
"=>"    	{ECHO; BEGIN Z; return(ARROW_);}
".."    	{ECHO; BEGIN Z; return(DBLDOT_);}
"**"    	{ECHO; BEGIN Z; return(EXP_);}
":="    	{ECHO; BEGIN Z; return(ASSIGN_);}
"/="    	{ECHO; BEGIN Z; return(NOTEQL_);}
">="    	{ECHO; BEGIN Z; return(GTEQL_);}
"<="    	{ECHO; BEGIN Z; return(LTEQ_);}
"<<"    	{ECHO; BEGIN Z; return(L_LBL_);}
">>"    	{ECHO; BEGIN Z; return(R_LBL_);}
"<>"    	{ECHO; BEGIN Z; return(BOX_);}
"&"     	{ECHO; BEGIN Z; return('&'); }
"("     	{ECHO; BEGIN Z; return('('); }
")"     	{ECHO; BEGIN IDENT; return(')'); }
"*"     	{ECHO; BEGIN Z; return('*'); }
"+"     	{ECHO; BEGIN Z; return('+'); }
","     	{ECHO; BEGIN Z; return(','); }
"-"     	{ECHO; BEGIN Z; return('-'); }
"."     	{ECHO; BEGIN Z; return('.'); }
"/"     	{ECHO; BEGIN Z; return('/'); }
":"     	{ECHO; BEGIN Z; return(':'); }
";"     	{ECHO; BEGIN Z; return(';'); }
"<"     	{ECHO; BEGIN Z; return('<'); }
"="     	{ECHO; BEGIN Z; return('='); }
">"     	{ECHO; BEGIN Z; return('>'); }
"|"     	{ECHO; BEGIN Z; return('|'); }
<IDENT>\'	{ECHO; BEGIN Z; return('\'');}   /* type mark only*/


[a-z_A-Z][a-z_A-Z0-9]*       {ECHO; BEGIN IDENT; strcpy(id_string,yytext);
			      return(identifier);}
[0-9][0-9_]*([.][0-9_]+)?({E}[-+]?[0-9_]+)?  {
			      ECHO; BEGIN Z; strcpy(num_lit,yytext);
			      return(numeric_literal);}

[0-9][0-9_]*#[0-9a-fA-F_]+([.][0-9a-fA-F_]+)?#({E}[-+]?[0-9_]+)? {
			      ECHO; BEGIN Z; strcpy(num_lit,yytext);
			      return(numeric_literal);}


\"([^"]*(\"\")*)*\" {ECHO; BEGIN Z; strcpy(char_lit,yytext);
			  return(string_literal);}
<Z>\'([^']|\'\')\'    {ECHO; BEGIN Z; strcpy(char_lit,yytext);
			  return(character_literal);}


[ \t]   ECHO;          /* ignore spaces and tabs*/
"--".*  ECHO;          /* ignore comments to end-of-line*/

.       {ECHO; printf("?? lexical error [%s] ??\n\t", yytext);
					   /* unlexable chars*/
	++num_errors;}
[\n]    linenum;
%%
----- CUT HERE -----
-- 
	Russell Shilling
		UUCP:	{ allegra, ihnp4, seismo }!scgvaxd!muddcs!russell
		ARPA:	muddcs!russell@ucla-cs
	Always eat from the four basic food groups:
		Beer, Ice Cream, Chips and Salsa