YACC and LEX inputs for ANSI Ada(tm)

Arnold Robbins arnold at gatech.UUCP
Tue Apr 10 07:27:00 AEST 1984


Here are the files I promised in net.lang.ada.  Rememeber, send all followups
to the original author, I am just posting these since he cannot get to
net.sources.

Don't forget to remove my .signature!

(Tear at the dotted line)
----------------------------------------------------
echo 'extracting --- ada.y' 1>&2
cat >ada.y <<'!!FUNKY STUFF!!'
/*---------------------------------------------------------------------------*/
/*									     */
/*			 A LALR(1) grammar for ANSI Ada*		     */
/*									     */
/*			 Adapted for YACC (UNIX) Inputs 		     */
/*									     */
/*                                                                           */
/*                             Herman Fischer                                */
/*                           Litton Data Systems                             */
/*                       8000 Woodley Ave., ms 44-30                         */
/*                              Van Nuys, CA                                 */
/*                                                                           */
/*                              818/902-5139                                 */
/*                           HFischer at eclb.arpa                              */
/*                        {cepu,trwrb}!litvax!fischer                        */
/*                                                                           */
/*                             March 26, 1984                                */
/*									     */
/*                   A Contribution to the Public Domain                     */
/*                                   for                                     */
/*            Research, Development, and Training Purposes Only              */
/*                                                                           */
/*       Any Corrections or Problems are to be Reported to the Author        */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/*                              adapted from                                 */
/*                              the grammar                                  */
/*                                  by:                                      */
/*									     */
/*            Gerry Fisher                         Philippe Charles          */
/*                                                                           */
/*    Computer Sciences Corporation     &             Ada  Project           */
/*         4045 Hancock Street                     New York University       */
/*         San Diego, CA 92121                      251 Mercer Street        */
/*                                               New York, New York 10012    */
/*									     */
/*									     */
/*    This grammar is organized in the same order as the syntax summary     */
/* in appendix E of the ANSI Ada Reference Manual.   All reserved words     */
/* are	 written  in  upper  case  letters.    The  lexical  categories     */
/* numeric_literal, string_literal, etc, are viewed as terminals.   The     */
/* rules  for  pragmas as  stated in  chapter 2,  section 8,  have been     */
/* incorporated in the grammar.   Comments are included wherever we had     */
/* to deviate from the syntax given in appendix E. Different symbols	    */
/* used here (to comply with yacc requirements) are of note:		    */
/*	{,something}	is denoted ...something..			     */
/*	{something}	is denoted ..something..			     */
/*	[something]	is denoted .something.				    */
/* Constructs involving                                                     */
/* meta brackets, e.g., ...identifier.. are represented by a nonterminal    */
/* formed  by  concatenating  the  construct symbols ( as ...identifier..   */
/* in the example)   for  which  the  rules are given at the end.  When     */
/* reading  this  grammar,  it	is  important to  note that all symbols     */
/* appearing  in the  rules are  separated by  one or  more  blanks.  A     */
/* string  such  as   'identifier_type_mark   is  actually  a   single      */
/* nonterminal symbol defined at the end of the rules.  The '/*' symbol     */
/* is used  to indicate that the rest of  the  line is a comment,  just     */
/* as in yacc programs.                                                     */
/*                                                                          */
/*     This grammar is presented here in a form suitable for input to a     */
/* yacc parser generator.  It has  been  processed  by the Bell System      */
/* III lex/yacc combination, and tested against over 400 ACVC tests.        */
/*									    */
/* *Ada is a registered trade mark of the  Department of  Defense  (Ada     */
/* Joint Program  Office).						     */
/*									     */
/*---------------------------------------------------------------------------*/


/*%terminals -----------------------------------------------------------     */

%token ABORT_ ABS_ ACCEPT_  ACCESS_ ALL_  AND_ ARRAY_
%token AT_ BEGIN_  BODY_ CASE_  CONSTANT_
%token DECLARE_ DELAY_ DELTA_ DIGITS_ DO_ ELSE_ ELSIF_
%token END_  ENTRY_ EXCEPTION_ EXIT_ FOR_
%token FUNCTION_ GENERIC_  GOTO_ IF_ IN_  IS_ LIMITED_
%token LOOP_ MOD_  NEW_ NOT_  NULL_ OF_ OR_
%token OTHERS_ OUT_  PACKAGE_ PRAGMA_  PRIVATE_
%token PROCEDURE_  RAISE_  RANGE_ RECORD_ REM_
%token RENAMES_ RETURN_ REVERSE_  SELECT_  SEPARATE_
%token SUBTYPE_	TASK_ TERMINATE_	THEN_
%token TYPE_ USE_ WHEN_ WHILE_ WITH_ XOR_

%token identifier numeric_literal string_literal character_literal
%token ARROW_ DBLDOT_ EXP_ ASSIGN_ NOTEQL_ GTEQL_ LTEQ_ L_LBL_ R_LBL_ BOX_

%start compilation

%%


/* 2.8 */

prag	:
	PRAGMA_ identifier .arg_ascs ';' ;

arg_asc	      :
	expr
   |	identifier ARROW_ expr  ;



/* 3.1 */

basic_d  :
	object_d
   |	ty_d	       |  subty_d
   |	subprg_d       |  pkg_d
   |	task_d	       |  gen_d
   |	excptn_d       |  gen_inst
   |    renaming_d     |  number_d
   |    error ';' ;


/* 3.2 */

object_d  :
      idents ':'           subty_ind ._ASN_expr. ';'
 |    idents ':'  CONSTANT_ subty_ind ._ASN_expr. ';'
 |    idents ':'           c_arr_def ._ASN_expr. ';'
 |    idents ':'  CONSTANT_ c_arr_def ._ASN_expr. ';' ;


