Commit 792d879b authored by POTTIER Francois's avatar POTTIER Francois
Browse files

Merge branch 'positions'

parents 2c57d93f 6ac2f8f0
2015/11/04:
Modified the treatment of %inline so that the positions that are computed are
the same, regardless of whether %inline is used. This property did not hold
until now. It now does. Of course, this means that the positions computed by
the new Menhir are not the same as those computed by older versions of Menhir.
2015/11/04:
Fixed a bug in the treatment of %inline that would lead to an incorrect
position being computed when the caller and callee had a variable by the
same name.
2015/11/04:
Modified Menhir so as to compute the start and end positions in the exact same
way as ocamlyacc. (There used to be a difference in the treatment of epsilon
productions.) Of course, this means that the positions computed by the new
Menhir are not the same as those computed by older versions of Menhir. Added
the keyword $symbolstartpos so as to simulate Parsing.symbol_start_pos()
in the ocamlyacc world. The keyword $startpos sometimes produces a position
that is too far off to the left; $symbolstartpos produces a more accurate
position.
2015/11/04:
Incompatible change of the incremental API: instead of a unit argument, the
entry points (which are named after the start symbols) now require an initial
position, which typically should be [lexbuf.lex_curr_p].
2015/11/03:
Fix-fix-and-re-fix the Makefile in an attempt to allow installation under
opam/Windows. Thanks to Daniel Weil for patient explanations and testing.
......
* Look for "artificial dependency" and remove them.
Make sure every module is explicitly called.
* For Gabriel. 1- Change opam rules to explicitly use Makefile, even if
GNUmakefile present. Beware of recursive calls to make. 2- Make sure
Makefile works even in the repo; archive must be a subset of repo. 3- Place
"opam" in the Menhir repo and copy it to opam repo when exporting.
* Develop an alternate src/Makefile that does not require ocamlbuild?
Could use OCamlMakefile instead, for instance.
......@@ -42,9 +50,9 @@
bison. Réfléchir... et corriger les deux back-ends. Attention
toutefois, c'est un changement incompatible. Option de ligne
de commande?
(voir aussi messages de Tiphaine Turpin à partir du 30/08/2011)
Idée de F. Bour: on pourrait annoter une production %default
pour indiquer qu'elle doit toujours être réduite par défaut.
Réfléchir à l'impact sur les positions.
Il faut aussi revisiter la notion de conflit end-of-stream.
- si réduction par défaut, alors pas de conflit possible!
- si conflit, alors pourquoi on le résoud en éliminant la
......@@ -52,13 +60,6 @@
à savoir éliminer toutes les autres actions. Que fait
ocamlyacc?
* Améliorer la compatibilité avec ocamlyacc sur les positions.
Deux aspects indépendants:
- le calcul de $endpos pour une production epsilon doit se
faire en consultant la pile, et non pas le prochain token;
- on peut offrir un $symbolstartpos(i) qui calcule de la même
manière que Parsing.symbol_start_pos.
* autoriser %token FOO "foo"
pour pouvoir afficher les tokens sous forme plus lisible
et auto-générer une fonction (ou une table) print_terminal
......@@ -104,32 +105,8 @@
incompatible in principle with --explain. Modify the code to fail
gracefully when the problem arises.
* les positions fournies par menhir ne sont pas les mêmes fournies par
ocamlyacc (voir messages de Tiphaine Turpin à partir du 30/08/2011).
Est-ce un problème? Peut-on documenter quelles sont les
positions fournies par Menhir? En particulier, pour une production
vide, Menhir utilise _menhir_env.lexer.lex_start_p, c'est-à-dire le
début du dernier token lu par le lexer; en principe c'est le token
de lookahead donc ça va, mais ça pourrait donner un résultat bizarre
si on réduit par défaut une production vide (on a alors pour position
le début du token précédent?) (BUG?). Par ailleurs, il faut être
conscient que si l'action ocamllex se rappelle récursivement, alors
_menhir_env.lexer.lex_start_p n'est pas le début du token mais une
position quelque part à l'intérieur du token (e.g. après des espaces
blancs). SUGGESTION DE SOLUTION: au lieu de paires (startpos, endpos),
utiliser un type abstrait d'intervalles, avec un traitement particulier
de l'intervalle vide. (Voir mon message du 15/09/2011.)
* Tirer au clair la sémantique des $startpos/$endpos sur les productions vides.
Jacques-Henri dit que $startpos devrait toujours être $endpos du symbole précédent plus les blancs,
et symétriquement pour $endpos. Mais pour implémenter ça il faut consulter la pile?
BUG: %inline ne préserve pas la sémantique de $startpos/$endpos.
C'est vrai pour les productions epsilon (forcément)
mais aussi pour des productions non-epsilon
car $startpos de la production inlinée est changée en $endpos(x) où x est le symbole précédent!
Si on gérait les positions par macro-expansion *avant* de faire l'inlining
alors la passe d'inlining n'aurait pas besoin de s'en occuper (et serait
correcte par construction).
* BUG: --only-preprocess imprime des actions sémantiques où les $ ont
été remplacés par _, ce qui rend la grammaire invalide.
* Tenter une minimisation a posteriori de l'automate. Sur la grammaire
OCaml on devrait retrouver l'automate LALR, non?
......@@ -168,14 +145,6 @@
les paramètres effectifs sont toujours des atomes (symboles terminaux ou
non-terminaux), non? (Jacques-Henri.)
* En mode code on tire les tokens d'un lexbuf et l'utilisateur doit construire
l'API moderne par `wrapping', s'il la souhaite. Mais en mode table l'API
moderne est native et l'API traditionnelle est construite (par nous) par
`wrapping', d'où risque de `double wrapping' pour un utilisateur qui veut
alterner entre code et table. On devrait exposer nous-mêmes les deux API.
En profiter pour laisser l'utilisateur contrôler comment un token doit
être emballé en `fat token' (token + range).
* %inline pourrait-il fonctionner quand les productions à inliner ont un %prec?
(ça aurait un sens au moins quand on inline dans une production unité?)
(ou plus généralement quand on inline en dernière position?)
......
File "constant-arity-in-multiple-def-2.mly", line 2, characters 8-9:
File "constant-arity-in-multiple-def-1.mly", line 6, characters 8-9:
Error: symbol b is defined with arities 2 and 1.
Error: the symbol b is defined with arities 2 and 1.
File "cyclic-parameterized-definition.mly", line 5, characters 6-7:
Error: How is this symbol parameterized?
Error: how is this symbol parameterized?
It is used at sorts a and (a -> *) -> *.
The sort a cannot be unified with the sort (a -> *) -> *.
File "declaration-error-a.mly", line 1, characters 15-20:
Error: Ill-formed %token declaration.
Error: syntax error.
Ill-formed %token declaration.
Examples of well-formed declarations:
%token FOO
%token DOT SEMICOLON
......
File "double-equals.mly", line 6, characters 5-6:
Error: Ill-formed production.
Error: syntax error.
Ill-formed production.
A production is a sequence of producers, followed with a semantic action.
Examples of well-formed producers:
expr
......
File "epsilon-cycle.mly", line 8, characters 2-4:
File "epsilon-cycle.mly", line 11, characters 2-4:
File "epsilon-cycle.mly", line 8, characters 2-3:
File "epsilon-cycle.mly", line 11, characters 2-3:
Error: the grammar is ambiguous.
The following items participate in an epsilon-cycle:
a -> . b
......
File "invalid-declarations-a.mly", line 3, characters 11-14:
Error: Ill-formed %token declaration.
Error: syntax error.
Ill-formed %token declaration.
Examples of well-formed declarations:
%token FOO
%token DOT SEMICOLON
......
File "invalid-declarations-b.mly", line 5, characters 7-10:
Error: Ill-formed %start declaration.
Error: syntax error.
Ill-formed %start declaration.
A start symbol must begin with a lowercase letter.
Examples of well-formed declarations:
%start program
......
File "invalid-declarations-c.mly", line 6, characters 6-7:
Error: Ill-formed %type declaration.
Error: syntax error.
Ill-formed declaration.
Examples of well-formed declarations:
%type <Syntax.expression> expression
%type <int> date time
%type <int option> option(date)
%on_error_reduce expression
%on_error_reduce date time
%on_error_reduce option(date)
File "invalid-declarations-d.mly", line 10, characters 0-9:
Error: Ill-formed precedence declaration.
Error: syntax error.
Ill-formed precedence declaration.
Examples of well-formed declarations:
%left PLUS
%left PLUS MINUS
......
File "invalid-declarations-e.mly", line 17, characters 0-0:
Error: Ill-formed production.
Error: syntax error.
Ill-formed production.
A production is a sequence of producers, followed with a semantic action.
Examples of well-formed producers:
expr
......
File "keyword-in-header.mly", line 3, characters 10-12:
Error: A Menhir keyword cannot be used in an OCaml header.
Error: a Menhir keyword cannot be used in an OCaml header.
File "lots-of-errors-a.mly", line 1, characters 0-1:
Error: Either a declaration or %% is expected at this point.
Error: syntax error.
Either a declaration or %% is expected at this point.
File "lots-of-errors-b.mly", line 1, characters 15-20:
Error: Ill-formed %token declaration.
Error: syntax error.
Ill-formed %token declaration.
Examples of well-formed declarations:
%token FOO
%token DOT SEMICOLON
......
File "lots-of-errors-c.mly", line 2, characters 7-8:
Error: Ill-formed %token declaration.
Error: syntax error.
Ill-formed %token declaration.
Examples of well-formed declarations:
%token FOO
%token DOT SEMICOLON
......
File "lowercase-token.mly", line 1, characters 7-10:
Error: Ill-formed %token declaration.
Error: syntax error.
Ill-formed %token declaration.
Examples of well-formed declarations:
%token FOO
%token DOT SEMICOLON
......
File "multiple-type-definition-modules-2.mly", line 1, characters 12-13:
Error: There are multiple %type definitions for nonterminal a.
Error: there are multiple %type declarations for nonterminal a.
File "multiple-type-definition.mly", line 2, characters 12-13:
Error: There are multiple %type definitions for nonterminal a.
Error: there are multiple %type declarations for nonterminal a.
File "non-terminals-tokens-overlap-2.mly", line 3, characters 0-1:
File "non-terminals-tokens-overlap-1.mly", line 1, characters 7-8:
Error: The identifier B is a reference to a token.
Error: the identifier B is a reference to a token.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment