/* 
 * Motif
 *
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
 *
 * These libraries and programs are free software; you can
 * redistribute them and/or modify them under the terms of the GNU
 * Lesser General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * These libraries and programs are distributed in the hope that
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with these librararies and programs; if not, write
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA 02110-1301 USA
*/ 
/* 
 * HISTORY
*/ 
/* "$TOG: Uil.y /main/11 1998/01/23 15:05:38 mgreess $" */
/*
*  (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */

/*
**++
**  FACILITY:
**
**      DECwindows Toolkit User Interface Language Compiler (UIL)
**
**  ABSTRACT:
**
**      YACC Grammar for UIL
**--
**/

%{


	/* Begin user declarations section */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "UilDefI.h"
#include "UilCompGl.h"

#define		YYSTYPE		yystype

#define		YYDEBUG		1

/*   Declare and initialize stack entry for epsilon productions.    */

YYSTYPE		gz_yynullval = {NULL,0,0,0,0};

/*   Declare token to aid in saving source context	*/

YYSTYPE		prev_yylval;

	/* End user declarations section */

%}    

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *     token name			token value	  token class	      *
 *     ----------                       -----------       -----------         *
 *----------------------------------------------------------------------------*
 */

/* 
**	terminals of the language
**
**	NOTE: the tags which appear in comments at the end of each token
**	definition name the token class for the token. These name the
**	the .dat file processed by WML while constructing token tables.
**	Thus the output of WML and these tags must match, e.g. for
**	the token tag 'special' the file 'special.dat' must exist.
*/

/*    end of file indicator    */

%token	UILEOF					0	/* unused */

/*    names    */

%token	NAME					1	/* identifier */
%token	FONT_NAME				2	/* font */
%token	COLOR_NAME				3	/* color */
%token	ARGUMENT_NAME				4	/* argument */
%token	REASON_NAME				5	/* reason */
%token	CHARSET_NAME				6	/* charset */
%token	ENUMVAL_NAME				7	/* enumval */
%token	CLASS_NAME				8	/* class */
%token  CHILD_NAME				96	/* child */

/*    Literals    */

%token	UNS_FLOAT_LITERAL			9	/* literal */
%token	COMP_STRING				10	/* literal */
%token	CHAR_8_LITERAL				11	/* literal */
%token	UNS_INT_LITERAL				12	/* literal */

/*    Special characters.  Treat these as tokens rather than literals, so
 *    that we can assign token numbers to them rather than have YACC use
 *    the ASCII value as the token number.
 */

%token	LEFT_PAREN				13	/* special */
%token	RIGHT_PAREN				14	/* special */
%token	COLON					15	/* special */
%token	SEMICOLON				16	/* special */
%token	LEFT_BRACE				17	/* special */
%token	RIGHT_BRACE				18	/* special */
%token	COMMA					19	/* special */
%token	EQUAL_SIGN				20	/* special */
%token	NOT					21	/* special */
%token	PLUS					22	/* special */
%token	MINUS					23	/* special */
%token	AND					24	/* special */
%token	OR					25	/* special */
%token	XOR					26	/* special */
%token	MULTIPLY				27	/* special */
%token	DIVIDE					28	/* special */
%token	LEFT_SHIFT				29	/* special */
%token	RIGHT_SHIFT				30	/* special */

/*    Reserved words	*/

%token	LIST					31	/* reserved */
%token	IDENTIFIER				32	/* reserved */
%token	END					33	/* reserved */
%token	MODULE					34	/* reserved */
%token	UILTRUE					35	/* reserved */
%token	UILFALSE				36	/* reserved */
%token	INCLUDE					37	/* reserved */
%token	MACRO					38	/* reserved */
%token	ON					39	/* reserved */
%token	OFF					40	/* reserved */
%token	VALUE					41	/* reserved */
%token	ARGUMENTS				42	/* reserved */
%token	CALLBACKS				43	/* reserved */
%token	PROCEDURES              		44	/* reserved */
%token	CONTROLS				45	/* reserved */
%token	PROCEDURE				46	/* reserved */
%token	OBJECT					47	/* reserved */

/*    Declaratives    */

%token	OBJECTS					48	/* keyword */
%token	WIDGET					49	/* reserved */
%token	GADGET					50	/* reserved */

%token	FONT					51	/* keyword */
%token	ARGUMENT				52	/* keyword */
%token	REASON					53	/* keyword */
%token	PIXMAP					54	/* keyword */
%token	COLOR					55	/* keyword */

%token	NAMES					56	/* keyword */
%token	CHARACTER_SET				57	/* keyword */
%token	CASE_SENSITIVE				58	/* keyword */
%token	CASE_INSENSITIVE			59	/* keyword */

%token	VERSION					60	/* keyword */

%token	MANAGED					61	/* keyword */
%token	UNMANAGED				62	/* keyword */

%token	PRIVATE					63	/* reserved */
%token	IMPORTED				64	/* keyword */
%token	EXPORTED				65	/* reserved */

%token	UILFILE					66	/* keyword */

%token	STRING_TABLE				67	/* keyword */
%token	TRANSLATION_TABLE			68	/* keyword */
%token	COMPOUND_STRING				69	/* keyword */
%token	FONT_TABLE				70	/* keyword */

%token	ANY					71	/* keyword */
%token	STRING					72	/* keyword */
%token	BOOLEAN					73	/* keyword */
%token	ICON					74	/* keyword */
%token	RIGHT_TO_LEFT				75	/* keyword */
%token	BACKGROUND				76	/* keyword */
%token	FOREGROUND				77	/* keyword */
%token	COLOR_TABLE				78	/* keyword */
%token	FLOAT					79	/* keyword */
%token	INTEGER					80	/* keyword */
%token  CLASS_REC_NAME				81	/* keyword */
%token	ASCIZ_TABLE				82	/* keyword */
%token	INTEGER_TABLE				83	/* keyword */
%token	ASCIZ_STRING_TABLE			84	/* keyword */
%token	COMPOUND_STRING_TABLE			85	/* keyword */
%token	XBITMAPFILE				86	/* keyword */
%token	SEPARATE				87	/* keyword */
%token  SIXTEEN_BIT				88	/* keyword */
%token	POUND					89	/* special */
%token	KEYSYM					90	/* keyword */
%token	SINGLE_FLOAT				91	/* keyword */
%token	RGB					92	/* keyword */
%token  WIDE_CHARACTER				93	/* keyword */
%token  LOC_STRING				94	/* literal */ /* New for 1.2 */
%token	FONTSET					95	/* keyword */
%token  COMPOUND_STRING_COMPONENT		97	/* keyword */