number_d  :
	idents ':' CONSTANT_ ASSIGN_ expr ';' ;


idents	 :  identifier ...ident..	;


/* 3.3.1 */

ty_d  :
	full_ty_d
   |	incomplete_ty_d
   |	priv_ty_d  ;

full_ty_d  :
        TYPE_ identifier            IS_ ty_def ';'
   |    TYPE_ identifier discr_part IS_ ty_def ';' ;


ty_def	 :
	enum_ty_def		|  integer_ty_def
   |	real_ty_def			|  array_ty_def
   |	rec_ty_def 		|  access_ty_def
   |	derived_ty_def ;


/* 3.3.2 */

subty_d  :
	SUBTYPE_ identifier IS_ subty_ind ';' ;


subty_ind  :	ty_mk .constrt. ;


ty_mk  :  expanded_n ;


constrt  :
	rng_c
   |	fltg_point_c  |  fixed_point_c
   |	aggr ;



/* 3.4 */

derived_ty_def	 :  NEW_ subty_ind ;


/* 3.5 */

rng_c  :  RANGE_ rng ;

rng  :
	name
   |	sim_expr DBLDOT_ sim_expr	;


/* 3.5.1 */

enum_ty_def	      :
	'(' enum_lit_spec
			...enum_lit_spec.. ')' ;


enum_lit_spec  :  enum_lit ;

enum_lit  : identifier  |  character_literal ;


/* 3.5.4 */

integer_ty_def	 :  rng_c ;


/* 3.5.6 */

real_ty_def	      :
	fltg_point_c  |  fixed_point_c ;


/* 3.5.7 */

fltg_point_c  :
	fltg_accuracy_def .rng_c. ;


fltg_accuracy_def	  :
	DIGITS_ sim_expr ;


/* 3.5.9 */

fixed_point_c	:
	fixed_accuracy_def .rng_c. ;


fixed_accuracy_def	   :
	DELTA_ sim_expr ;


/* 3.6 */

array_ty_def	       :
	uncnstrnd_array_def		|  c_arr_def ;


uncnstrnd_array_def		:
        ARRAY_ '(' idx_subty_def ...idx_subty_def.. ')' OF_
					 subty_ind ;


c_arr_def	      :
	ARRAY_ idx_c OF_ subty_ind ;


idx_subty_def     :     name  RANGE_ BOX_ ;


idx_c  :  '(' dscr_rng ...dscr_rng.. ')' ;


dscr_rng	:
	rng
   |	name rng_c	;



/* 3.7 */

rec_ty_def 	:
	RECORD_
	    cmpons
	END_ RECORD_ ;


cmpons	:
	..prag.. ..cmpon_d.. cmpon_d ..prag..
   |	..prag.. ..cmpon_d.. variant_part ..prag..
   |    ..prag.. NULL_ ';' ..prag.. ;


cmpon_d  :
     idents ':' cmpon_subty_def ._ASN_expr. ';'  ;


cmpon_subty_def	      :  subty_ind ;



/* 3.7.1 */

discr_part  :
        '(' discr_spec ...discr_spec.. ')' ;


discr_spec  :
	idents ':' ty_mk ._ASN_expr. ;


/* 3.7.2 */

/*discr_c	:						     */
/*      '(' discr_asc ... discr_asc.. ')' ;                */
/*									     */
/*discr_asc	    :						     */
/*  .discr_sim_n ..or_discrim_sim_n.. ARROW. expressi */
/*	 ;								     */
/*"discr_c" is included under "aggr"		     */


/* 3.7.3 */

variant_part  :
	CASE_ sim_n IS_
	      ..prag.. variant ..variant..
        END_ CASE_ ';' ;


variant  :
	WHEN_ choice ..or_choice.. ARROW_
	    cmpons ;


choice	:
	sim_expr
   |	name rng_c
   |	sim_expr DBLDOT_ sim_expr
   |	OTHERS_ ;



/* 3.8 */

access_ty_def 	:  ACCESS_ subty_ind ;


/* 3.8.1 */

incomplete_ty_d  :
        TYPE_ identifier ';'
   |    TYPE_ identifier discr_part ';'  ;

/* 3.9 */

decl_part	  :
	..basic_decl_item..
   |    ..basic_decl_item.. body ..later_decl_item.. ;

basic_decl_item 	:
	basic_d
   |	rep_cl  |  use_cl	;


later_decl_item 	:  body
   |	subprg_d	|  pkg_d
   |	task_d	|  gen_d
   |	use_cl		|  gen_inst   ;

body  :  proper_body  |  body_stub  ;

proper_body  :
	subprg_body  |  pkg_body  |  task_body	 ;



/* 4.1 */

name  :  sim_n
   |    character_literal  |  op_symbol
   |	idxed_cmpon
   |	selected_cmpon |  attribute ;


sim_n  :	identifier  ;


prefix	:  name  ;



/* 4.1.1 */

idxed_cmpon  :
	prefix aggr  ;


/* 4.1.2 */

/* slice  :  prefix '(' dscr_rng ')' ;       */
/*						   */
/* included under "idxed_cmpon".		   */


/* 4.1.3 */

selected_cmpon  :  prefix '.' selector  ;

selector  :  sim_n
   |    character_literal  |  op_symbol  |  ALL_  ;



/* 4.1.4 */

attribute  :  prefix '\'' attribute_designator ;


/*  This can be an attribute, idxed cmpon, slice, or subprg call. */
attribute_designator :
	sim_n
   |	DIGITS_
   |	DELTA_
   |	RANGE_	  ;




