$include "defs.icn"
$include "global_vars.icn"
procedure precedence(p) # return the operator precedence associated with
    # denotation p.                                  */
	local stti, lvl
	yyinfo("precedence p = " || type(p))
	case (p.kind) of {
	    BLOCKDENOTATION : {
		if /p.bld_precedence then
		    p.bld_precedence := 0
		return(p.bld_precedence)
	    }
	    USELIST: {
		if /p.bld_precedence then
		    p.bld_precedence := 0
		return(p.usl_precedence)
	    }
	    WORDCAND:
		return(2)
	    WORDCOR:
		return(1)
	    OPRID: {
		if /(p.id_str_table_index) then
		    p.id_str_table_index := 0
		stti := p.id_str_table_index

		if (stti > pend[NLEVELS])
		then
		    {
			if ((p.kind) = OPRID)
			then
			    {
				return(3) # default precedence
			    }
			else

			    {
				return(INFINITE)
			    }
		    }
		lvl := 0
		while stti > pend[1 + lvl] do
		    lvl +:= 1
		return(lvl)
	    }



	    LETTERID : {
		if /(p.id_str_table_index) then
		    p.id_str_table_index := 0
		stti := p.id_str_table_index
		if (stti > pend[NLEVELS])
		then
		    {
			if ((p.kind) = OPRID)
			then
			    {
				return(3) # default precedence
			    }
			else

			    {
				return(INFINITE)
			    }
		    }
		lvl := 0
		while stti > pend[lvl + 1] do
		    lvl +:= 1
		return(lvl)

	    }

	    default :
		return(INFINITE)
	}
    end
