Simple precedence grammar

Last updated

In computer science, a simple precedence grammar is a context-free formal grammar that can be parsed with a simple precedence parser. [1] The concept was first created in 1964 by Claude Pair, [2] and was later rediscovered, from ideas due to Robert Floyd, by Niklaus Wirth and Helmut Weber who published a paper, entitled EULER: a generalization of ALGOL, and its formal definition, published in 1966 in the Communications of the ACM. [3]

Contents

Formal definition

G = (N, Σ, P, S) is a simple precedence grammar if all the production rules in P comply with the following constraints:

Examples

precedence table

Simple precedence parser

A simple precedence parser is a type of bottom-up parser for context-free grammars that can be used only by simple precedence grammars.

The implementation of the parser is quite similar to the generic bottom-up parser. A stack is used to store a viable prefix of a sentential form from a rightmost derivation. The symbols ⋖, ≐ and ⋗ are used to identify the pivot, and to know when to Shift or when to Reduce.

Implementation

SearchProductionToReduce (Stack)

Example

Given following language, which can parse arithmetic expressions with the multiplication and addition operations:

E  --> E + T' | T' T' --> T T  --> T * F  | F F  --> ( E' ) | num E' --> E 

num is a terminal, and the lexer parse any integer as num; E represents an arithmetic expression, T is a term and F is a factor.

and the Parsing table:

EE'TT'F+*()num$
E
E'
T
T'
F
+
*
(
)
num
$
STACK PRECEDENCE INPUT ACTION
$ 2 * ( 1 + 3 )$ SHIFT
$ ⋖ 2 * ( 1 + 3 )$ REDUCE (F -> num)
$ ⋖ F * ( 1 + 3 )$ REDUCE (T -> F)
$ ⋖ T * ( 1 + 3 )$ SHIFT
$ ⋖ T ≐ * ( 1 + 3 )$ SHIFT
$ ⋖ T ≐ * ⋖ ( 1 + 3 )$ SHIFT
$ ⋖ T ≐ * ⋖ ( ⋖ 1 + 3 )$ REDUCE 4× (F -> num) (T -> F) (T' -> T) (E ->T ')
$ ⋖ T ≐ * ⋖ ( ⋖ E + 3 )$ SHIFT
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ + 3 )$ SHIFT
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ + < 3 )$ REDUCE 3× (F -> num) (T -> F) (T' -> T)
$ ⋖ T ≐ * ⋖ ( ⋖ E ≐ + ≐ T )$ REDUCE 2× (E -> E + T) (E' -> E)
$ ⋖ T ≐ * ⋖ ( ≐ E' )$ SHIFT
$ ⋖ T ≐ * ⋖ ( ≐ E' ≐ ) $ REDUCE (F -> ( E' ))
$ ⋖ T ≐ * ≐ F $ REDUCE (T -> T * F)
$ ⋖ T $ REDUCE 2× (T' -> T) (E -> T')
$ ⋖ E $ ACCEPT

Wirth–Weber precedence relationship

In computer science, a Wirth–Weber relationship between a pair of symbols 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.

Formal definition

Precedence relations computing algorithm

We will define three sets for a symbol:

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:

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.

Example 1

precedence table

Example 2

precedence table

Notes

  1. The Theory of Parsing, Translation, and Compiling: Compiling, Alfred V. Aho, Jeffrey D. Ullman, Prentice–Hall, 1972.
  2. Claude Pair (1964). "Arbres, piles et compilation". Revue française de traitement de l'information., in English Trees, stacks and compiling
  3. Machines, Languages, and Computation , Prentice–Hall, 1978, ISBN   9780135422588, Wirth and Weber [1966] generalized Floyd's precedence grammars, obtaining the simple precedence grammars.

References

Further reading