/* 4.3 */

aggr  :
        '(' cmpon_asc ...cmpon_asc.. ')' ;


cmpon_asc        :
	expr
   |	choice ..or_choice.. ARROW_ expr
   |	sim_expr DBLDOT_ sim_expr
   |	name rng_c ;



/* 4.4 */

expr  :
	rel..AND__rel..  |  rel..AND__THEN__rel..
   |	rel..OR__rel.. |  rel..OR__ELSE__rel..
   |	rel..XOR__rel..  ;


rel  :
	sim_expr .relal_op__sim_expr.
   |	sim_expr.NOT.IN__rng_or_sim_expr.NOT.IN__ty_mk ;


sim_expr  :
	.unary_add_op.term..binary_add_op__term.. ;


term  :  factor..mult_op__factor..  ;


factor	:  pri ._EXP___pri.  |	ABS_ pri  |	NOT_ pri  ;


pri  :
	numeric_literal    |  NULL_
   |	allocator  |  qualified_expr
   |	name
   |	aggr ;

/* "'(' expr ')'" is included under "aggr".  */


/* 4.5 */

/* logical_op  :	AND_  |	OR_  |  XOR_  ;	*/
/*						*/
/* This is an unused syntactic class.		*/


relal_op  :  '='  |  NOTEQL_  |  '<'  |  LTEQ_  |  '>'  |  GTEQL_  ;


binary_add_op  :  '+'  |  '-'  |  '&' ;


unary_add_op  :  '+'  |  '-'  ;


mult_op  :  '*'  |  '/'  |  MOD_  |  REM_  ;


/* highest_precedence_op	:  EXP_	 |   ABS_   |   NOT_   ;	 */
/*								  */
/* This is an unused syntactic class.				  */



/* 4.6 */

/* ty_cnvr  :  ty_mk '(' expr ')' ;     */
/*							  */
/* The class "ty_cnvr" is included under "name".  */


/* 4.7	*/

qualified_expr	:
	ty_mkaggr_or_ty_mkPexprP_ ;



/* 4.8 */

allocator  :
	NEW_ ty_mk
   |	NEW_ ty_mk aggr
   |    NEW_ ty_mk '\'' aggr  ;



/* 5.1 */

seq_of_stmts	:
         ..prag.. stmt ..stmt..  ;


stmt  :
	..label.. sim_stmt  |  ..label.. compound_stmt
   |    error    ';'  ;

sim_stmt  :	null_stmt
   |	assignment_stmt   |  exit_stmt
   |	return_stmt	  |  goto_stmt
   |	delay_stmt	  |  abort_stmt
   |	raise_stmt	  |  code_stmt
   |    name ';' ;

/* Procedure and ent call stmts are included under "name".   */


compound_stmt  :
	if_stmt   |  case_stmt
   |	loop_stmt	  |  block_stmt
   |	accept_stmt  |	select_stmt  ;


label  :  L_LBL_ sim_n R_LBL_  ;


null_stmt  :  NULL_ ';'  ;


/* 5.2 */

assignment_stmt  :  name ASSIGN_ expr ';' ;


/* 5.3 */

if_stmt  :
	IF_ cond THEN_
	    seq_of_stmts
	..ELSIF__cond__THEN__seq_of_stmts..
	.ELSE__seq_of_stmts.
        END_ IF_ ';' ;


cond  :  expr ;


/* 5.4 */

case_stmt	:
	CASE_ expr IS_
	    case_stmt_alt..case_stmt_alt..
        END_ CASE_ ';' ;


case_stmt_alt  :
	WHEN_ choice ..or_choice.. ARROW_
	    seq_of_stmts ;


/* 5.5	*/

loop_stmt	:
	.sim_nC.  /*simple name colon */
	    .iteration_scheme. LOOP_
		seq_of_stmts
            END_ LOOP_ .sim_n. ';' ;



iteration_scheme  :
	WHILE_ cond
   |	FOR_ loop_prm_spec ;


loop_prm_spec  :
	identifier IN_ .REVERSE. dscr_rng ;


/* 5.6 */

block_stmt  :
	.sim_nC.
	    .DECLARE__decl_part.
	    BEGIN_
		seq_of_stmts
	    .EXCEPTION__excptn_handler..excptn_handler...
            END_ .sim_n. ';' ;


/* 5.7 */

exit_stmt	:
        EXIT_ .expanded_n. .WHEN__cond. ';' ;


/* 5.8 */

return_stmt  :  RETURN_ .expr. ';' ;


/* 5.9 */

goto_stmt  :  GOTO_ expanded_n ';' ;



/* 6.1 */

subprg_d  :  subprg_spec ';'  ;


subprg_spec  :
	PROCEDURE_ identifier .fml_part.
   |	FUNCTION_  designator .fml_part. RETURN_ ty_mk  ;


designator  :  identifier  |  op_symbol  ;


op_symbol  :  string_literal  ;


fml_part  :
        '(' prm_spec .._.prm_spec.. ')' ;


prm_spec  :
	idents ':' mode ty_mk ._ASN_expr.  ;


mode  :  .IN.  |  IN_ OUT_  |  OUT_   ;



/* 6.3 */

subprg_body  :
	subprg_spec IS_
	    .decl_part.
	BEGIN_
	    seq_of_stmts
	.EXCEPTION__excptn_handler..excptn_handler...
        END_ .designator. ';' ;


/* 6.4 */

