Wirth–Weber precedence relationship

From testwiki
Jump to navigation Jump to search

Template:Multiple issues In computer science, a Wirth–Weber relationship between a pair of symbols (VtVn) 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 means that the pivot is found, a means that a potential pivot is starting, and a means that a relationship remains in the same pivot. Template:TOC right

Formal definition

G=Vn,Vt,S,P
XY{AαXYβPAVnα,β(VnVt)*X,Y(VnVt)XY{AαXBβPB+YγA,BVnα,β,γ(VnVt)*X,Y(VnVt)XY{AαBYβPB+γXY*aδA,BVnα,β,γ,δ(VnVt)*X,Y(VnVt)aVt

Precedence relations computing algorithm

We will define three sets for a symbol:

Head+(X)={YX+Yα}Tail+(X)={YX+αY}Head*(X)=(Head+(X){X})Vt
Head*(X) is X if X is a terminal, and if X is a non-terminal, Head*(X) is the set with only the terminals belonging to Head+(X). This set is equivalent to First-set or Fi(X) described in LL parser.
Head+(X) and Tail+(X) are ∅ if X is a terminal.

The pseudocode for computing relations is:

  • RelationTable := ∅
  • For each production AαP
    • For each two adjacent symbols Template:Mvar in Template:Mvar
      • add(RelationTable, XY)
      • add(RelationTable, XHead+(Y))
      • add(RelationTable, Tail+(X)Head*(Y))
  • add(RelationTable, $Head+(S)) where Template:Mvar is the initial non terminal of the grammar, and $ is a limit marker
  • add(RelationTable, Tail+(S)$) where Template:Mvar is the initial non terminal of the grammar, and $ is a limit marker
and are used with sets instead of elements as they were defined, in this case you must add all the cartesian product between the sets/elements.

Examples

Example 1

SaSSb|c

precedence table
Sabc$Sabc$

Example 2

Sa|aT|[S]

Tb|bT

  • SaT
    • a Next to T
      • aT
      • aHead+(T)
        • ab
  • S[S]
    • [ Next to S
      • [S
      • [Head+(S)
        • [a
        • [[
    • S Next to ]
      • S]
      • Tail+(S)Head*(])
        • a]
        • T]
        • ]]
        • b]
  • TbT
    • b Next to T
      • bT
      • bHead+(T)
        • bb
precedence table
STab[]$STab[]$


Further reading

Template:Wirth