%token  PIX					115
%token  PIXEL					103
%token  PIXELS					104
%token  IN					98
%token  INCH					105
%token  INCHES					106
%token  CM					99
%token  CENTIMETER				107
%token  CENTIMETERS				108
%token  MM					100
%token  MILLIMETER				109
%token  MILLIMETERS				110
%token  PT					101
%token  POINT					111
%token  POINTS					112
%token  FU					102
%token  FONT_UNIT				113
%token  FONT_UNITS				114

%start module_block

%%



/* 
**	productions of the grammar
*/


/*	module structure	*/

module_block
    : module_header
	{ sar_save_module_source (); }
      module_declaration_list END MODULE SEMICOLON
    ;

module_header
    : /* empty */				{ sar_create_root ( &$$ ); }
      MODULE id 				{ sar_create_module( &$$, &$3, &$2 ); }
	opt_module_clauses
    ;

opt_module_clauses
    : /* empty */
    | module_clauses
    ;

module_clauses
    : module_clause
    | module_clauses module_clause
    ;
    
module_clause
    : VERSION EQUAL_SIGN character_8_value		{ sar_process_module_version(  &$3 , &$1 ); }
    | NAMES EQUAL_SIGN sensitivity_value		{ sar_process_module_sensitivity( &$3 , &$1 ); }
    | CHARACTER_SET EQUAL_SIGN valid_charset		{ sar_process_module_charset( &$3 , &$1 ); }
    | OBJECTS { sar_make_def_obj (&$1); } EQUAL_SIGN variant_spec
    ;

sensitivity_value
    : CASE_SENSITIVE
    | CASE_INSENSITIVE
    ;

variant_spec
    : LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE variant_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

variant_list
    : variant_clause SEMICOLON
    | variant_list variant_clause SEMICOLON
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

variant_clause
    : CLASS_NAME { sar_make_def_obj (&$1); }
      EQUAL_SIGN variant				{ sar_process_module_variant (&$1, &$4); $$ = gz_yynullval; }
    ;

variant
    : WIDGET						{ $$ = gz_yynullval; $$.b_type = sym_k_widget_entry; }
    | GADGET						{ $$ = gz_yynullval; $$.b_type = sym_k_gadget_entry; }
    ;

module_declaration_list
    : /* empty */
    | module_declaration_list module_declaration
    ;

module_declaration
    : value_declaration
    | identifier_declaration
    | procedure_declaration
    | object_declaration
    | list_declaration
    | include_directive
    ;



/*	VALUE declaration	    */

value_declaration
    : VALUE { $$ = $1; sar_save_section_source (&$1, sym_k_value_section); } value_declaration_list
    ;

value_declaration_list
    : value_decl
    | value_declaration_list value_decl
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

value_decl
    : id COLON value_definition SEMICOLON		{ sar_bind_value_name( &$1, &$3, &$4 ); }
    ;

value_definition
  : EXPORTED private_value				{ $$ = $2; $$.b_flags |= sym_m_exported; $$.b_flags &= ~sym_m_private; }
    | PRIVATE private_value_plus			{ $$ = $2; $$.b_flags |= sym_m_private; $$.b_flags &= ~sym_m_exported; }
    | private_value_plus				{ $$ = $1; $$.b_flags |= sym_m_private; $$.b_flags &= ~sym_m_exported; }
    | IMPORTED value_type				{ sar_import_value_entry( &$$, &$2 ); }
    ;

value_type
    : INTEGER			{ $$ = $1; $$.b_type = sym_k_integer_value; }
    | STRING			{ $$ = $1; $$.b_type = sym_k_char_8_value; }
    | PIXMAP			{ $$ = $1; $$.b_type = sym_k_pixmap_value; }
    | FLOAT			{ $$ = $1; $$.b_type = sym_k_float_value; }
    | BOOLEAN			{ $$ = $1; $$.b_type = sym_k_bool_value; }
    | FONT			{ $$ = $1; $$.b_type = sym_k_font_value; }
    | REASON			{ $$ = $1; $$.b_type = sym_k_reason_value; }
    | ARGUMENT			{ $$ = $1; $$.b_type = sym_k_argument_value; }
    | COLOR			{ $$ = $1; $$.b_type = sym_k_color_value; }
    | string_table_type		{ $$ = $1; $$.b_type = sym_k_string_table_value; }
    | asciz_table_type		{ $$ = $1; $$.b_type = sym_k_asciz_table_value; }
    | INTEGER_TABLE		{ $$ = $1; $$.b_type = sym_k_integer_table_value; }
    | TRANSLATION_TABLE		{ $$ = $1; $$.b_type = sym_k_trans_table_value; }
    | FONT_TABLE		{ $$ = $1; $$.b_type = sym_k_font_table_value; }
    | ICON			{ $$ = $1; $$.b_type = sym_k_icon_value; }
    | COMPOUND_STRING		{ $$ = $1; $$.b_type = sym_k_compound_string_value; }
    | COMPOUND_STRING_COMPONENT	{ $$ = $1; $$.b_type = sym_k_compound_string_value; }
    | CLASS_REC_NAME		{ $$ = $1; $$.b_type = sym_k_class_rec_name_value; }
    | XBITMAPFILE		{ $$ = $1; $$.b_type = sym_k_xbitmapfile_value; }
    | KEYSYM			{ $$ = $1; $$.b_type = sym_k_keysym_value; }
    | SINGLE_FLOAT		{ $$ = $1; $$.b_type = sym_k_single_float_value; }
    | RGB			{ $$ = $1; $$.b_type = sym_k_rgb_value; }
    | WIDE_CHARACTER		{ $$ = $1; $$.b_type = sym_k_wchar_string_value; }
    | FONTSET			{ $$ = $1; $$.b_type = sym_k_fontset_value; }
    | WIDGET			{ $$ = $1; $$.b_type = sym_k_widget_ref_value; }
    ;