/* procedure_call_stmt	:						    */
/*      procedure_n .act_prm_part. ';' ;                        */
/*									    */
/* func_call  :							    */
/*	func_n .act_prm.  ;				    */
/*									    */
/* act_prm_part  :						    */
/*      '(' prm_asc ... prm_asc .._paren ;                  */
/*									    */
/* prm_asc	  :						    */
/*	.fml_prm ARROW. act_prm	;		    */
/*									    */
/* fml_prm  : sim_n  ; 			    */
/*									    */
/* act_prm  :							    */
/*      expr  |  name  |  ty_mk '(' name ')';   */
/*									    */
/* "procedure_call_stmt" and "func_call" are included under "name".*/



/* 7.1 */

pkg_d  :  pkg_spec ';'  ;

pkg_spec  :
	PACKAGE_ identifier IS_
	    ..basic_decl_item..
	.PRIVATE..basic_decl_item...
	END_ .sim_n.   ;


pkg_body  :
	PACKAGE_ BODY_ sim_n IS_
	    .decl_part.
	    .BEGIN__seq_of_stmts.EXCEPTION__excptn_handler..excptn_handler...
	END_ .sim_n. ';'   ;



/* 7.4	*/

priv_ty_d  :
	TYPE_ identifier            IS_ .LIMITED. PRIVATE_ ';'
      | TYPE_ identifier discr_part IS_ .LIMITED. PRIVATE_ ';' ;

/* defer_const_d	  :		     */
/*      idents : CONSTANT_ ty_mk ';'       ;  */
/*						     */
/* Included under "object_d". 	     */



/* 8.4 */

use_cl  :  USE_ expanded_n ...expanded_n.. ';'  ;



/* 8.5 */

renaming_d  :
        idents ':' ty_mk      RENAMES_ name ';'
   |    idents ':' EXCEPTION_      RENAMES_ expanded_n ';'
   |    PACKAGE_ identifier        RENAMES_ expanded_n ';'
   |    subprg_spec  RENAMES_ name ';'   ;

/* idents in the two above rule must contain only one */
/* identifier.						       */


/* 9.1 */

task_d  :  task_spec ';'  ;

task_spec  :
	TASK_ .TYPE. identifier
	    .IS..ent_d_..rep_cl_END.sim_n.
	    ;

task_body  :
	TASK_ BODY_ sim_n IS_
	    .decl_part.
	BEGIN_
	    seq_of_stmts
	.EXCEPTION__excptn_handler..excptn_handler...
        END_ .sim_n. ';' ;


/* 9.5 */

ent_d  :
	ENTRY_ identifier .fml_part. ';'
   |    ENTRY_ identifier '(' dscr_rng ')' .fml_part. ';'  ;


ent_call_stmt  :
        ..prag.. name ';' ;


accept_stmt  :
	ACCEPT_ sim_n .Pent_idx_P..fml_part.
            .DO__seq_of_stmts__END.sim_n.. ';' ;


ent_idx  :	expr   ;


/* 9.6 */

delay_stmt  :  DELAY_ sim_expr ';' ;


/* 9.7 */

select_stmt  :	selec_wait
   |	condal_ent_call	|  timed_ent_call  ;


/* 9.7.1 */

selec_wait	:
	SELECT_
	    select_alt
	    ..OR__select_alt..
	    .ELSE__seq_of_stmts.
        END_ SELECT_ ';' ;


select_alt  :
	.WHEN__condARROW.selec_wait_alt  ;


selec_wait_alt  :  accept_alt
   |	delay_alt  |  terminate_alt  ;


accept_alt  :
	accept_stmt.seq_of_stmts.  ;


delay_alt  :
	delay_stmt.seq_of_stmts.  ;


terminate_alt  :  TERM_stmt   ;


/* 9.7.2 */

condal_ent_call	:
	SELECT_
	    ent_call_stmt
	    .seq_of_stmts.
	ELSE_
	    seq_of_stmts
        END_ SELECT_ ';' ;



/* 9.7.3 */

timed_ent_call  :
	SELECT_
	    ent_call_stmt
	    .seq_of_stmts.
	OR_
	    delay_alt
        END_ SELECT_ ';' ;


/* 9.10  */

abort_stmt  :  ABORT_ name ...name.. ';'  ;


/* 10.1 */

compilation  :	..compilation_unit..   ;


compilation_unit  :
	context_cl library_unit
   |    context_cl secondary_unit ;

library_unit  :
	subprg_d	|  pkg_d
   |	gen_d	|  gen_inst
   |	subprg_body     ;


secondary_unit	:
	library_unit_body  |  subunit	;


library_unit_body  :
	pkg_body_or_subprg_body  ;



/* 10.1.1  */

context_cl      : ..with_cl..use_cl.... ;


with_cl  :  WITH_ sim_n ...sim_n.. ';'  ;


/* 10.2 */

body_stub  :
        subprg_spec IS_ SEPARATE_ ';'
   |    PACKAGE_ BODY_ sim_n IS_ SEPARATE_ ';'
   |    TASK_ BODY_ sim_n    IS_ SEPARATE_ ';'   ;


subunit  :  SEPARATE_ '(' expanded_n ')' proper_body  ;



/* 11.1 */

excptn_d  :  idents ':' EXCEPTION_ ';' ;


/* 11.2 */

excptn_handler	:
	WHEN_ excptn_choice ..or_excptn_choice.. ARROW_
	    seq_of_stmts  ;


excptn_choice  :  expanded_n  |	OTHERS_	;


/* 11.3 */

raise_stmt  :  RAISE_ .expanded_n. ';' ;



/* 12.1 */

gen_d  :  gen_spec ';'  ;

gen_spec  :
	gen_fml_part subprg_spec
   |	gen_fml_part pkg_spec  ;


