<?xml version="1.0"?><!DOCTYPE article SYSTEM "/project/take/software/searchbench_offline_processing/paperxml_generator/aclextractor/src/python/../resource/dtd/paperxml.dtd"><article><header><firstpageheader><page local="1"/><title>A MODULAR ARCHITECTURE FOR CONSTRAINT-BASED PARSING</title><author surname="Barthelemy" givenname="Francois"><org  name="INRIA" country="France" city="Le Chesnay"/></author><author surname="Rouaix" givenname="Francois"><org  name="INRIA" country="France" city="Le Chesnay"/></author></firstpageheader><frontmatter><p>A MODULAR ARCHITECTURE FOR CONSTRAINT-BASED PARSING</p><p>François Barthélémy** François Rouaix*</p><p>0 INRIA Rocquencourt, BP 105, 78153 Le Cliesnay codex, France <b>Jjb </b>Universidade Nova de Lisboa, 2825 Monte de Caparica, Portugal</p></frontmatter><abstract>This paper presents a framework and a system for implementing, comparing and analyzing parsers for some classes of Constraint-Based Grammars. The framework consists in a uniform theoretic description of parsing algorithms, and provides the structure for decomposing the system into logical components, with possibly several inter­changeable implementations. Many parsing al­gorithms can be obtained by composition of the modules of our system- Modularity is also a way of achieving code sharing for the common parts of these various algorithms. Furthermore, the de­sign helps reusing the existing modules when im­plementing other algorithms. The system uses the flexible modularity provided by the program­ming languages <b>Alcool-90, </b>based on a type system that ensures the safety of module composition. </abstract></header><body><section number="1" title="Introduction"><p>We designed a system to study parsing. Our aim was not to implement only one parsing algorithm, but as many as possible, in such a way that we could compare their performances. We wanted to study parsers' behavior rather than using them to exploit their parses. Furthermore, we wanted a system opened to new developments, impossible to predict at the time we began our project.</p><p>We achieved these aims by defining a modular architecture that gives us in addition code sharing between alternative implementations.</p><p>Our system, called APOC-II, implements more than 60 different parsing algorithms for Context-Free Grammars, Tree-Adjoining Grammars, and Definite-Clause Grammars. The different gener­ated parsers are comparable, because they are im­plemented in the same way, with common data structures. Experimental comparison can involve more than 20 parsers for a given grammar and give results independent from the implementa­tion.</p><p>Furthermore, adding new modules multiplies the number of parsing algorithm. APOC-II is open to new parsing techniques to such an extent that it can be seen as a library of tools for parsing, including constraint solvers, look-ahead, parsing strategies and control strategies. These tools make prototyping of parsing algorithms eas­ier and quicker.</p><p>The system is based on a general framework that divides parsing matters in three different tasks. First, the compilation that translates a grammar into a push-down automaton describ­ing how a parse-tree is built. The automaton can be non-deterministic if several trees have to be considered when parsing a string. Second, the interpretation of the push-down automaton that has to deal with non-determinism. Third, the constraint solving, used by both compilation and interpretation to perform operations related to constraints.</p><p>Several algorithms can perform each of these three tasks: the compiler can generate either top-down or bottom-up automata, the interpreter can make use of backtracking or of tabulation and the solver has to deal with différent kinds of con­straints (first-order terms, features, .. . ).</p><p>Our architecture allows different combinations of three components (one for each basic task) re­sulting into a specific parsing system. We use the Alcool-90 programming language to implement our modules. This language's type system allows the definition of alternative implementations of a component and ensures the safety of module combination, i.e. each module provides what is needed by other modules and receives what it re­quires.</p><p>The same kind of modularity is used to split the main components (compiler, interpreter, solver) into independent sub-modules. Some of these sub-modules can be shared by several different implementations. For instance the computation of look-ahead is the same for LL(k) and LR(k) techniques.</p><p>The next section defines the class of grammar we consider. Then, a general framework for pars­ing and the sort of modularity it requires are pre­sented. Section 4 is devoted to the Alcool-90 lan­guage that provides a convenient module system. Section 5 is the detailed description of the APOC-<page local="2" global="455"/></p><p>II system that implements the general framework using Alcool-90.</p></section><section number="2" title="Constraint-Based Grammars"><p>The notion of Constraint-Based Grammar ap­peared in computational linguistic. It is a useful abstraction of several classes of grammars, includ­ing the most commonly used to describe Natural Language in view of computer processing.</p><p>We give our own definition of constraint-based grammars that may slightly differ from other def­initions.</p><p>Definition <b>1 </b><b><i>Constraint-</i></b><b><i>13</i></b><b><i>used Grammar</i></b> <b><i>A    constraint-hased   grammar   is   a    7-tuple.</i></b><b><i></i></b></p><doubt alpha="62.5" length="24" tooSmall="False" monospace="0.0">{Nt,T,a,V, Ax,CL,R]where</doubt><p>• A^f <b><i>is a set of symbols called non-terminals</i></b></p><p><b><i>• T is a set of symbols called terminals</i></b></p><p><b><i>• a is a function from </i></b><b><i>Nt</i></b><b><i> </i></b><b>U </b><b><i>T to the. natural integers called the arity of the symbols</i></b></p><p><b><i>• V is an infinite set of variables</i></b></p><p><b><i>• Ax is an element of </i></b><b><i>Nt</i></b><b><i> called the axiom</i></b></p><p><b><i>•</i></b><b><i> </i></b><b><i>CL</i></b><b><i> is a constramt language (see definition be­low) liaving V as variable set and being closed under renaming and conjunction</i></b></p><p><b><i>• R is a finite set of rules of the. form:</i></b></p><p><b><i>a0(Xa)^c,st(Xl),...,sn(Xn).</i></b></p><p><b><i>such that s0 </i></b>G <b><i>Nt,</i></b><b><i> </i></b>.s, eJViU <b><i>T for </i></b>0 &lt; <b><i>i &lt; n, c </i></b>G <b><i>CL, Xi arc tuples of </i></b>«(.s-;) <b><i>distinct, vari­ables, and the same, variable cannot appear in two différent tuples.</i></b></p><p>In this definition, we use the notion of <b><i>con­straint language </i></b>to define the syntax and the se­mantics of the constraints used by the grammars. We refer to the definition given by Hofeld and Smolka in [HS88]. This definition is especially suitable for constraints used in NLP (unrestricted syntax, multiplicity of interpretation domains). The <b><i>closure under renaming </i></b>property has also been defined by Höfeid and Smolka. It ensures that constraints are independent from the vari­able names. This grounds the systematic renam­ing of grammar rules to avoid variable conflicts.</p><p>Definition 2 <b><i>Constraint Language</i></b> <b><i>A constraint Language is a ^-tuple (V,C,v,I) such</i></b></p><doubt alpha="80.0" length="5" tooSmall="False" monospace="0.0">that:</doubt><p><b><i>• C is a decidable. set. whose, elements arc called constraints</i></b></p><p><b><i>» v is function that associates a finite set of variables to each constraint</i></b><b><i>• 1 is a non-empty set </i></b><b><i>of</i></b><b><i> interpretations</i></b></p><p>For hick ofspa.ee we do not recall in detail wha t an interpretation and the "closure under renam­ing" property are, and refer to [IIS88].</p><p>The semantics of Constraint-Based Grammars is defined by the semantics of the constraint lan­guage and the notion of syntax tree. A syntax tree is a tree which has a grammar rule (renamed with fresh variables) as label of each node. A constraint is associated to a parse tree: it is the conjunction of all the constraints of the labels and the equalities between the tuple of variables from the non-terminal of the left-hand side of a label and the tuple of the relevant symbol of the right-hand side of the label of its parent.</p><p>An important point about parse trees is that the order of terminal symbols of the; input string and the order of the symbols in right-hand sides of rules are significant.</p><p>A Context-Free Grammar is obtained just by removing tuples and constraints from the grammar rules. Most parsing techniques for Constraint-Based Grammars use the underlying context-free structure to guide parsing. This al­lows the reuse of context-free parsing techniques.</p><p>The grammars we have just defined encom­pass several classes of grammars used in NLP, including logic grammars (Definite Clause Gram­mars and variants), Unification Grammars, Tree Adjoining Grammars' and, at least partially, Lexical-Functional Grammars and Head Phrase Structure Grammars. Of course, there are syn­tactical differences between these classes and Constraint-Based Grammars. A simple transla­tion from one syntax to the other is necessary.</p><p><b>:s   </b>A   General   Framework <i>vor </i>Parsing</p><p>This section is devoted to a general framework for parsing in which most of the parsing methods, including all the most common ones, are express­ible. It is an extension of a context-free frame­work [La.n74]. It is based on an explicit separation between the <b><i>parsing strategy </i></b>that describes how</p><p><b>'TACs have an underlying context-free structure, al­though this is not obvious in their formal definition. See for instance [LanfJl],</b><page local="3" global="456"/></p><p>syntax trees are built (e.g. top-down, bottom-up), and the <b><i>control strategy </i></b>that deals with the non-determinism of the parsing (e.g. backtrack­ing, tabulation).</p><subsection number="3.1" title="EPDAs"><p>This separation is based on an intermediate repre­sentation that describes how a grammar is used following a given parsing strategy. This inter­mediate representation is a Push-Down Automa­ton. It is known that most context-free parsers can be encoded with such a stack machine. Of course, the usual formalism has to be extended to take constraints into account, and possibly use them to disambiguate the parsing. We call Ex­tended Push-Down Automaton (EPDA) the ex­tended formalism.</p><p>For lack of space, we do not give here the for­mal definition of EPDA. Informally, it is a ma­chine using three data structures: a stack contain­ing at each level a stack symbol and its tuple of variables; a representation of the terminal string that distinguishes those that have already been used and those that are still to be read; finally a constraint. A configuration of an automaton is a triple of these three data. Transitions are partial functions from configurations to configu­rations. We add some restrictions to these tran­sitions: the only change allowed for the string is that at most one more terminal is read; only the top of the stack is accessible and at most one symbol can be added or removed from it at once. These restrictions are needed to employ directly the generic tabular techniques for automata exe­cution described in [DVdlC92]. EPDAs may be non-deterministic, i.e. several transitions are ap­plicable on a given configuration.</p><p>Parsing for Constraint-Based Grammars blends two tasks:</p><p>• The structural part, that consists in building the skeleton of parse trees. This part is similar to a context-free parsing with the underlying context-free projection of the grammar.</p><p>• Solving the constraints of this skeleton.</p><p>The two tasks are related in the following way: constraints appear at the nodes of the tree; the structure is not a valid syntax tree if the con­straint set is unsatisfiable. Each task can be per­formed in several ways: there are several context-free parsing methods (e.g. LL, LR) and con­straints sets can be solved globally or incremen­tally, using various orders, and several ways of mixing the two tasks are valid. Tree construction involves a stack mechanism, and constraint solv­ing results in a constraint. The different parsing techniques can be described as computations on these two data structures. EPDAs are thus able to encode various parsers for Constraint Gram­mars.</p><p>Automatic translation of grammars into EP­DAs is possible using extensions of usual context-free techniques [Bar93].</p></subsection><subsection number="3.2" title="Architecture"><p>Thanks to the intermediate representation (EPDA), parsing can be divided into two inde­pendent passes: the compilation that translates a grammar into an extended automaton; the exe­cution that takes an EPDA and a string and pro­duces a forest of syntax trees. To achieve the in­dependence, the compiler is not allowed to make any assumptions about the way the automata it produces will be executed, and the interpreter in charge of the execution is not allowed to make assumptions about the automata it executes.</p><p>We add to this scheine reused from context-free parsing a third component: the solver (in an extensive meaning) in charge of all the operations related to constraints and variables. We will try to make it as independent from the other two modules (compiler and interpreter) as possible.</p><p>There is not a full independence, since both the compiler and the interpreter involve constraints and related operations, that are performed by the solver. We just want to define a clear inter­face between the solver and the other modules, an interface independent from the kind of the constraints and from the solving algorithms be­ing used. The same compiler (resp. interpreter) used with different solvers will work on different classes of grammars. For instance, the same com­piler can compile Unification Grammars and Def­inite Clause Grammars, using two solvers, one implementing feature; unification, the second one implementing first-order unification.</p><p>We can sec a complete parsing system as the combination of three modules, compiler, inter­preter, solver. When each module has several implementations, we would like to take any com­bination of three modules. This schematic ab­straction captures parsing algorithms we are in­terested in. However, actually defining interfaces for a practical system without restricting open-endedness or the abstraction (interchangeability of components) was the most difficult technical task of this work.</p><page local="4" global="457"/></subsection><subsection number="3.3" title="Solvers"><p>The main problem lies in the definition of the solver's interface. Some of the required opera­tions are obvious: renaming of constraints and tuples, constraint building, extraction of the vari­ables from a constraint, etc.</p><p>By the way, remark that constraint solving can be hidden within the solver, and thus not ap­pear in the interface. There is an equivalence relation between constraints given by their inter­pretations. This relation can be used to replace a constraint by another equivalent one, possibly simpler. The solving can also be explicitly used to enforce the simplification of constraints at some points of the parsing.</p><p>Unfortunately some special techniques require more specific operations on constraints. For in­stance, a family of parsing strategies related to Farley's algorithm make use of the <b><i>restriction </i></b>op­erator defined by Shieber in [Shi85]. Another ex­ample: some tabular techniques take benefit from a projection operator that restricts constraints with respect to a subset of their variables.</p><p>We could define the solver's interface as the cartesian product of all the operations used by at least one technique. There are two reasons to reject such an approach. The first one is that some seldom used operations are difficult to de­fine on some constraints domains. It is the case, among others, of the projection. The second rea­son is that it would restrict to the techniques al­ready existing and known by us at the moment when we design the interface. This contradicts the open-endedness requirement. A new opera­tion can appear, useful for a new parsing method or for optimizing the old ones.</p><p>We prefer a flexible definition of the interface. Instead of defining one single interface, we will al­low each alternative implementation of the solver to define exactly what it offers and each imple­mentation of the compiler or of the interpreter to define what it demands. The combination of modules will involve the checking that the <b><i>offer </i></b>encompasses <b><i>the demand, </i></b>that all the needed op­erations are implemented. This imposes restric­tions on the combination of modules: it is the overhead to obtain an open-ended system, opened to new developments.</p><p>We found a language providing the kind of flex­ible modularity we needed: Alcool-90. We now present this language;.</p></subsection></section><section number="4" title="The language Alcool 90"><p>Alcool-90 is an experimental extension of the functional language ML with run-time overload­ing [RouOO]. Overloading is used as a tool for seamless integration of abstract data types in the ML type system, retaining strong typing, and type inference properties. Abstract data types (encapsulating a data structure represen­tation and its constructors and interpretive func­tions) provide values for overloaded symbols, as classes <b>provide methods </b>for messages in object-oriented terminology. <b>However, </b>strong typing means that the compiler guarantees that errors of kind "method not found" never happen.</p><p>Abstract programs are programs referring to overloaded symbols, which values will be deter­mined at run-time, consistently with the calling environment. By grouping abstract programs, we obtain parameterized abstract data types (or functors), the calling environment being here a particular instantiation of the parameterized adt. Thus, we obtain an environment equivalent to a module system, each module being an adt, even­tually parameterized.</p><p>For instance, in APOC-II, compilers have an abstract data <b>type </b>parameterized by a solver.</p><p>Alcool-90 also proposes an innovative environ­ment where we exploit ambiguities due to over­loading for semi-automated program configura­tion : the type inference computes interfaces of "missing" components to complete a program, ac­cording to the; use of overloaded symbols in the program. A search algorithm finds components satisfying those interfaces, eventually by find­ing suitable parameters for <b>parameterized </b>compo­nents. Naturally, instantiation of parameterized components is also type-safe : actual parameters must have interfaces matching formal parameters (schematically : the actual parameter must pro­vide at least the functions required by the inter­face of the formal parameter).</p><p>For instance, only the solvers providing Shieber's restriction can be <b>used </b>as the actual <b>pa­rameter </b>of Farley with restriction compiler. But these solvers can also be used by all the compilers that do not use the restriction.</p><p>Simple module systems have severe limita­tions when several implementations of compo­nents with similar interfaces coexist in a system, or when some component may be employed in dif­ferent contexts. Ada generics provided a first stop to module parameterization, though at the cost of heavy declarations and difficulties with type equivalence. SML proposes a very powerful mod­ule system with parameterization, but lacks sepa­rate compilation and still requires a large amount of user declarations to define and use functors. Object-oriented languages lack the type security that Alcool-90 guarantees.</p><page local="5" global="458"/><p>The Alcool-90 approach benefits from the sim­plification ot modules as abstract data types by adding inference facilities: the compiler is able to infer the interfaces of parameters required by a module. Moreover, the instantiation of a functor is simply seen as a type application, thus no ef­forts are required from the programmer, while its consistency is checked by the compiler.</p><p>This approach is mostly useful when multiple implementations with similar interfaces are avail­able, whether they will coexist in the program or they will be used to generate several configura­tions. Components may have similar interfaces but different semantics, although they are inter­changeable. Choosing a configuration is simply choosing from a set of solutions to missing com­ponents, computed by the compiler.</p><p>Several other features of Alcool-90 have not been used in this experiment, namely the inheri­tance operator on abstract data types, and an ex­tension of the type system with dynamics (where some type checking occurs at run-time).</p></section><section number="5" title="APOC -II"><p>APOC-II is a system written in Alcool-90, imple­menting numerous parsing techniques within the framework described in section 3. The user can choose between these techniques to build a parser. By adding new modules written in Alcool-90 to the library, new techniques can freely be added to the system.</p><p>APOC-II has two levels of modularity: the first one is that of the three main components distin­guished above, compiler, interpreter and solver. Each of these components is implemented by sev­eral alternative modules, that are cornbinable us­ing Alcool-90 discipline.</p><p>The second level of modularity consist in split­ting each of the three main components into sev­eral modules. This makes the sharing of common parts of different implementations possible.</p><p>We give now examples of splitting APOC-II uses at the moment, in order to give an idea of this second level of modularity. This splitting has proved convenient so far, but it is not fixed and imposed to further developments: a new imple­mentation can be added even if it uses a com­pletely different internal structure.</p><p>A solver is made of:</p><p>• a modide for variables, variable generation and renaming,</p><p>• a parser for constraints,</p><p>• a pretty-printer for constraints,</p><p>• a constraint builder (creation of abstract syn­tax trees for constraints, e.g. building con­straints expressing equality of variables),</p><p>• a solver in the restrictive meaning, in charge of constraint reduction,</p><p>• an interface that encapsulate all the other modules.</p><p>A compiler includes:</p><p>• a grammar parser (that uses the constraint parser given by the solver),</p><p>• a module for look-ahead (for computation of look-ahead sets by static analysis of the gram­mar),</p><p>• a module for EPDA representation and han­dling,</p><p>• a transition generator which translates gram­mar rules into EPDA transitions therefore de­termining the parsing strategy (cf. figure 1),</p><p>• Control code, using previous modules, defin­ing the "compile" function, the only one ex­ported.</p><p>The two interpreters implemented so far have very different structures. The first one uses backtracking and the second one uses tabulation. They share some modules however, such as a module handling transitions and a lexer of input strings.</p><p>The interest of the modular architecture is in the combinatorial effect of module composition. It leads to many different parsing algorithms. The figure 1 summarizes the different aspects of the parsing algorithms that can vary more or less independently.</p><p>For example;, the built-in parsing method of Prolog for DCCJ.s is obtained by combining the; solver for DCGs, the top-down strategy, 0 sym­bol of look-ahead and a backtracking interpreter (and other modules not mentioneel in figure 1 be;-cause they elo not change the algorithm, but at most its implementation).</p><p>Some remarks about figure 1:</p><p>• we e:all <b><i>Earley parsing strategy </i></b>the way Earley deduction [PW83] builds a tree, not the con­trol method it uses. It differs from top-down by the way constraints are taken into account.</p><p>• the difference between Earley-like tabulation and graph-structure stacks is the data struc­ture used for item storage. Several variants are possible, that actually change the parser's behavior.</p><page local="6" global="459"/><p>Figure 1: modules of APOC-II Modules written in bold font are already implemented, whereas modules written in italic are possible extensions to the system.</p><p>• we call synchronization a kind of breadth-first search where scanning a terminal is performed only when it is needed by all the paths of the search-tree. The search is synchronized with the input string, ft is the order used by Ear-ley's algorithm.</p><p>• at the moment, only <b><i>generic </i></b>look-ahead, that is look-ahead based on the <b><i>first </i></b>and <b><i>follow </i></b>sets, has been considered. Some more accu­rate look-ahead techniques such as the ones involved in SLR(k) parsing are probably not independent from the parsing strategy and cannot be an independent module.</p><p>Building a parsing system with APOC-II con­sists roughly in choosing one module of each row of figure 1 and combining them. Some of the combinations are not possible. Thanks to type-checking, Alcool-90 will detect the incompatibil­ity and provide a type-based explanation of the problem.</p><p>At the moment, APOC-II offers more than GO different parsing algorithms. Given a grammar, there is a choice of more than 20 different parsers. Adding one module does not add only one more algorithm, but several new variants.</p><p>The techniques implemented by APOC-II are not original. For instance, the LR compilation strategy comes from a paper by Nilsson, [Nil8G], left-corner parsing has been used by Matsumoto and Tanaka in [MT8.'!]. As far as we know, how­ever, LR and left-corner parsers have; not been proposed for Tree-Adjoining Grammars before.</p><p>Notice that the modularity is also useful to vary implementation of algorithms. For instance, a first prototype can be quickly written by imple­menting constraints reduction in a naive way. A refined version can be written later, if needed.</p></section><section number="6" title="Conclusion"><p>APOC-II has several advantages. First of all, it provides comparable implementations of the most common parsing algorithms. Their efficiency can be abstractly measured, for instance by counting the number of computation step (EPDA transi­tion application) performed to compute a tree or a complete forest of parse trees. We call this kind of measurements abstract because it does not rely neither on the implementation nor on the machine that runs the parser. Other compar­isons could be done statically, on the automaton or on the parse forest (e.g. number of transitions, amount of determinism, size of the forest, amount of structure sharing).</p><p>Otherwise, APOC-II can be used as a toolkit that provides a library of modules useful to imple­ment quickly new parser generators. For instance, one has only to write a solver to obtain up to 22 parsing algorithms (perhaps less if the solver pro­vides only basic operations). The library contains tools to deal with some constraints, look-ahead, lexing, tabulation, etc. Reusing these tools when­ever it is possible saves a lot of work.</p><p>The limitations of APOC-II arc that it is mainly convenient for parsing strategies that are some­how <b><i>static, </i></b>i.e. statically determined at com­pile time. Also, abstraction (full independence between compilers and interpreters) cannot be achieved for some optimized algorithms. For in­stance, Nederhof presents in [Ned93] a parsing strategy called ELR for which tabular execution can be optimized. To implement this algorithm in our system, one would have to write a new interpreter dedicated to ELR- EPDAs.</p><p>We think that our experiment shows the in­terest of a flexible modularity for studies about parsing. We believe that the same technique can fruitfully apply on other domains of Natural Lan­guage Processing.</p><table class="main" frame="box" rules="all" border="1" regular="True"><tr class="row"><td class="cell"></td><td class="cell"></td><td class="cell"></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"><p>Solver (grammar class)</p></td><td class="cell"><p>Context-free Grammars - Definite Clause Grammars Tree Adjoining Grammars - <b><i>Unification Grammars ...</i></b></p></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"><p>parsing strategy (transition generator)</p></td><td class="cell"><p>top-down - pure bottom-up - Earley - Earley with restriction left-corner - LR - <b><i>precedence - PLR ...</i></b></p></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"><p>look-ahead</p></td><td class="cell"><p>context-free look-ahead of 0 or 1 symbol</p><p><b><i>context-free look-ahead of k symbols - context-sensitive look-ahead</i></b></p></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"><p>interpreter</p></td><td class="cell"><p>backtracking - Earley-like tabulation - <b><i>Graph-structured Stacks ...</i></b></p></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"><p>Agenda management (for tabulation only)</p></td><td class="cell"><p>Synchronization - <b><i>lifo - fifo - various weights .. .</i></b></p></td><td class="cell"></td></tr><tr class="row"><td class="cell"></td><td class="cell"></td><td class="cell"></td><td class="cell"></td></tr></table><page local="7" global="460"/></section><section number="7" title="Acknowledgements"><p>The authors are grateful to Gabriel Pereira Lopes for his help.</p></section><references><p>[Dar93] Francois Barthélémy. Outils pour l'a­nalyse syntaxique contextuelle. Thè­se de doctorat, Université d'Orléans, 1993.</p><p>[BVdlC92] F. Barthélémy and F. Villemonte de la Clergerie. Subsumption-oriented push-down automata. In <b><i>Proc. of PLILP'92, </i></b>pages 100-114, june 1992.</p><p>[IIS88] M. Höhfcld and G. Smolka. Definite Relations over Constraint Languages. Technical Report 53, LILOG, IWBS, IBM Deutschland, October 1988.</p><p>[Lan74] Bernard Lang. Deterministic tech­niques for efficient non-deterministic parsers. In <b><i>Proc. of the 2nd Collo­quium on automata, languages and Programming, </i></b>pages 255 -269, Saar­brücken (Germany), 1974. Springer-Verlag (LNCS 14).</p><p>[LanOl] Bernard Lang. The systematic con­struction of earley parsers: Applica­tion to the production of o(n°) earley parsers for tree adjoining grammars. In <b><i>First International Workshop on Tree Adjoining Grammars, </i></b>1991.</p><p>[MT83] Y. Matsumoto and II. Tanaka. Bup: A bottom-up parser embedded in pro­log. <b><i>New Generatvm Computing, </i></b>1:145-158, 1983.</p><p>[Ned93] Mark-.Ian Nederhof. A multidisci-plinary approach to a parsing algo­rithm. In <b><i>Proceedings of tlie Tviente Workshop on Language Technology -TWLT6, </i></b>december 1993.</p><p>[Nil86] Ulf Nilsson. Aid: An alternative im­plementation of DCGs. <b><i>New Genera­tion Computing, </i></b>4:383-399, 1986.</p><p>[PW83] F. C. N. Pereira and D. II. D. War­ren. Parsing as deduction. In <b><i>Proc. of the 21st Annual Meeting of the Asso­ciation for Computationnal Linguis­tic, </i></b>pages 137-144, Cambridge (Mas­sachusetts), 1983.</p><p>[RouOO] François Rouaix. ALCOOL-90: Ty-page de la surcharge dans un langage fonctionnel. Thèse de doctorat, Uni­versité Paris 7, 1990.</p><p>[Shi85] Stuart M. Shieber. Using re­striction to extend parsing algori­thms for complex-feature-based for­malisms. In <b><i>Proceedings of the </i></b>23r,i<b><i>Annual Meeting of tlie Association for Computational Linguistics, </i></b>pages 145-152, Chicago (Illinois), 1985.</p></references></body></article>