Wisent Overview
Wisent (the European Bison) is an implementation in Emacs Lisp of the GNU Compiler Compiler Bison. Its code is a port of the C code of GNU Bison 1.28 & 1.31.
For more details on the basic concepts for understanding Wisent, it is worthwhile to read the Bison Manual.
Wisent can generate compilers compatible with the Semantic tool set. See the Semantic Manual.
It benefits from these Bison features:
It uses a fast but not so space-efficient encoding for the parse tables, described in Corbett’s PhD thesis from Berkeley:
Static Semantics in Compiler Error Recovery
June 1985, Report No. UCB/CSD 85/251.For generating the lookahead sets, Wisent uses the well-known technique of F. DeRemer and T. Pennello described in:
Efficient Computation of LALR(1) Look-Ahead Sets
October 1982, ACM TOPLAS Vol 4 No 4, 615–49, https://doi.org/10.1145/69622.357187.Wisent resolves shift/reduce conflicts using operator precedence and associativity.
Parser error recovery is accomplished using rules which match the special token
error.
Nevertheless there are some fundamental differences between Bison and Wisent.
- Wisent is intended to be used in Emacs. It reads and produces Emacs Lisp data structures. All the additional code used in grammars is Emacs Lisp code.
- Contrary to Bison, Wisent does not generate a parser which combines Emacs Lisp code and grammar constructs. They exist separately. Wisent reads the grammar from a Lisp data structure and then generates grammar constructs as tables. Afterward, the derived tables can be included and byte-compiled in separate Emacs Lisp files, and be used at a later time by the Wisent’s parser engine.
- Wisent allows multiple start nonterminals and allows a call to the parsing function to be made for a particular start nonterminal. For example, this is particularly useful to parse a region of an Emacs buffer. Semantic heavily depends on the availability of this feature.