gen_fml_part  :	GENERIC_ ..gen_prm_d..  ;


gen_prm_d  :
	idents ':' .IN.OUT.. ty_mk ._ASN_expr. ';'
   |    TYPE_ identifier IS_ gen_ty_def ';'
   |	priv_ty_d
   |    WITH_ subprg_spec .IS_BOX_. ';' ;
/* |    WITH_ subprg_spec .IS_ name. ';'  */
/*						     */
/* This rule is included in the previous one.	     */


gen_ty_def	 :
        '(' BOX_ ')'  |  RANGE_ BOX_  |  DIGITS_ BOX_  |  DELTA_ BOX_
   |	array_ty_def	       |  access_ty_def	   ;


/* 12.3  */

gen_inst  :
	PACKAGE_ identifier IS_
            NEW_ expanded_n .gen_act_part. ';'
   |	PROCEDURE__ident__IS_
            NEW_ expanded_n .gen_act_part. ';'
   |	FUNCTION_  designator IS_
	    NEW_ expanded_n .gen_act_part. ';'  ;


gen_act_part  :
        '(' gen_asc ...gen_asc.. ')'              ;


gen_asc	     :
	.gen_fml_prmARROW.gen_act_prm ;


gen_fml_prm  :
	sim_n  |  op_symbol  ;

gen_act_prm  :
  expr_or_name_or_subprg_n_or_ent_n_or_ty_mk
	 ;


/* 13.1 */

rep_cl  :
	ty_rep_cl  |  address_cl  ;

ty_rep_cl  :  length_cl
   |	enum_rep_cl
   |	rec_rep_cl	    ;


/* 13.2 */

length_cl  :  FOR_ attribute USE_ sim_expr ';' ;



/* 13.3 */

enum_rep_cl  :
        FOR__ty_sim_n__USE_ aggr ';' ;



/* 13.4  */

rec_rep_cl	:
	FOR__ty_sim_n__USE_
	    RECORD_ .algt_cl.
		..cmpon_cl..
            END_ RECORD_ ';'   ;


algt_cl  :     AT_ MOD_ sim_expr ';' ;


cmpon_cl  :
        name AT_ sim_expr RANGE_ rng ';' ;



/* 13.5 */

address_cl  :  FOR_ sim_n USE_ AT_ sim_expr ';'  ;


/* 13.8 */

code_stmt  :  ty_mk_rec_aggr ';' ;


/*----------------------------------------------------------------------*/

/* The following rules define semantically qualified symbols under more
/* general categories.

ty_n_or_subty_n  :  expanded_n ;
/*								      */
/* An "expanded_n" is used for names that can be written using only*/
/* selectors.							      */

/*     ... these have been replaced logically to reduce the number    */
/*         of YACC_ nonterminal "rules"                                */

/* The following rules expand the concatenated constructs and define the */
/* specially added syntactical classes. 				 */


/* 2.1 */

..prag..  :
       /* empty */
   |	..prag.. prag  ;

.arg_ascs :
       /* empty */
   |    '(' arg_ascs ')' ;

arg_ascs :
	arg_asc
   |    arg_ascs ',' arg_asc ;

/*                                      */
/* "name" is included under "expr"	*/


/* 3.1 */

/*									   */
/*  "defer_const_d" is included under "object_d".*/

._ASN_expr.	:
       /* empty */
   |	ASSIGN_ expr  ;

...ident..  :
       /* empty */
   |    ...ident.. ',' identifier   ;

.constrt.  :
       /* empty */
   |	constrt   ;

/*									 */
/* "idx_c" and "discr_c" are included under	 */
/* the class "aggr".						 */

expanded_n  :
	identifier
   |    expanded_n '.' identifier   ;

/*								       */
/*  This expansion generalizes "rng" so that it may include ty and */
/*  subty names.						       */

...enum_lit_spec.. :
       /* empty */
   |    ...enum_lit_spec.. ','
		enum_lit_spec ;

.rng_c.  :
       /* empty */
   |	rng_c	;

...idx_subty_def..	       :
       /* empty */
   |    ...idx_subty_def.. ',' idx_subty_def                ;

/*								   */
/* To avoid conflicts, the more general class "name" is used.	   */

...dscr_rng.. :
       /* empty */
   |    ...dscr_rng.. ',' dscr_rng  ;


/* A_ dscr subty ind given as a ty mk is included under rng*/


..cmpon_d.. :
       /* empty */
   |    ..cmpon_d.. cmpon_d ..prag..    ;

...discr_spec..	:
       /* empty */
   |    ...discr_spec.. ';' discr_spec  ;


/* Pragmas that can appear between two consecutive variants are picked	*/
/* up in the cmpons part of the variants themselves.		*/

..variant..  :
       /* empty */
   |	..variant.. variant  ;

..or_choice.. :
       /* empty */
   |    ..or_choice.. '|' choice  ;

/* The "sim_expr" by itself may be a "dscr_rng" or a  */
/* "cmpon_sim_n".					     */

/* A_ body is the only later_decl_item that is not also a	   */
/* basic_decl_item.	    It is therefore used as the dividing   */
/* point between the two lists of decl items.			   */

..basic_decl_item..	    :
	..prag..
   |	..basic_decl_item.. basic_decl_item ..prag.. ;

..later_decl_item..      :
	..prag..
   |    ..later_decl_item.. later_decl_item ..prag..  ;


/* 4.1 */


/* "slice" is included under "idxed_cmpon".  */

/* The def of "name" includes "func_call".				*/
/* A_ prmless func call is recognized as a sim name or a	*/
/* selected cmpon.	A_ func call with prms is recognized	*/
/* as an idxed cmpon.						*/