/* Seperately defined for fixing CR 5888 */
arg_value_type
    : INTEGER			{ $$ = $1; $$.b_type = sym_k_integer_value; }
    | STRING			{ $$ = $1; $$.b_type = sym_k_char_8_value; }
    | PIXMAP			{ $$ = $1; $$.b_type = sym_k_pixmap_value; }
    | FLOAT			{ $$ = $1; $$.b_type = sym_k_float_value; }
    | BOOLEAN			{ $$ = $1; $$.b_type = sym_k_bool_value; }
    | FONT			{ $$ = $1; $$.b_type = sym_k_font_value; }
    | REASON			{ $$ = $1; $$.b_type = sym_k_reason_value; }
    | COLOR			{ $$ = $1; $$.b_type = sym_k_color_value; }
    | string_table_type		{ $$ = $1; $$.b_type = sym_k_string_table_value; }
    | asciz_table_type		{ $$ = $1; $$.b_type = sym_k_asciz_table_value; }
    | INTEGER_TABLE		{ $$ = $1; $$.b_type = sym_k_integer_table_value; }
    | TRANSLATION_TABLE		{ $$ = $1; $$.b_type = sym_k_trans_table_value; }
    | FONT_TABLE		{ $$ = $1; $$.b_type = sym_k_font_table_value; }
    | ICON			{ $$ = $1; $$.b_type = sym_k_icon_value; }
    | COMPOUND_STRING		{ $$ = $1; $$.b_type = sym_k_compound_string_value; }
    | KEYSYM			{ $$ = $1; $$.b_type = sym_k_keysym_value; }
    | SINGLE_FLOAT		{ $$ = $1; $$.b_type = sym_k_single_float_value; }
    | WIDE_CHARACTER		{ $$ = $1; $$.b_type = sym_k_wchar_string_value; }
    | FONTSET			{ $$ = $1; $$.b_type = sym_k_fontset_value; }
    | WIDGET			{ $$ = $1; $$.b_type = sym_k_widget_ref_value; }
/* End for fixing CR 5888 */

string_table_type
    : STRING_TABLE
    | COMPOUND_STRING_TABLE
    ;

asciz_table_type
    : ASCIZ_TABLE
    | ASCIZ_STRING_TABLE
    ;


/*	PROCEDURE declaration	    */

procedure_declaration
    : PROCEDURE { $$ = $1; sar_save_section_source (&$1, sym_k_procedure_section); } procedure_declaration_list
    ;

procedure_declaration_list
    : procedure_decl
    | procedure_declaration_list procedure_decl
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

procedure_decl
    : id opt_formal_parameters opt_class SEMICOLON	{ sar_create_procedure( &$1, &$2, &$3, &$4 );}
    ;

opt_formal_parameters
    : /* empty */					{ $$ = gz_yynullval; }
    | LEFT_PAREN formal_parameter_type RIGHT_PAREN	{ $$ = $2; }
    ;

formal_parameter_type
    : /* empty */					{ $$ = gz_yynullval; $$.b_type = sym_k_no_value; }
    | value_type
    | ANY 						{ $$ = $1; $$.b_type = 
sym_k_any_value; }
    | CLASS_NAME
	{ YYSTYPE temp[2];
	  temp[0] = gz_yynullval;
	  sar_create_object(&temp[0], sym_k_widget_entry);
	  temp[1] = $1; sar_set_object_class(&temp[1]);
	  sar_verify_object(&temp[1]);
	  $$ = temp[0];
	}
    ;

opt_class
    : /* empty */					{ $$.b_flags = sym_m_private; }
/*
    | EXPORTED						{ $$.b_flags = sym_m_exported; }
    | PRIVATE						{ $$.b_flags = sym_m_private; }
    | IMPORTED						{ $$.b_flags = sym_m_imported; }
*/
    ;



/*	IDENTIFIER declaration	    */

identifier_declaration
    : IDENTIFIER { $$ = $1; sar_save_section_source (&$1, sym_k_identifier_section); } identifier_declaration_list
    ;

identifier_declaration_list
    : identifier_decl
    | identifier_declaration_list identifier_decl
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

identifier_decl
    : id SEMICOLON					{ sar_create_identifier ( &$1, &$2 ); }
    ;



/*    Directives.    */

/*    Include Directive    */

include_directive
    : INCLUDE UILFILE character_8_value SEMICOLON	{ sar_include_file (&$3, &$1, &$4); }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;



/*	OBJECT declaration	*/

object_declaration
    : OBJECT { $$ = $1; sar_save_section_source (&$1, sym_k_object_section); } object_decl_list
    ;

object_decl_list
    : object_decl SEMICOLON 				{ $$ = $1; sar_save_src_semicolon_pos (&$2 ); }
    | object_decl_list object_decl SEMICOLON  		{ $$ = $1; sar_save_src_semicolon_pos (&$3 ); }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

object_decl
    : id
	{ sar_create_object (&$1, sym_k_widget_entry); 
	  sar_link_section (&$1); $$ = gz_yynullval;}
      COLON object_definition
	{ $$ = gz_yynullval; }
    ;

object_definition
    : EXPORTED
        { sar_set_object_flags (&$1, sym_m_exported); }
      object_specification
    | PRIVATE
        { sar_set_object_flags (&$1, sym_m_private); }
      object_specification
    | epsilon_production
        { sar_set_object_flags (&$1, sym_m_exported); }
      object_specification
    | IMPORTED
        { sar_set_object_flags (&$1, sym_m_imported); }
      CLASS_NAME
        { sar_set_object_class (&$3); }
/*
 * Fix for CR 5440 - Call opt_create_proc_ref to check for creation procedures
 *                   for imported user_defined widgets.
 */
      opt_create_proc_ref
/*
 * End fix for CR 5440
 */
      epsilon_production
        { sar_verify_object (&$1); }
    ;

