Need C language Description

Doug Gibbons ldg at druin.ATT.COM
Thu Aug 4 01:37:32 AEST 1988


Attribute grammars are yet another type of formal language 
definition, combining context free syntax with context sensitive 
semantics. An MS thesis I did while at the University of Colorado 
described the syntax and static semantics of C using an attribute 
grammar written in Aladin. Since I was finishing just as X3J11 was 
starting, the grammar does not describe ANSIisms.

Below is a grammar excerpt describing a C shift expression. The CFG
production appears first, followed by the attribution and context
conditions which must hold true. With a little effort, you can get a feel
for what is going on here.  The "{in|out}" attributes are used to thread 
various symbol tables through the production. The interesting things
computed here are:

	SHIFT_EXP[1].at_type		the expression's type
	SHIFT_EXP[1].at_value		the expression's value
	SHIFT_EXP[1].at_eval_time	when value can be known
	SHIFT_EXP[1].at_const_exp	is it a constant expression?

-------------------------------------------------------------------------------


rule r_39 :
	SHIFT_EXP ::= SHIFT_EXP SHIFT_OP ADD_EXP 
static
%
% Do the UAC balancing on the operands. Both must be integral types.
% The type is that of the converted left operand. If the right operand
% is negative or greater than the size (in bits) of the type of the
% left after the UAC, then the result is undefined. 
%
	SHIFT_EXP[1].at_const_exp :=
		SHIFT_EXP[2].at_const_exp and ADD_EXP.at_const_exp;
	SHIFT_EXP[1].at_eval_time :=
		if f_is_defined(SHIFT_EXP[1].at_value) then
			sc_constant
		else
			sc_run_time
		fi;
	SHIFT_EXP[1].at_id_defs_out := ADD_EXP.at_id_defs_out;
	SHIFT_EXP[1].at_lval_class := sc_rval;
	SHIFT_EXP[1].at_tag_names_out := ADD_EXP.at_tag_names_out;
	SHIFT_EXP[1].at_tag_props_out := ADD_EXP.at_tag_props_out;
	SHIFT_EXP[1].at_type :=
			f_balance(SHIFT_EXP[2].at_type, ADD_EXP.at_type);
	SHIFT_EXP[1].at_value :=
		f_eval_binary (
			SHIFT_OP.at_op,
			SHIFT_EXP[2].at_value,
			ADD_EXP.at_value);
	SHIFT_EXP[2].at_id_defs_in := SHIFT_EXP[1].at_id_defs_in;
	SHIFT_EXP[2].at_tag_names_in := SHIFT_EXP[1].at_tag_names_in;
	SHIFT_EXP[2].at_tag_props_in := SHIFT_EXP[1].at_tag_props_in;
	ADD_EXP.at_id_defs_in := SHIFT_EXP[2].at_id_defs_out;
	ADD_EXP.at_tag_names_in := SHIFT_EXP[2].at_tag_names_out;
	ADD_EXP.at_tag_props_in := SHIFT_EXP[2].at_tag_props_out;
condition
	f_is_integral(SHIFT_EXP[2].at_type) and
	f_is_integral(ADD_EXP.at_type) 
message
	"error: shift requires integral operands";
condition
	not f_is_neg_i(SHIFT_EXP[1].at_value)
message
	"warning: result of negative shift is non-portable";
condition
	if f_is_defined(ADD_EXP.at_value) then
		f_is_gt_i (
			ADD_EXP.at_value,
			f_mach_val (
				f_mach_bit_sizeof(SHIFT_EXP[1].at_type),
				sc_uint))
	else
		true
	fi
message
	"warning: magnitude of right operand of shift causes undefined value";
		
end;
-------------------------------------------------------------------------------

-- Doug Gibbons			| ldg at druhi.ATT.COM or att!druhi!ldg
-- AT&T Bell Laboratories 
-- Denver CO



More information about the Comp.lang.c mailing list