Wirth–Weber precedence relationship

In computer science, a Wirth–Weber relationship between a pair of symbols $$(V_t \cup V_n)$$ is necessary to determine if a formal grammar is a simple precedence grammar. In such a case, the simple precedence parser can be used. The relationship is named after computer scientists Niklaus Wirth and Helmut Weber.

The goal is to identify when the viable prefixes have the pivot and must be reduced. A $$\gtrdot$$ means that the pivot is found, a $$\lessdot$$ means that a potential pivot is starting, and a $$ \doteq$$ means that a relationship remains in the same pivot.

Formal definition

 * $$ G = \langle V_n, V_t, S, P \rangle $$
 * $$\begin{align}

X \doteq Y &\iff \begin{cases} A \to \alpha X Y \beta \in P \\  A \in V_n \\ \alpha, \beta \in (V_n \cup V_t)^* \\ X, Y \in (V_n \cup V_t) \end{cases}  \\ X \lessdot Y &\iff \begin{cases} A \to \alpha X B \beta \in P \\ B \Rightarrow^+ Y \gamma \\ A, B \in V_n \\ \alpha, \beta, \gamma \in (V_n \cup V_t)^* \\ X, Y \in (V_n \cup V_t) \end{cases} \\ X \gtrdot Y &\iff \begin{cases} A \to \alpha B Y \beta \in P \\ B \Rightarrow^+ \gamma X \\ Y \Rightarrow^* a \delta \\ A, B \in V_n \\ \alpha, \beta, \gamma, \delta \in (V_n \cup V_t)^* \\ X, Y \in (V_n \cup V_t) \\ a \in V_t \end{cases} \end{align}$$

Precedence relations computing algorithm
We will define three sets for a symbol:
 * $$\begin{align}

\mathrm{Head}^+(X) &= \{Y\mid X \Rightarrow^+ Y \alpha \}\\ \mathrm{Tail}^+(X) &= \{Y\mid X \Rightarrow^+ \alpha Y \}\\ \mathrm{Head}^*(X) &= (\mathrm{Head}^+(X) \cup \{ X \}) \cap V_t \end{align}$$

The pseudocode for computing relations is:


 * RelationTable := &empty;
 * For each production $$ A \to \alpha \in P $$
 * For each two adjacent symbols $X Y$ in $&alpha;$
 * add(RelationTable, $$X \doteq Y$$)
 * add(RelationTable, $$X \lessdot \mathrm{Head}^+(Y)$$)
 * add(RelationTable, $$\mathrm{Tail}^+(X) \gtrdot \mathrm{Head}^*(Y)$$)
 * add(RelationTable, $$\$ \lessdot \mathrm{Head}^+(S)$$) where $S$ is the initial non terminal of the grammar, and $ is a limit marker
 * add(RelationTable, $$\mathrm{Tail}^+(S) \gtrdot \$ $$) where $S$ is the initial non terminal of the grammar, and $ is a limit marker



Example 1
$$S \to aSSb | c$$


 * Head$+$(a) = &empty;
 * Head$+$(S) = {a, c}
 * Head$+$(b) = &empty;
 * Head$+$(c) = &empty;
 * Tail$+$(a) = &empty;
 * Tail$+$(S) = {b, c}
 * Tail$+$(b) = &empty;
 * Tail$+$(c) = &empty;
 * Head$$(a) = a
 * Head$$(S) = {a, c}
 * Head$$(b) = b
 * Head$$(c) = c
 * $$S \to aSSb$$
 * a Next to S
 * $$ a \doteq S $$
 * $$ a \lessdot \mathrm{Head}^+(S)$$
 * $$ a \lessdot a $$
 * $$ a \lessdot c $$
 * S Next to S
 * $$ S \doteq S $$
 * $$ S \lessdot \mathrm{Head}^+(S)$$
 * $$ S \lessdot a $$
 * $$ S \lessdot c $$
 * $$\mathrm{Tail}^+(S) \gtrdot \mathrm{Head}^*(S)$$
 * $$ b \gtrdot a $$
 * $$ b \gtrdot c $$
 * $$ c \gtrdot a $$
 * $$ c \gtrdot c $$
 * S Next to b
 * $$ S \doteq b $$
 * $$\mathrm{Tail}^+(S) \gtrdot \mathrm{Head}^*(b)$$
 * $$ b \gtrdot b $$
 * $$ c \gtrdot b $$
 * $$S \to c$$
 * there is only one symbol, so no relation is added.

& S & a & b & c & \$ \\ \hline S & \doteq & \lessdot  &  \doteq  &  \lessdot & \\ a & \doteq & \lessdot &   & \lessdot & \\ b &   & \gtrdot &  \gtrdot  & \gtrdot & \gtrdot \\ c &   & \gtrdot & \gtrdot & \gtrdot & \gtrdot \\ \$ &  & \lessdot &    & \lessdot & \end{array}$$
 * precedence table: $$\begin{array}{c|ccccc}

Example 2
$$S \to a | aT | [S]$$

$$T \to b | bT$$


 * Head$+$( S ) = { a, [ }
 * Head$+$( a ) = &empty;
 * Head$+$( T ) = { b }
 * Head$+$( [ ) = &empty;
 * Head$+$( ] ) = &empty;
 * Head$+$( b ) = &empty;


 * Tail$+$( S ) = { a, T, ], b }
 * Tail$+$( a ) = &empty;
 * Tail$+$( T ) = { b, T }
 * Tail$+$( [ ) = &empty;
 * Tail$+$( ] ) = &empty;
 * Tail$+$( b ) = &empty;


 * Head$$( S ) = { a, [ }
 * Head$$( a ) = a
 * Head$$( T ) = { b }
 * Head$$( [ ) = [
 * Head$$( ] ) = ]
 * Head$$( b ) = b


 * $$S \to aT$$


 * a Next to T
 * $$ a \doteq T $$
 * $$ a \lessdot \mathrm{Head}^+(T)$$
 * $$ a \lessdot b $$


 * $$S \to [S]$$


 * [ Next to S
 * $$ [ \doteq S $$
 * $$ [ \lessdot \mathrm{Head}^+(S)$$
 * $$ [ \lessdot a $$
 * $$ [ \lessdot [ $$


 * S Next to ]
 * $$ S \doteq ] $$
 * $$\mathrm{Tail}^+( S ) \gtrdot \mathrm{Head}^*( ] )$$
 * $$ a \gtrdot ] $$
 * $$ T \gtrdot ] $$
 * $$ ] \gtrdot ] $$
 * $$ b \gtrdot ] $$


 * $$T \to bT$$


 * b Next to T
 * $$ b \doteq T $$
 * $$ b \lessdot \mathrm{Head}^+(T)$$
 * $$ b \lessdot b $$

& S     & T      & a        & b        & [        & ]       & \$ \\ \hline S       &        &        &          &          &          & \doteq  & \doteq \\ T       &        &        &          &          &          & \gtrdot & \gtrdot \\ a       &        & \doteq &          & \lessdot &          & \gtrdot & \gtrdot \\ b       &        & \doteq &          & \lessdot &          & \gtrdot & \gtrdot \\ \text{[} & \doteq &       & \lessdot &          & \lessdot &         & \\ ]       &        &        &          &          &          & \gtrdot & \gtrdot \\ \$      & \doteq &        & \lessdot &          & \lessdot &         & \end{array}$$
 * precedence table: $$\begin{array}{c|ccccccc}