control_object_definition
    : EXPORTED
	{ sar_set_object_flags (&$1, sym_m_exported); }
      object_specification
    | PRIVATE
	{ sar_set_object_flags (&$1, sym_m_private); }
      object_specification
    | MANAGED
	{ sar_set_object_flags (& $1, (sym_m_managed | sym_m_exported)); }
      object_specification
    | UNMANAGED
	{ sar_unset_object_flags (& $1, sym_m_managed), sar_set_object_flags (& $1, sym_m_exported); }
      object_specification
    | epsilon_production
	{ sar_set_object_flags (&$1, sym_m_exported); }
      object_specification
    | IMPORTED
	{ sar_set_object_flags (&$1, sym_m_imported); }
      CLASS_NAME
	{ sar_set_object_class (&$3); }
      epsilon_production
	{ sar_verify_object (&$1); }
    ;

object_specification
    : CLASS_NAME
	{ sar_set_object_class (&$1); }
      opt_create_proc_ref
      opt_variant
      object_spec
	{ sar_verify_object (&$1); }
    ;

opt_variant
    : epsilon_production
	{ sar_set_object_variant (&$1); }
    | variant
	{ sar_set_object_variant (&$1); }
    ;

control_object_specification
    : CLASS_NAME
	{ sar_set_object_class (&$1); $$ = gz_yynullval;}
      opt_create_proc_ref
      opt_variant
      control_object_spec
	{ sar_verify_object (&$1); }
    ;

opt_create_proc_ref
    : epsilon_production
    | PROCEDURE id_ref opt_parens
	{ sar_process_proc_ref (&$2, &gz_yynullval, sym_k_object_proc);
	  sar_save_user_proc_ref_src ( &$1, &$2, &$3 ); }
    ;

opt_parens
    : epsilon_production
    | LEFT_PAREN RIGHT_PAREN { $$ = $2; }
    ;




/*	object specification.    */