/* Reserved word attribute designators are included in the rules as a	     */
/* convenience.  Alternativly, since an attribute designator is always preced*/
/* by an apostrophe, as noted in the RR_ 4.1.4, such usage may be detected    */
/* during lexical analysis thus obviating the need for special rules.	     */
/*									     */
/* The univ static expr of an attribute designator is reduced     */
/* as an "idxed_cmpon".						     */

...cmpon_asc..	    :
       /* empty */
   |    ...cmpon_asc.. ',' cmpon_asc ;



/* Component ascs are generalized to include dscr rngs. 	   */
/* Thus, an "aggr" can be used for slices and idx and discr  */
/* constrts.							   */

rel..AND__rel..  :
	rel AND_ rel
   |	rel..AND__rel.. AND_ rel	 ;

rel..OR__rel.. :
	rel OR_ rel
   |	rel..OR__rel.. OR_ rel ;

rel..XOR__rel..  :
	rel
   |	..XOR__rel..  ;

..XOR__rel..  :
	rel XOR_ rel
   |	..XOR__rel.. XOR_ rel	;

rel..AND__THEN__rel..  :
	rel AND_ THEN_ rel
   |	rel..AND__THEN__rel.. AND_ THEN_ rel  ;

rel..OR__ELSE__rel..	:
	rel OR_ ELSE_ rel
   |	rel..OR__ELSE__rel.. OR_ ELSE_ rel  ;

.relal_op__sim_expr.  :
       /* empty */
   |	relal_op sim_expr  ;

sim_expr.NOT.IN__rng_or_sim_expr.NOT.IN__ty_mk	:
	sim_expr .NOT. IN_ rng ;

/* The "ty_mk" is included under "rng"  */

.NOT.  :
       /* empty */
   |	NOT_    ;

.unary_add_op.term..binary_add_op__term..  :
	term
   |	unary_add_op term
   |	.unary_add_op.term..binary_add_op__term..
	binary_add_op term  ;

factor..mult_op__factor..	:
	factor
   |	factor..mult_op__factor.. mult_op factor ;

._EXP___pri.  :
       /* empty */
   |	EXP_ pri ;

/* "stringsit" is included under "name" as "op_symbol".  */
/* "func_call" is included under "name".			    */
/* "ty_cnvr" is included under "name".			    */


ty_mkaggr_or_ty_mkPexprP_  :
        prefix '\'' aggr ;

/* The "prefix must be a "ty_mk".  The "PexprP_" is an "aggr". */


/* Here the "qualified_expr" can be given exactly  */


/* We use the fact that the constrt must be an idx or discr  */
/* constrt.								 */


/* 5.1 */


..stmt..  :
	..prag..
   |	..stmt.. stmt ..prag.. ;


..label..   :
       /* empty */
   |	..label.. label  ;



..ELSIF__cond__THEN__seq_of_stmts..  :
       /* empty */
   |	..ELSIF__cond__THEN__seq_of_stmts..
		ELSIF_ cond THEN_
		    seq_of_stmts   ;

.ELSE__seq_of_stmts.	:
       /* empty */
   |	ELSE_
	    seq_of_stmts    ;

case_stmt_alt..case_stmt_alt.. :
	    ..prag..
	    case_stmt_alt
	    ..case_stmt_alt..  ;

..case_stmt_alt..	:
       /* empty */
   |	..case_stmt_alt.. case_stmt_alt ;

.sim_nC.	:
       /* empty */
   |    sim_n ':' ;

.sim_n. :
       /* empty */
   |	sim_n  ;

.iteration_scheme.  :
       /* empty */
   |	iteration_scheme  ;

.REVERSE. :
       /* empty */
   |	REVERSE_   ;

.DECLARE__decl_part.	     :
       /* empty */
   |	DECLARE_
	    decl_part		;

.EXCEPTION__excptn_handler..excptn_handler... :
       /* empty */
   |	EXCEPTION_
	    ..prag.. excptn_handlers	 ;

excptn_handlers	:
	excptn_handler
   |	excptn_handlers excptn_handler   ;

.expanded_n.  :
       /* empty */
   |	expanded_n  ;

.WHEN__cond.  :
       /* empty */
   |	WHEN_ cond	;

.expr.	:
       /* empty */
   |	expr   ;


/* 6.1 */

.fml_part.  :
       /* empty */
   |	fml_part  ;

.._.prm_spec..  :
       /* empty */
   |    .._.prm_spec.. ';' prm_spec  ;

.IN.  :
       /* empty */
   |	IN_	  ;

.decl_part.	    :  decl_part	 ;

/* A_ "decl_part" may be empty.		*/

.designator.  :
       /* empty */
   |    designator    ;


/* 7.1	*/

.PRIVATE..basic_decl_item... :
       /* empty */
   |	PRIVATE_
	    ..basic_decl_item.. ;

.BEGIN__seq_of_stmts.EXCEPTION__excptn_handler..excptn_handler...
				:
       /* empty */
   |	BEGIN_
	    seq_of_stmts
	.EXCEPTION__excptn_handler..excptn_handler...  ;

.LIMITED.  :
       /* empty */
   |	LIMITED_    ;

...expanded_n.. :
       /* empty */
   |    ...expanded_n.. ',' expanded_n  ;


/* 9.1 */

.TYPE.	:
       /* empty */
   |	TYPE_   ;

.IS..ent_d_..rep_cl_END.sim_n.  :
       /* empty */
   |	IS_
	    ..ent_d..
	    ..rep_cl..
	END_ .sim_n.	      ;


..ent_d..  :
	..prag..
   |	..ent_d.. ent_d ..prag..	;