object_spec
    : id_ref
	{ sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE object_feature_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

control_object_spec
    : id_ref
	{ sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
      epsilon_production
	{ sar_set_object_flags (&$1, sym_m_exported); }
    | LEFT_BRACE object_feature_list RIGHT_BRACE
      epsilon_production
	{ sar_set_object_flags (&$1, sym_m_exported); }
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

child_object_spec
    : LEFT_BRACE RIGHT_BRACE
      epsilon_production
	{ sar_set_object_flags (&$1, sym_m_private); }
    | LEFT_BRACE object_feature_list RIGHT_BRACE
      epsilon_production
	{ sar_set_object_flags (&$1, sym_m_private); }
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

object_feature_list
    : object_feature
    | object_feature_list object_feature
    ;

object_feature
    : argument_list_def SEMICOLON
	{ sar_save_list_end ( &$2); sar_save_feature (&$1); $$ = gz_yynullval; }
    | callback_list_def SEMICOLON
	{ sar_save_list_end ( &$2); sar_save_feature (&$1); $$ = gz_yynullval; }
    | control_list_def SEMICOLON
	{ sar_save_list_end ( &$2); sar_save_feature (&$1); 
sar_update_parent_list (&$1); $$ = gz_yynullval; }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

epsilon_production
    : /* empty */
  	{ $$ = gz_yynullval; }
    ;



/*	LIST declaration	*/

list_declaration
    : LIST { $$ = $1; sar_save_section_source (&$1, sym_k_list_section); }
	list_decl_list
    ;

list_decl_list
    : list_decl SEMICOLON { $$ = $1; sar_save_src_semicolon_pos (&$2 ); }
    | list_decl_list list_decl SEMICOLON { $$ = $1; sar_save_src_semicolon_pos (&$3 ); }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

list_decl
    : id
	{ sar_create_object (&$1, sym_k_list_entry); 
sar_link_section (&$1); $$ = gz_yynullval;}
      COLON list_specification
	{ $$ = gz_yynullval; }
    ;

list_specification
    : control_list_specification
    | argument_list_specification
    | callback_list_specification
    | procedure_list_specification
    ;

control_list_specification
    : control_list_type
	{ $$ = gz_yynullval; sar_set_list_type (&$1); }
      control_list_spec
	{ sar_verify_object (&$1); }
    ;

argument_list_specification
    : argument_list_type
	{ $$ = gz_yynullval; sar_set_list_type (&$1); }
      argument_list_spec
	{ sar_verify_object (&$1); }
    ;

callback_list_specification
    : callback_list_type
	{ $$ = gz_yynullval; sar_set_list_type (&$1); }
      callback_list_spec
	{ sar_verify_object (&$1); }
    ;

procedure_list_specification
    : procedure_list_type
	{ $$ = gz_yynullval; sar_set_list_type (&$1); }
      procedure_list_spec
	{ sar_verify_object (&$1); }
    ;

argument_list_type
    : ARGUMENTS
	{ $$ = gz_yynullval; $$.b_type = sym_k_argument_list; }
    ;

callback_list_type
    : CALLBACKS
	{ $$ = gz_yynullval; $$.b_type = sym_k_callback_list; }
    ;

procedure_list_type
    : PROCEDURES
	{ $$ = gz_yynullval; $$.b_type = sym_k_proc_ref_list; }
    ;
control_list_type
    : CONTROLS
	{ $$ = gz_yynullval; $$.b_type = sym_k_control_list; }
    ;

argument_list_spec
    : id_ref { sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE argument_list_clause_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

callback_list_spec
    : id_ref { sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE callback_list_clause_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

procedure_list_spec
    : id_ref
	{ sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE procedure_list_clause_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

control_list_spec
    : id_ref { sar_object_reference (&$1); }
    | LEFT_BRACE RIGHT_BRACE
    | LEFT_BRACE control_list_clause_list RIGHT_BRACE
    | error { lex_issue_error (RIGHT_BRACE); } RIGHT_BRACE
    ;

argument_list_clause_list
    : argument_list_clause
    | argument_list_clause_list argument_list_clause
    ;

callback_list_clause_list
    : callback_list_clause
    | callback_list_clause_list callback_list_clause
    ;

procedure_list_clause_list
    : procedure_list_clause
    | procedure_list_clause_list procedure_list_clause
    ;

control_list_clause_list
    : control_list_clause
    | control_list_clause_list control_list_clause
    ;

argument_list_clause
    : argument_list_def SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | argument_list_item SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

callback_list_clause
    : callback_list_def SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | callback_list_item SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

procedure_list_clause
    : procedure_list_def SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | procedure_list_def_ref SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

control_list_clause
    : control_list_def SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | control_list_item SEMICOLON
	{ sar_save_src_entry_end (&$2, &$1); sar_add_list_entry (&$1); $$ = gz_yynullval; }
    | error { lex_issue_error (SEMICOLON); } SEMICOLON
    ;

control_list_def
    : epsilon_production
	{ $$ = gz_yynullval; sar_create_object (&$1, sym_k_list_entry); }
      control_list_specification
	{ $$ = $1; }
    ;

argument_list_def
    : epsilon_production
	{ $$ = gz_yynullval; sar_create_object (&$1, sym_k_list_entry); }
      argument_list_specification
	{ $$ = $1; }
    ;

callback_list_def
    : epsilon_production
	{ $$ = gz_yynullval; sar_create_object (&$1, sym_k_list_entry); }
      callback_list_specification
	{ $$ = $1; }
    ;

procedure_list_def
    : epsilon_production
	{ $$ = gz_yynullval; sar_create_object (&$1, sym_k_list_entry); }
      procedure_list_specification
	{ $$ = $1; }
    ;

control_list_item

/*	Control item	*/

    : opt_managed control_item
	{ sar_save_control_item (&$1, &$2); $$ = $1; }

    | id 
	{ sar_create_object (& $1, sym_k_widget_entry); $1.b_flags = sym_m_managed; $$ = gz_yynullval;}
      COLON 
      control_object_definition
	{ sar_save_control_widget (& $1, & $2); $$ = $1; }
/* Child */
    | CHILD_NAME opt_child_managed
        { sar_create_child (& $1); $1.b_flags = sym_m_managed; 
	  $$ = gz_yynullval; } 
      child_object_spec
        { sar_save_control_widget (& $1, & $2); $$ = $1; } 
    | CHILD_NAME UNMANAGED
        { sar_create_child (& $1); $$ = gz_yynullval; } 
      child_object_spec
        { sar_save_control_widget (& $1, & $3); $$ = $1; } 
    ;

opt_child_managed
    : epsilon_production
    | MANAGED
    ;


argument_list_item

/*	Argument value pair	*/

    : value EQUAL_SIGN value
	{ sar_save_argument_pair (&$1, &$3, &$2); $$ = $1; }

/*	Argument widget pair	*/

    | value EQUAL_SIGN CLASS_NAME id_ref
	{ YYSTYPE temp [2];
	  temp [0] = gz_yynullval;
	  sar_create_object (&temp [0], sym_k_widget_entry);
	  temp [1] = $3; sar_set_object_class (&temp [1]);
	  temp [1] = $4; sar_object_reference (&temp [1]);
	  sar_verify_object (&temp [1]);
	  sar_save_argument_pair (&$1, &temp [0], &$2); $$ = $1; }
    ;

callback_list_item

/*	Callback reason binding		*/

    : value EQUAL_SIGN procedure_reference
	{ sar_save_reason_binding (&$1, &$3, &$2); $$ = $1; }
    | value EQUAL_SIGN procedure_list_def
	{ sar_save_reason_binding (&$1, &$3, &$2); $$ = $1; }
    ;

control_item
    : epsilon_production
	{ sar_create_object (&$1, sym_k_widget_entry); $$ = gz_yynullval; }
      control_object_specification
	{ $$ = $1; }
    ;

opt_managed
    : epsilon_production
	{ $$.b_flags = sym_m_managed; }
    | MANAGED
	{ $$ = gz_yynullval; $$.b_flags = sym_m_managed; }
    | UNMANAGED
	{ $$ = gz_yynullval; }
    ;

procedure_reference
    : PROCEDURE id_ref opt_procedure_argument
	{ sar_process_proc_ref (&$2, &$3, sym_k_callback_proc); $$ = $2; }
    ;

procedure_list_def_ref
    : id_ref opt_procedure_argument
	{ sar_process_proc_ref (&$1, &$2, sym_k_callback_proc); $$ = $1; }
    ;

opt_procedure_argument
    : epsilon_production
    | LEFT_PAREN value RIGHT_PAREN
	{ $$ = $2; }
    | LEFT_PAREN CLASS_NAME id_ref RIGHT_PAREN
	{ YYSTYPE temp [2];
	  temp [0] = gz_yynullval;
	  sar_create_object (&temp [0], sym_k_widget_entry);
	  temp [1] = $2; sar_set_object_class (&temp [1]);
	  temp [1] = $3; sar_object_reference (&temp [1]);
	  sar_verify_object (&temp [1]);
	  $$ = temp [0]; }
    | LEFT_PAREN RIGHT_PAREN
  	{ $$ = gz_yynullval; }
    ;



/*	definition of an id 	*/

id
    : NAME
    | FONT_NAME
    | COLOR_NAME
    | ARGUMENT_NAME
    | REASON_NAME
    | ENUMVAL_NAME
    | CHILD_NAME
    | keyword						{ sar_map_keyword_to_name( &$$, &$1); }
    ;

/*	reference of an id 	*/

id_ref
    : id
	{ sar_process_id_ref (&$1); $$ = $1; }
    ;

keyword
    : STRING
    | BOOLEAN
    | FLOAT
    | INTEGER
    | FONT
    | ARGUMENT
    | REASON
    | PIXMAP
    | COLOR

    | NAMES
    | CASE_SENSITIVE
    | CASE_INSENSITIVE

    | VERSION

    | MANAGED
    | UNMANAGED

    | UILFILE

    | string_table_type
    | asciz_table_type
    | INTEGER_TABLE
    | TRANSLATION_TABLE
    | COMPOUND_STRING
    | COMPOUND_STRING_COMPONENT
    | CLASS_REC_NAME
    | FONT_TABLE
    | RIGHT_TO_LEFT
    | CHARACTER_SET
    | COLOR_TABLE
    | ICON
    | BACKGROUND
    | FOREGROUND
    | XBITMAPFILE
    | SEPARATE

    | ANY

    | IMPORTED
    | OBJECTS
    | KEYSYM
    | SINGLE_FLOAT
    | RGB
    | WIDE_CHARACTER
    | FONTSET
    ;



/*    values    */

character_8_value    : value	
               { 
                 $$ = $1; 
		 if (($$.b_type != sym_k_error_value) &&
		     ($$.b_type != sym_k_any_value) &&
		    (($$.b_flags &sym_m_forward_ref) == 0))
		       {
			if (($$.b_type != sym_k_char_8_value) &&
			    ($$.b_type != sym_k_localized_string_value))
		  	    sar_value_type_error( &$$, sym_k_char_8_value );
			if (($$.b_flags &sym_m_private) == 0) 
			    sar_private_error( &$$ );
		       }
		}
    ;

private_value
    : value							{ $$ = $1; 
								  if ($$.b_type != sym_k_error_value)
								  {
								    if ((($$.b_flags &sym_m_private) == 0) &&
									(($$.b_flags &sym_m_forward_ref) == 0))
									sar_private_error( &$$ );
								  }
 								} 
     ;
  
 /* BEGIN HaL fix CR 5427 */
 
 private_value_plus
     : non_export_value					        { $$ = $1; 
 								  if ($$.b_type != sym_k_error_value)
 								  {
 								    if ((($$.b_flags &sym_m_private) == 0) &&
 									(($$.b_flags &sym_m_forward_ref) == 0))
 									sar_private_error( &$$ );
 								  }
							}
     | value							{ $$ = $1; 
 								  if ($$.b_type != sym_k_error_value)
 								  {
 								    if ((($$.b_flags &sym_m_private) == 0) &&
 									(($$.b_flags &sym_m_forward_ref) == 0))
 									sar_private_error( &$$ );
 								  }
 								}  
  
 non_export_value
     : COLOR_TABLE LEFT_PAREN color_list RIGHT_PAREN		{ sar_make_color_table( &$$, &$3, &$1); }
 
 /* END HaL fix CR 5427 */
 

value
    : value_1
    | value OR value_1						{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    | value XOR value_1						{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    ;

value_1
    : value_2
    | value_1 AND value_2					{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    ;

value_2
    : value_3
    | value_2 LEFT_SHIFT value_3				{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    | value_2 RIGHT_SHIFT value_3				{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    ;

value_3
    : value_4
    | value_3 PLUS value_4					{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    | value_3 MINUS value_4					{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    ;

value_4
    : value_5
    | value_4 MULTIPLY value_5					{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    | value_4 DIVIDE value_5					{ $$ = $2; sar_binary_op( &$$, &$1, &$3 ); }
    ;

value_5
    : value_6
    | MINUS value_5						{ $$ = $1; sar_unary_op( &$$, &$2 ); }
    | NOT value_5						{ $$ = $1; sar_unary_op( &$$, &$2 ); }
    | PLUS value_5						{ $$ = $1; sar_unary_op( &$$, &$2 ); }
    ;

value_6
    : operand
    | LEFT_PAREN value RIGHT_PAREN				{ $$ = $2; }
    ;

operand
    : UNS_INT_LITERAL						{ sar_make_private_value( &$$, &$1, sym_k_integer_value, 
								  &$1, XmPIXELS); }
    | UNS_INT_LITERAL units_specification			{ sar_make_private_value( &$$, &$1, sym_k_integer_value, 
								  &$1, sar_get_units_type(&$2)); }
    | optional_charset CHAR_8_LITERAL				{ /* Don't use FALSE because it is a token not a Boolean! */
								  Uil_lex_l_charset_specified = 0; 
								  sar_make_private_value( &$$, &$2, sym_k_char_8_value, 
								  &$2, 0); }
    | id							{ sar_process_id( &$$, &$1 );}
    | UNS_FLOAT_LITERAL						{ sar_make_private_value( &$$, &$1, sym_k_float_value, 
								  &$1, XmPIXELS); }
    | UNS_FLOAT_LITERAL units_specification			{ sar_make_private_value( &$$, &$1, sym_k_float_value, 
								  &$1, sar_get_units_type(&$2)); }
    | PIXMAP LEFT_PAREN character_8_value RIGHT_PAREN		{ sar_value_not_implemented( &$$, &$1, "pixmap literal" ); }
    | FONT LEFT_PAREN font_spec RIGHT_PAREN			{ $$ = $3; }
    | FONTSET LEFT_PAREN fontset_spec RIGHT_PAREN		{ $$ = $3; }
    | COLOR LEFT_PAREN color_spec RIGHT_PAREN			{ $$ = $3; }
    | REASON LEFT_PAREN character_8_value RIGHT_PAREN		{ sar_make_private_value(&$$, &$3, sym_k_reason_value, 
								  &$1, 0); }
    | CLASS_REC_NAME LEFT_PAREN character_8_value RIGHT_PAREN	{ sar_make_private_value(&$$, &$3, sym_k_class_rec_name_value,
											 &$1, 0); }
    | ARGUMENT LEFT_PAREN character_8_value opt_arg_type RIGHT_PAREN
								{ sar_make_private_value
								      ( &$$, &$3, sym_k_argument_value, &$1, $4.b_type ); }
    | UILTRUE							{ sar_make_private_value( &$$, &$1, sym_k_bool_value, 
								  &$1, 0); }
    | UILFALSE							{ sar_make_private_value( &$$, &$1, sym_k_bool_value, 
								  &$1, 0); }
    | ON							{ sar_make_private_value( &$$, &$1, sym_k_bool_value, 
								  &$1, 0); }
    | OFF							{ sar_make_private_value( &$$, &$1, sym_k_bool_value, 
								  &$1, 0); }
    | optional_charset COMP_STRING				{ /* Don't use FALSE because it is a token not a Boolean! */
								  Uil_lex_l_charset_specified = 0;
								  sar_make_private_value
								      ( &$$, &$2, sym_k_compound_string_value, &$2, 0); }
    | string_table_type LEFT_PAREN comp_str_list RIGHT_PAREN	{ sar_make_private_value( &$$, &$3, sym_k_string_table_value, 
								  &$1, 0); }
    | asciz_table_type LEFT_PAREN asciz_list RIGHT_PAREN	{ sar_make_private_value( &$$, &$3, sym_k_asciz_table_value, 
								  &$1, 0); }
    | INTEGER_TABLE LEFT_PAREN integer_list RIGHT_PAREN		{ sar_make_private_value( &$$, &$3, sym_k_integer_table_value, 
								  &$1, 0); }
    | TRANSLATION_TABLE LEFT_PAREN string_list RIGHT_PAREN	{ sar_make_private_value( &$$, &$3, sym_k_trans_table_value, 
								  &$1, 0); }
    | COMPOUND_STRING LEFT_PAREN comp_str_result RIGHT_PAREN	{ $$ = $3; }
    | COMPOUND_STRING_COMPONENT LEFT_PAREN comp_str_comp_result RIGHT_PAREN	{ $$ = $3; } 
    | FONT_TABLE LEFT_PAREN font_list RIGHT_PAREN		{ $$ = $3; }
    | ICON LEFT_PAREN icon_spec RIGHT_PAREN			{ $$ = $3; }
    | FLOAT LEFT_PAREN value RIGHT_PAREN			{ $$ = $1; sar_unary_op( &$$, &$3 ); }
    | INTEGER LEFT_PAREN value RIGHT_PAREN			{ $$ = $1; sar_unary_op( &$$, &$3 ); }

    | XBITMAPFILE LEFT_PAREN character_8_value RIGHT_PAREN	{ sar_make_private_value(&$$, &$3, sym_k_xbitmapfile_value,
											 &$1, 0); }

    | KEYSYM LEFT_PAREN character_8_value RIGHT_PAREN		{ sar_make_private_value(&$$, &$3, sym_k_keysym_value,
											 &$1, 0); }

    | SINGLE_FLOAT	LEFT_PAREN value RIGHT_PAREN	        { $$ = $1; sar_unary_op( &$$, &$3 ); }

    | RGB LEFT_PAREN rgb_list RIGHT_PAREN			{ sar_make_private_value( & $$, & $3, sym_k_rgb_value, 
								  &$1, 0); }
    | WIDE_CHARACTER LEFT_PAREN wchar_str_result RIGHT_PAREN	{ $$ = $3; }
    | LOC_STRING						{ sar_make_private_value(&$$, &$1, sym_k_localized_string_value,
								  &$1, 0); }
    ;

string_list
    : /* empty */
	{ $$ = gz_yynullval; }
    | string_list_2
	{ $$ = $1; }
    ;

string_list_2
    : private_value
	{ sar_append_table_value (&$1, &gz_yynullval, sym_k_trans_table_value, &$1); $$ = $1; }
    | string_list_2 COMMA private_value
	{ sar_append_table_value (&$3, &$1, sym_k_trans_table_value, &$2); $$ = $3; }
    ;

asciz_list
    : /* empty */
	{ $$ = gz_yynullval; }
    | asciz_list_2
	{ $$ = $1; }
    ;

asciz_list_2
    : private_value
	{ sar_append_table_value (&$1, &gz_yynullval, sym_k_asciz_table_value, &$1); $$ = $1; }
    | asciz_list_2 COMMA private_value
	{ sar_append_table_value (&$3, &$1, sym_k_asciz_table_value, &$2); $$ = $3; }
    ;

integer_list
    : /* empty */
	{ $$ = gz_yynullval; }
    | integer_list_2
	{ $$ = $1; }
    ;

integer_list_2
    : private_value
	{ sar_append_table_value (&$1, &gz_yynullval, sym_k_integer_table_value, &$1); $$ = $1; }
    | integer_list_2 COMMA private_value
	{ sar_append_table_value (&$3, &$1, sym_k_integer_table_value, &$2); $$ = $3; }
    ;

/* RAP rgb data type */
rgb_list
  : private_value COMMA private_value COMMA private_value
{sar_append_table_value(&$1, & gz_yynullval, sym_k_integer_table_value, & $1);
     sar_append_table_value(& $3, & $1, sym_k_integer_table_value, & $2);
     sar_append_table_value(& $5, & $3, sym_k_integer_table_value, & $4);
     $$ = $5;}
  ;


comp_str_list
    : /* empty */
	{ $$ = gz_yynullval; }
    | comp_str_list_2
	{ $$ = $1; }
    ;

comp_str_list_2
    : private_value
	{ sar_append_table_value (&$1, &gz_yynullval, sym_k_string_table_value, &$1); $$ = $1; }
    | comp_str_list_2 COMMA private_value
	{ sar_append_table_value (&$3, &$1, sym_k_string_table_value, &$2); $$ = $3; }
    ;

opt_arg_type
    : /* empty */					{ $$ = gz_yynullval; $$.b_type = sym_k_any_value; }
    | COMMA arg_value_type					{ $$ = gz_yynullval; $$.b_type = $2.b_type; }
    | COMMA ANY 					{ $$ = gz_yynullval; $$.b_type = sym_k_any_value; }
    ;

comp_str_result
    : private_value 					{ sar_make_comp_str( &$$, &$1, &gz_yynullval, &$-1 ); }
    | private_value comp_str_attrs			{ sar_make_comp_str( &$$, &$1, &$2, &$-1 ); }
    ;

comp_str_comp_result
    : ENUMVAL_NAME	{ sar_make_comp_str_comp(&$$, &$1, &gz_yynullval, &$-1 ); }
    | ENUMVAL_NAME COMMA ENUMVAL_NAME	{ sar_make_comp_str_comp( &$$, &$1, &$3, &$-1 ); } 
    | ENUMVAL_NAME COMMA CHAR_8_LITERAL	{ sar_make_comp_str_comp( &$$, &$1, &$3, &$-1 ); } 
    | ENUMVAL_NAME COMMA LOC_STRING	{ sar_make_comp_str_comp( &$$, &$1, &$3, &$-1 ); } 
    | ENUMVAL_NAME COMMA CHARSET_NAME	{ sar_make_comp_str_comp( &$$, &$1, &$3, &$-1 ); } 
    ;

comp_str_attrs
    : COMMA comp_str_attr				{ sar_chk_comp_str_attr( &$$, &$2, &gz_yynullval ); }
    | comp_str_attrs COMMA comp_str_attr		{ sar_chk_comp_str_attr( &$$, &$3, &$1 ); }
    ;

comp_str_attr
    : CHARACTER_SET EQUAL_SIGN valid_charset		{ $$.b_type = $1.b_type; 
							  $$.b_tag = $3.b_tag;
							  $$.value.az_keyword_entry = $3.value.az_keyword_entry;
							  $$.value.az_symbol_entry = $3.value.az_symbol_entry; }
    | RIGHT_TO_LEFT EQUAL_SIGN private_value		{ $$.b_type = $1.b_type; 
							  $$.value.az_symbol_entry = $3.value.az_symbol_entry; }
    | SEPARATE EQUAL_SIGN private_value			{ $$.b_type = $1.b_type; 
							  $$.value.az_symbol_entry = $3.value.az_symbol_entry; }
    ;

wchar_str_result
    : private_value					{ sar_make_wchar_str( &$$, &$1, &gz_yynullval, &$-1 ); }
    ;

font_spec
    : character_8_value COMMA CHARACTER_SET EQUAL_SIGN valid_charset 
							{ sar_make_font( &$$, &$5, &$1, &$-1 ); }
    | character_8_value					{ sar_make_font( &$$, &gz_yynullval, &$1, &$-1 ); }
    ; 

fontset_spec
    : character_8_value COMMA CHARACTER_SET EQUAL_SIGN valid_charset 
							{ sar_make_fontset( &$$, &$5, &$1, &$-1 ); }
    | character_8_value					{ sar_make_fontset( &$$, &gz_yynullval, &$1, &$-1 ); }
    ; 

font_list						
    : font_item						{ sar_make_font_table( &$$, &$1, &gz_yynullval, &$-1 ); }
    | font_list COMMA font_item				{ sar_make_font_table( &$$, &$3, &$1, &$-1 ); }
    ;

/*
** THIS PRODUCTION DOESN'T LOOK RIGHT!!!!!!!!!!!!!!!!!!!!!!
*/
font_item
    : valid_charset EQUAL_SIGN private_value		{ sar_make_font_item( &$$, &$1, &$3 ); }
    | private_value					{ sar_make_font_item( &$$, &gz_yynullval, &$1 ); }
    ;

optional_charset
    : POUND valid_charset				{ /* Don't use TRUE because it is a token not a Boolean! */
							  $$ = $2; 
							  Uil_lex_l_charset_specified = 1;}
    | epsilon_production
    ;
    

valid_charset
    : CHARSET_NAME					{ sar_charset_verify (&$1); $$ = $1; }
    | CHARACTER_SET LEFT_PAREN charset_info RIGHT_PAREN	{ $$ = $3; }
    | NAME			{ sar_make_fallback_charset(&$1);
				  $$ = $1; } 
			   
    ;

charset_info
    : character_8_value				    	{ sar_make_private_value(&$$, &$1, sym_k_char_8_value, 
							  &$1, 0);
							  sar_make_charset (&$$, &$$, &gz_yynullval, &$1); }
    | character_8_value charset_attrs			{ sar_make_private_value(&$$, &$1, sym_k_char_8_value, 
							  &$1, 0);
							  sar_make_charset (&$$, &$$, &$2, &$1); }
    ;

charset_attrs
    : COMMA charset_attr				{ sar_chk_charset_attr( &$$, &$2, &gz_yynullval ); }
    | charset_attrs COMMA charset_attr			{ sar_chk_charset_attr( &$$, &$3, &$1 ); }
    ;

charset_attr
    : RIGHT_TO_LEFT EQUAL_SIGN private_value		{ $$.b_type = $1.b_type; 
							  if ($3.b_type != sym_k_bool_value) 
							      sar_value_type_error( &$3, sym_k_bool_value );
							  $$.value.az_symbol_entry = $3.value.az_symbol_entry; }
    | SIXTEEN_BIT EQUAL_SIGN private_value		{ $$.b_type = $1.b_type; 
							  if ($3.b_type != sym_k_bool_value) 
							      sar_value_type_error( &$3, sym_k_bool_value );
							  $$.value.az_symbol_entry = $3.value.az_symbol_entry; }
    ;

color_list
    : color_item					{ sar_append_color_item( &$$, &$1, &gz_yynullval ); }
    | color_list COMMA color_item			{ sar_append_color_item( &$$, &$3, &$1 ); }
    ;

color_item
    : BACKGROUND COLOR EQUAL_SIGN character_8_value	{ sar_make_color_item( &$$, &$1, &$4 ); }
    | FOREGROUND COLOR EQUAL_SIGN character_8_value	{ sar_make_color_item( &$$, &$1, &$4 ); }
    | value EQUAL_SIGN character_8_value		{ sar_make_color_item( &$$, &$1, &$3 ); }
    ;

color_spec
    : character_8_value 				{ sar_make_color( &$$, &$1, &gz_yynullval, &$-1 ); }
    | character_8_value COMMA mono_color_spec		{ sar_make_color( &$$, &$1, &$3, &$-1 ); }
    ;

mono_color_spec
    : BACKGROUND
    | FOREGROUND
    ;

icon_spec
    : icon_rows						{ sar_make_icon( &$$, &$1, &gz_yynullval, &$-1); }
    | COLOR_TABLE EQUAL_SIGN private_value COMMA icon_rows
							{ sar_make_icon( &$$, &$5, &$3, &$-1 ); }
    ;

icon_rows
    : private_value
				{ sar_append_table_value (&$1, &gz_yynullval, sym_k_icon_value, &$1); $$ = $1; }
    | icon_rows COMMA private_value
				{ sar_append_table_value (&$3, &$1, sym_k_icon_value, &$2); $$ = $3; }
    ;

units_specification
    : PIX
	{ $$ = $1; }
    | PIXEL
	{ $$ = $1; }
    | PIXELS
	{ $$ = $1; }
    | IN
	{ $$ = $1; }
    | INCH
	{ $$ = $1; }
    | INCHES
	{ $$ = $1; }
    | CM
	{ $$ = $1; }
    | CENTIMETER
	{ $$ = $1; }
    | CENTIMETERS
	{ $$ = $1; }
    | MM
	{ $$ = $1; }
    | MILLIMETER
	{ $$ = $1; }
    | MILLIMETERS
	{ $$ = $1; }
    | PT
	{ $$ = $1; }
    | POINT
	{ $$ = $1; }
    | POINTS
	{ $$ = $1; }
    | FU
	{ $$ = $1; }
    | FONT_UNIT
	{ $$ = $1; }
    | FONT_UNITS
	{ $$ = $1; }
    ;

%%

/*    Dummy error routine for the parser.  We will output our own
      error messages.    */

int yyerror (s)
char	* s;
{
	return 0;
}