..rep_cl..  :
       /* empty */
   |	..rep_cl.. rep_cl ..prag..	;


.Pent_idx_P..fml_part.  :
	.fml_part.
   |    '(' ent_idx ')' .fml_part.  ;

.DO__seq_of_stmts__END.sim_n..  :
       /* empty */
   |	DO_
	  seq_of_stmts
	END_ .sim_n.  ;

..OR__select_alt..  :
       /* empty */
   |	..OR__select_alt.. OR_ select_alt	;

.WHEN__condARROW.selec_wait_alt  :
	selec_wait_alt
   |	WHEN_ cond ARROW_ selec_wait_alt  ;

accept_stmt.seq_of_stmts.  :
	..prag.. accept_stmt .seq_of_stmts.  ;

delay_stmt.seq_of_stmts.  :
	..prag.. delay_stmt .seq_of_stmts. ;

TERM_stmt   :  ..prag.. TERMINATE_ ';' ..prag..  ;

.seq_of_stmts.	:
	..prag..
   |	seq_of_stmts	;

...name..	:
       /* empty */
   |    ...name.. ',' name  ;



/* 10.1 */

..compilation_unit..  :
	..prag..
   |	..compilation_unit.. compilation_unit ..prag.. ;

pkg_body_or_subprg_body   :  pkg_body  ;

/* "subprg_body" is already contained in the class "library_unit". */

..with_cl..use_cl.... :
       /* empty */
   |	..with_cl..use_cl.... with_cl use_cls ;


use_cls  :
	..prag..
   |	use_cls use_cl ..prag..  ;

...sim_n..  :
       /* empty */
   |    ...sim_n.. ',' sim_n  ;



/* 11.1  */

..or_excptn_choice.. :
       /* empty */
   |    ..or_excptn_choice.. '|' excptn_choice ;



/* 12.1 */

..gen_prm_d..  :
       /* empty */
   |	..gen_prm_d.. gen_prm_d ;

.IN.OUT..  :
	.IN.
   |	IN_ OUT_	 ;

.IS_BOX_.	:
       /* empty */
   |	IS_ name
   |	IS_ BOX_ ;

PROCEDURE__ident__IS_	   :  subprg_spec IS_ ;

/* To avoid conflicts, the more general "subprg_spec" is used.  */

.gen_act_part.  :
       /* empty */
   |	gen_act_part ;

...gen_asc.. :
       /* empty */
   |    ...gen_asc.. ',' gen_asc ;

.gen_fml_prmARROW.gen_act_prm  :
	gen_act_prm
   |	gen_fml_prm ARROW_ gen_act_prm  ;

expr_or_name_or_subprg_n_or_ent_n_or_ty_mk
				:  expr  ;

/* The above alts are included under "expr". */


/* 13.1 */

FOR__ty_sim_n__USE_  :
	FOR_ sim_n USE_	;

/* The "sim_n" must be a "ty_sim_n". */

.algt_cl.  :
	..prag..
   |    ..prag.. algt_cl ..prag..   ;

..cmpon_cl..  :
       /* empty */
   |    ..cmpon_cl.. cmpon_cl ..prag..  ;

ty_mk_rec_aggr  :  qualified_expr      ;

/* The qualified expr must contain a rec aggr. */

%%

#include "lex.yy.c"
#include <stdio.h>
#include "main.h"
!!FUNKY STUFF!!
echo 'extracting --- lex.in' 1>&2
cat >lex.in <<'!!FUNKY STUFF!!'
%{
/*------------------------------------------------------------------------*/
/* 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[%d]\t",++lines)
%}

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

%START IDENT Z

%%
ABORT|abort     {ECHO; BEGIN Z; return(ABORT_);}
ABS|abs         {ECHO; BEGIN Z; return(ABS_);}
ACCEPT|accept   {ECHO; BEGIN Z; return(ACCEPT_);}
ACCESS|access   {ECHO; BEGIN Z; return(ACCESS_);}
ALL|all         {ECHO; BEGIN Z; return(ALL_);}
AND|and         {ECHO; BEGIN Z; return(AND_);}
ARRAY|array     {ECHO; BEGIN Z; return(ARRAY_);}
AT|at           {ECHO; BEGIN Z; return(AT_);}
BEGIN|begin     {ECHO; BEGIN Z; return(BEGIN_);}
BODY|body       {ECHO; BEGIN Z; return(BODY_);}
CASE|case       {ECHO; BEGIN Z; return(CASE_);}
CONSTANT|constant {ECHO; BEGIN Z; return(CONSTANT_);}
DECLARE|declare {ECHO; BEGIN Z; return(DECLARE_);}
DELAY|delay     {ECHO; BEGIN Z; return(DELAY_);}
DELTA|delta     {ECHO; BEGIN Z; return(DELTA_);}
DIGITS|digits   {ECHO; BEGIN Z; return(DIGITS_);}
DO|do           {ECHO; BEGIN Z; return(DO_);}
ELSE|else       {ECHO; BEGIN Z; return(ELSE_);}
ELSIF|elsif     {ECHO; BEGIN Z; return(ELSIF_);}
END|end         {ECHO; BEGIN Z; return(END_);}
ENTRY|entry     {ECHO; BEGIN Z; return(ENTRY_);}
EXCEPTION|exception {ECHO; BEGIN Z; return(EXCEPTION_);}
EXIT|exit       {ECHO; BEGIN Z; return(EXIT_);}
FOR|for         {ECHO; BEGIN Z; return(FOR_);}
FUNCTION|function {ECHO; BEGIN Z; return(FUNCTION_);}
GENERIC|generic {ECHO; BEGIN Z; return(GENERIC_);}
GOTO|goto       {ECHO; BEGIN Z; return(GOTO_);}
IF|if           {ECHO; BEGIN Z; return(IF_);}
IN|in           {ECHO; BEGIN Z; return(IN_);}
IS|is           {ECHO; BEGIN Z; return(IS_);}
LIMITED|limited {ECHO; BEGIN Z; return(LIMITED_);}
LOOP|loop       {ECHO; BEGIN Z; return(LOOP_);}
MOD|mod         {ECHO; BEGIN Z; return(MOD_);}
NEW|new         {ECHO; BEGIN Z; return(NEW_);}
NOT|not         {ECHO; BEGIN Z; return(NOT_);}
NULL|null       {ECHO; BEGIN Z; return(NULL_);}
OF|of           {ECHO; BEGIN Z; return(OF_);}
OR|or           {ECHO; BEGIN Z; return(OR_);}
OTHERS|others   {ECHO; BEGIN Z; return(OTHERS_);}
OUT|out         {ECHO; BEGIN Z; return(OUT_);}
PACKAGE|package {ECHO; BEGIN Z; return(PACKAGE_);}
PRAGMA|pragma   {ECHO; BEGIN Z; return(PRAGMA_);}
PRIVATE|private {ECHO; BEGIN Z; return(PRIVATE_);}
PROCEDURE|procedure {ECHO; BEGIN Z; return(PROCEDURE_);}
RAISE|raise     {ECHO; BEGIN Z; return(RAISE_);}
RANGE|range     {ECHO; BEGIN Z; return(RANGE_);}
RECORD|record   {ECHO; BEGIN Z; return(RECORD_);}
REM|rem         {ECHO; BEGIN Z; return(REM_);}
RENAMES|renames {ECHO; BEGIN Z; return(RENAMES_);}
RETURN|return   {ECHO; BEGIN Z; return(RETURN_);}
REVERSE|reverse {ECHO; BEGIN Z; return(REVERSE_);}
SELECT|select   {ECHO; BEGIN Z; return(SELECT_);}
SEPARATE|separate {ECHO; BEGIN Z; return(SEPARATE_);}
SUBTYPE|subtype {ECHO; BEGIN Z; return(SUBTYPE_);}
TASK|task       {ECHO; BEGIN Z; return(TASK_);}
TERMINATE|terminate {ECHO; BEGIN Z; return(TERMINATE_);}
THEN|then       {ECHO; BEGIN Z; return(THEN_);}
TYPE|type       {ECHO; BEGIN Z; return(TYPE_);}
USE|use         {ECHO; BEGIN Z; return(USE_);}
WHEN|when       {ECHO; BEGIN Z; return(WHEN_);}
WHILE|while     {ECHO; BEGIN Z; return(WHILE_);}
WITH|with       {ECHO; BEGIN Z; return(WITH_);}
XOR|xor         {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_]+)?([Ee][-+]?[0-9_]+)?  {
			      ECHO; BEGIN Z; strcpy(num_lit,yytext);
			      return(numeric_literal);}

[0-9][0-9_]*#[0-9a-fA-F_]+([.][0-9a-fA-F_]+)?#([Ee][-+]?[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;
%%
!!FUNKY STUFF!!
echo 'extracting --- main.h' 1>&2
cat >main.h <<'!!FUNKY STUFF!!'
extern int lines;
extern int num_errors;
extern char id_string[];
extern char char_lit[];
extern char num_lit[];

main()  {
	printf( "\nStarting Ada grammatical analysis\n\n[1]\t" );
	yyparse();
	printf( "---> Grammatical analysis complete!! %d error(s) <---\n", num_errors);
	}

yyerror(s)
char *s;
	{
	printf(  "?? %s ??\n\t", s );
	++num_errors;
	}
!!FUNKY STUFF!!
echo 'extracting --- makeada' 1>&2
cat >makeada <<'!!FUNKY STUFF!!'
: this shell makes the ada grammar analyzer from lex.in and ADA.Y
: and calls it "adadl"

set -v
cc -O y.tab.c -o adadl y.tab.o -ly -ll -l
: to run adadl, type in adadl or type in "adadl < sourcefilename"
!!FUNKY STUFF!!
echo 'extracting --- makelexyacc' 1>&2
cat >makelexyacc <<'!!FUNKY STUFF!!'
: compile lex & yacc (run in background as "makelexyacc &")
set -v
lex lex.in > lex.prt
cat lex.prt
: note - I called yacc "yaccbig" when re-made for the 
: huge model as shown in file "y.statistics"
yaccbig -vd ADA.Y
makeada
!!FUNKY STUFF!!
echo 'extracting --- y.statistics' 1>&2
cat >y.statistics <<'!!FUNKY STUFF!!'
95/127 terminals, 238/300 nonterminals
459/900 grammar rules, 860/2500 states
0 shift/reduce, 0 reduce/reduce conflicts reported
238/350 working sets used
memory: states,etc. 4125/16000, parser 3113/16000
601/2500 distinct lookahead sets
946 extra closures
1235 shift entries, 65 exceptions
571 goto entries
1414 entries saved by goto default
Optimizer space used: input 3376/16000, output 1147/16000
1147 table entries, 0 zero
maximum spread: 333, maximum offset: 857
!!FUNKY STUFF!!
-- 
Arnold Robbins
CSNET: arnold at gatech		ARPA: arnold.gatech at CSNet-relay
UUCP:	...!{akgua,allegra,rlgvax,sb1,ut-sally}!gatech!arnold

"Look Bruce!  It's the Bat Signal!"



More information about the Comp.sources.unix mailing list