Commit 59cbe66a authored by POTTIER Francois's avatar POTTIER Francois
Browse files

Merge branch 'master' into coverage

Conflicts:
	TODO
	src/settings.ml
	src/settings.mli
parents 46a2fb64 185d8b0c
2015/09/21:
Re-established some error messages concerning the mis-use of $i which
had disappeared on 2015/06/29.
2015/09/11:
Fixed the mysterious message that would appear when a nonterminal symbol
begins with an uppercase letter and --infer is turned on. Clarified the
documentation to indicate that a (non-start) nonterminal symbol can begin
with an uppercase letter, but this is not recommended.
2015/08/27:
New option --inspection (added last January, documented only now). This
generates an inspection API which allows inspecting the automaton's stack,
among other things. This API can in principle be used to write custom code
for error reporting, error recovery, etc. It is not yet mature and may
change in the future.
2015/07/20:
Added the command line options --unused-token <symbol> and --unused-tokens.
2015/06/29:
Changed the treatment of the positional keywords $i. They are now
rewritten into variables of the form '_i' where 'i' is an integer.
......
......@@ -6,7 +6,7 @@
SHELL := bash
.PHONY: all test clean package check export godi
.PHONY: all test clean package check export godi opam
# -------------------------------------------------------------------------
......@@ -96,10 +96,12 @@ LIBFILES := \
package: clean
# Create a directory to store the distributed files temporarily.
# In src/_tags, every line tagged "my_warnings" is removed.
@ rm -fr $(PACKAGE)
@ mkdir -p $(PACKAGE)/src
@ cp -fr $(DISTRIBUTED_FILES) $(PACKAGE)
@ cp -fr src/*.ml{,i,y,l,pack} src/Makefile src/_tags src/META $(PACKAGE)/src
@ cp -fr src/*.ml{,i,y,l,pack} src/Makefile src/META $(PACKAGE)/src
@ grep -v my_warnings src/_tags > $(PACKAGE)/src/_tags
@ $(MAKE) -C $(PACKAGE)/demos clean
# Insert headers.
@ echo "-> Inserting headers."
......@@ -154,7 +156,7 @@ check:
RSYNC := scp -p -C
TARGET := yquem.inria.fr:public_html/menhir/
PAGE := /home/fpottier/dev/page
API := convert.mli.html IncrementalEngine.ml.html
API := convert.mli.html IncrementalEngine.ml.html general.mli.html
export:
# Copier l'archive et la doc vers yquem.
......@@ -217,3 +219,38 @@ godi:
(*) \
open $(GODIURL) ;; \
esac
# -------------------------------------------------------------------------
# Updating the opam package.
# This entry assumes that "make package" and "make export" have been
# run on the same day.
OPAM := $(HOME)/dev/opam-repository
CSUM = $(shell md5sum menhir-$(DATE).tar.gz | cut -d ' ' -f 1)
opam:
# Update my local copy of the opam repository.
@ echo "Updating local opam repository..."
@ cd $(OPAM) && \
git fetch upstream && \
git merge upstream/master
# Create a new Menhir package, based on the last one.
@ echo "Creating a new package description menhir-$(DATE)..."
@ cd $(OPAM)/packages/menhir && \
cp -r `ls | grep menhir | tail -1` menhir.$(DATE)
# Update the file "url".
@ cd $(OPAM)/packages/menhir/menhir.$(DATE) && \
rm url && \
echo 'archive: "http://gallium.inria.fr/~fpottier/menhir/menhir-$(DATE).tar.gz"' >> url && \
echo 'checksum: "$(CSUM)"' >> url
# Prepare a commit.
@ echo "Preparing a new commit..."
@ cd $(OPAM)/packages/menhir && \
git add menhir.$(DATE) && \
git status
# Ask for review.
@ echo "If happy, please run:"
@ echo " cd $(OPAM)/packages/menhir && git commit -a && git push && firefox https://github.com/"
@ echo "and issue a pull request."
......@@ -5,27 +5,57 @@
correlate with star size and alphabet size, etc. draw a graph
graph unreachable states, too
* Dans les avantages de Menhir versus ocamlyacc (dans la doc et
sur la page Web), ajouter le back-end Coq, l'API incrémentale
et l'API d'inspection, les règles anonymes...
* bench/bad/rule-error.mly should produce a syntax error earlier?
* BUG dans ErrorReporting si l'erreur se produit dans l'état
initial. Pénible que l'API d'inspection ne donne pas accès
à l'état courant lorsque la pile est vide (état initial donc).
Pourrait-on exposer cet état? Polymorphe? incoming_symbol
devrait alors produit une option. Et le cas Nil du type
stream devrait contenir l'état initial...
attention, car si on lui applique la fonction items, on va
obtenir un item spécial S' -> S # qui va poser problème.
Exposer l'état initial avec un type différent lr1initial?
De toute façon il faudra compliquer la notion de explanation
qui ne pourra plus toujours être basée sur un item...
* Gabriel veut pouvoir inclure MenhirLib dans le parser engendré
* gros BUG à corriger: il ne faut pas exiger le prochain token
AVANT une réduction par défaut. Il faut suivre ocamlyacc et
bison. Réfléchir... et corriger les deux back-ends. Attention
toutefois, c'est un changement incompatible. Option de ligne
de commande?
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
réduction sur #? on pourrait faire aussi le choix opposé,
à savoir éliminer toutes les autres actions. Que fait
ocamlyacc?
* 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
et auto-générer une fonction (ou une table) print_terminal
* BUG: --infer does not work when a non-terminal begins
with a lowercase letter (Maxime Dénès).
* autoriser %token FOO (unused)
(syntaxe concrète à déterminer)
équivalent à --unused-token FOO sur la ligne de commande.
* bench/Makefile no longer works on my Mac? (egrep problem)
* Produce well-chosen (predictable) names for anonymous rules?
* Document anonymous rules.
Produce well-chosen (predictable) names for anonymous rules.
In the standard library, possibly rename "anonymous" and "embedded"
and document them. The non-inline version allows embedding an action in the
* In the standard library, possibly rename "anonymous" and "embedded" and
document them. The non-inline version allows embedding an action in the
middle of a rule.
* Should we always avoid querying the lexer before a default reduction?
Would that be difficult/possible? Would that help people who want to
trigger changes in the lexer?
* Produce well-chosen (predictable) names for anonymous rules?
* ErrorReporting: experiment with merging several symbols
so as to reduce the noise (e.g. operators, expressions,
etc.). Or just print the same way, but don't quotient
......@@ -51,9 +81,6 @@
Using modular implicits, generate terminal2token and
nonterminal2value.
* IncrementalEngine: document [lr1state], [element], [view].
Document the Inspection interface.
* document that --depend may produce inaccurate dependencies
for parser.cmi and that it is recommended to use --raw-depend
--ocamldep "ocamldep -modules" and work from there (which is
......@@ -63,40 +90,70 @@
between 4.01.0 and 4.02.1. Use the tag last309 for this purpose,
or the master branch.
* Suite des patchs de Frédéric Bour.
API d'inspection complète.
Exposer le nombre d'états (pour la mémoisation) et une conversion état -> entier.
* Suite des patchs de Frédéric Bour.
API d'inspection complète.
Exposer le nombre d'états (pour la mémoisation) et une conversion état -> entier.
Idem pour les productions.
Fonctions d'affichage pour les types terminal, nonterminal, etc.?
Fonctions d'isomorphisme entre token et 'a terminal * 'a?
Librairie(s) pour la gestion des erreurs.
Librairie pour la complétion du parsing.
Librairie pour la complétion du parsing.
Need a way of feeding the parser a nonterminal symbol.
Or a way of applying a semantic action to a vector of semantic values.
Peut-on faire un noyau de Merlin indépendant de la grammaire?
* Meilleurs messages d'erreur de syntaxe.
Revenir en arrière après une erreur, car l'erreur
n'est détectée qu'après quelques réductions. Une fois que l'on est
revenu, on peut examiner les items de l'état courant et donner des
positions de début d'item qui devraient être intéressantes.
Possibilité de coloriser ce qu'on a lu en indiquant ce qu'on a compris
Revenir en arrière après une erreur, car l'erreur
n'est détectée qu'après quelques réductions. Une fois que l'on est
revenu, on peut examiner les items de l'état courant et donner des
positions de début d'item qui devraient être intéressantes.
Possibilité de coloriser ce qu'on a lu en indiquant ce qu'on a compris
(sortie HTML).
* Test and document --lalr (maybe).
* Test and document --lalr (maybe). Explain that it is (probably)
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).
* Tenter une minimisation a posteriori de l'automate. Sur la grammaire
OCaml on devrait retrouver l'automate LALR, non?
Faire cette minimisation *après* la résolution des conflits afin que
la minimisation n'affecte pas le comportement de l'automate, même en
présence de directives de priorité. Du coup si on combine --canonical
Faire cette minimisation *après* la résolution des conflits afin que
la minimisation n'affecte pas le comportement de l'automate, même en
présence de directives de priorité. Du coup si on combine --canonical
et --minimize alors on devrait obtenir un automate correct, proche de
IELR, voir Denny et Malloy. Confirmer.
* Pourquoi --canonical --table ne marche pas sur une grosse grammaire?
(3m57 pour ocaml.mly versus 16s sans --table)
Afficher combien de temps est passé à comprimer les tables.
Afficher combien de temps est passé à comprimer les tables.
* TableBackend en principe ne devrait pas avoir besoin de Invariant?
Gain de temps/simplicité possible.
Gain de temps/simplicité possible.
* Could we avoid listing the contents of MenhirLib in 4 different files?
......@@ -107,70 +164,38 @@
ou rien; tester en particulier sous Windows?
Modifier la doc pour recommander ocamlfind.
* ajouter une possibilité de désactiver certains warnings (utile pour
le cours de compilation où on démarre avec une grammaire à trous),
* ajouter une possibilité de désactiver certains warnings (utile pour
le cours de compilation où on démarre avec une grammaire à trous),
par exemple les non-terminaux inaccessibles
* add a way of turning off the "unused token" warning for a specific token
(or for all of them) This is legitimate because the lexer might be designed
to produce certain tokens that the parser does not use at all.
* move to a new license (GPL V2?), as per Hongbo Zhang's request.
* Les fichiers dans demos/ ne devraient pas être sous QPL mais libres...
* Les fichiers dans demos/ ne devraient pas être sous QPL mais libres...
* _stage2/menhir.native --interpret fancy-parser.mly
crashes with Stack_overflow when the input is just "grammar:\n"
... it seems to loop now ...
* BUG: la directive $type<...> nt donne lieu à un message d'erreur bizarre
* BUG: la directive $type<...> nt donne lieu à un message d'erreur bizarre
si le non-terminal nt n'existe pas. (Jacques-Henri.)
* On pourrait rendre moins restrictif le critère qui garantit la terminaison
de l'expansion des non-terminaux paramétrés. Il suffirait de vérifier que
les paramètres effectifs sont toujours des atomes (symboles terminaux ou
* On pourrait rendre moins restrictif le critère qui garantit la terminaison
de l'expansion des non-terminaux paramétrés. Il suffirait de vérifier que
les paramètres effectifs sont toujours des atomes (symboles terminaux ou
non-terminaux), non? (Jacques-Henri.)
* 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).
* 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).
`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 la règle à inliner utilise des $i?
* %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?)
* %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?)
* Reconnaître les directives # n "foo" dans le fichier .mly et en tenir
* Reconnaître les directives # n "foo" dans le fichier .mly et en tenir
compte dans les locations.
* BUG: message de Valentin Gatien-Baron du 09/01/2010: le bug de --explain
......@@ -178,41 +203,47 @@
passer sous silence les conflits qui ont lieu dans une partie inaccessible
de l'automate?
* BUG: message de Valentin Gatien-Baron du 09/01/2010: le warning erroné à
propos d'un %prec inutile peut-il être évité?
* BUG: message de Valentin Gatien-Baron du 09/01/2010: le warning erroné à
propos d'un %prec inutile peut-il être évité?
* Implémenter un test de détection de boucles. Si la grammaire contient une
boucle, elle est infiniment ambiguë. Pour le test, calculer tous les
nullables, ajouter une production unité A -> B dès qu'il existe une
* Implémenter un test de détection de boucles. Si la grammaire contient une
boucle, elle est infiniment ambiguë. Pour le test, calculer tous les
nullables, ajouter une production unité A -> B dès qu'il existe une
production A -> alpha B beta avec alpha et beta nullables, et regarder
ensuite s'il existe un cycle de productions unité.
ensuite s'il existe un cycle de productions unité.
* Permettre une trace avec autre chose que fprintf stderr. Cela permettrait
au programmeur (par exemple) de décider à runtime s'il veut afficher ou
non la trace.
au programmeur (par exemple) de décider à runtime s'il veut afficher ou
non la trace. (En mode --trace.) Et si possible, donner accès depuis
l'extérieur à la fonction print_token qui est engendrée.
* (petit) BUG: --follow-construction n'affiche pas le contenu des états
* (petit) BUG: --follow-construction n'affiche pas le contenu des états
initiaux (r0)
* relire la preuve de Pager et comprendre si ce que fait Lr1.grow est correct
ou pas; faut-il faire grossir les états existants, ou bien (par exemple) les
ou pas; faut-il faire grossir les états existants, ou bien (par exemple) les
supprimer et recommencer leur construction?
* que fait/que doit faire la combinaison --tokens-only --depend?
* Préserver dirname/ dans les directives #line émises.
* Préserver dirname/ dans les directives #line émises.
* BUG: Boris (1.- bouclage parser sur une entrée erronée 2.- une lecture
trop loin dans le stream, également liée à error).
* BUG: Boris (1.- bouclage parser sur une entrée erronée 2.- une lecture
trop loin dans le stream, également liée à error).
* éviter "Warning: 22 conflicts ..." car emacs prend "Warning" pour un
nom de fichier; d'après Damien, il devrait suffire que la phrase après
* éviter "Warning: 22 conflicts ..." car emacs prend "Warning" pour un
nom de fichier; d'après Damien, il devrait suffire que la phrase après
les deux points ne commence pas par un nombre.
* ajouter une option -q pour désactiver tous les warnings
* ajouter une option -q pour désactiver tous les warnings
* si une variable est inutilisée dans une action sémantique, le
warning est affiché dans le code produit.
* si une variable est inutilisée dans une action sémantique, le
warning est affiché dans le code produit.
* si une parenthèse est mal fermée dans une action sémantique,
l'erreur de syntaxe peut être détectée par OCaml en dehors
des actions sémantiques. Bétonner en mettant une séquence
improbable de begin/end/parenthèseses autour de l'action?
* BUG: solving a shift/reduce conflict in favor of reduction can
cut a path that was required in order to explain another conflict.
......@@ -228,37 +259,37 @@
* dans le dump de l'automate, rajouter les transitions qui ont
ete supprimees par resolution de conflits. Afficher aussi les
réductions par défaut?
réductions par défaut?
* expliquer aussi les conflits end-of-stream
* Documenter l'emploi d'ocamlbuild.
* Lorsqu'on crée un pseudo-lexème pour utiliser dans les
* Lorsqu'on crée un pseudo-lexème pour utiliser dans les
directives %prec, la question de savoir s'il est associatif
à gauche ou à droite ou pas du tout ne se posera jamais. Donc,
à gauche ou à droite ou pas du tout ne se posera jamais. Donc,
pour faire propre, on ne devrait pas autoriser l'emploi de
%left, %right, %nonassoc (sauf pour compatibilité arrière,
avec warning) mais introduire un nouveau mot-clé %fictitious
%left, %right, %nonassoc (sauf pour compatibilité arrière,
avec warning) mais introduire un nouveau mot-clé %fictitious
ou %pseudo ou whatever.
* Autre remarque du même tonneau, si on souhaite choisir un
niveau mais pas un statut d'associativité (parce qu'on pense
qu'il est inutile), il faudrait pouvoir déclarer %neutral
(whatever) et obtenir un niveau au statut non-spécifié (d'où
* Autre remarque du même tonneau, si on souhaite choisir un
niveau mais pas un statut d'associativité (parce qu'on pense
qu'il est inutile), il faudrait pouvoir déclarer %neutral
(whatever) et obtenir un niveau au statut non-spécifié (d'où
erreur si on tente de consulter ce statut).
* Prévoir une sortie --ocamlyacc qui affiche la grammaire sans
les liaisons des valeurs sémantiques et sans les actions
sémantiques?
* Prévoir une sortie --ocamlyacc qui affiche la grammaire sans
les liaisons des valeurs sémantiques et sans les actions
sémantiques?
* Faire le nécessaire pour empêcher les warnings d'ocaml 3.09
sur les valeurs sémantiques nommées et non utilisées? Le
problème est que l'erreur est forcément rapportée dans le
fichier .ml engendré. Et ça résoudrait le problème du cas
où on n'utilise que $startpos(v) et pas v.
* Faire le nécessaire pour empêcher les warnings d'ocaml 3.09
sur les valeurs sémantiques nommées et non utilisées? Le
problème est que l'erreur est forcément rapportée dans le
fichier .ml engendré. Et ça résoudrait le problème du cas
où on n'utilise que $startpos(v) et pas v.
* Il faudrait activer le warning qui recommande d'utiliser --infer
dès que la librairie standard est utilisée (et pas seulement lorsque
%inline est utilisé).
dès que la librairie standard est utilisée (et pas seulement lorsque
%inline est utilisé).
......@@ -11,7 +11,7 @@ MENHIR=$(SRC)/_stage2/menhir.native --stdlib $(SRC)
# La convention de nommage des tests multi-grammaires
# est : /nom/-[1-9].mly
TESTS=$(shell ls *.mly | egrep '*([1]|[^2-9]).mly')
TESTS=$(shell ls *.mly | egrep '.*([1]|[^2-9]).mly')
RESULTS=$(TESTS:.mly=.result)
test: clean $(RESULTS)
......@@ -21,6 +21,7 @@ test: clean $(RESULTS)
fi
%.result: %.mly
# Check if there is a group of several .mly files, or just one .mly file.
@ if echo $< | grep -e "-1.mly" &> /dev/null; then \
export BASE=`echo $< | sed s/"-1.mly"/""/`; \
export FILES=`echo $$BASE-[1-9].mly`; \
......@@ -33,7 +34,7 @@ test: clean $(RESULTS)
echo "-> [KO] menhir should not accept $$FILES"; \
export FAILED_FILES="$$FAILED_FILES $$FILES"; \
else \
$(SHELL) -c '$(MENHIR) --only-preprocess $$CMD >& $@'; \
$(SHELL) -c '$(MENHIR) $$CMD >& $@'; \
if [ x$$CREATE_EXPECTED == x"1" ]; then \
cp $@ $*.expected; \
fi; \
......
%start a
%type <unit> a
%%
a:
| b
{ () }
b:
| a
{ () }
%%
File "epsilon-cycle.mly", line 8, characters 2-4:
File "epsilon-cycle.mly", line 11, characters 2-4:
Error: the grammar is ambiguous.
The following items participate in an epsilon-cycle:
a -> . b
b -> . a
%start a
%type <unit> a
%token B
%%
a:
b { () }
b | B { () }
b:
a { () }
......
File "inline-shift.mly", line 5, characters 3-11:
Error: You cannot use b and the $i syntax in this branch since the definition of b has to be inlined.
File "inlined-dollar.mly", line 9, characters 8-9:
Error: You cannot use $i syntax in this branch since its definition will be inlined.
%start s
%type <unit> s
%%
s:
| s
{}
%%
Error: no tokens have been declared.
File "option.mly", line 6, characters 0-6:
File "../../src/standard.mly", line 13, characters 8-14:
File "../../src/standard.mly", line 85, characters 8-14:
Error: symbol option is defined with arities 0 and 1.
File "positional-identifier-clash.mly", line 4, characters 6-8:
Error: there are multiple producers named _1 in this sequence.
%start<unit> s
%token<unit> A
%%
s : A _1=A {}
......@@ -21,7 +21,7 @@ list___anonymous_1_:
{let x =
let y = y0 in
let x = x0 in
( ( x + y ))
( x + y )
in
( x :: xs )}
......@@ -31,19 +31,19 @@ list___anonymous_0_:
| x0 = A xs = list___anonymous_0_
{let x =
let x = x0 in
( ( x ))
( x )
in
( x :: xs )}
| x0 = B xs = list___anonymous_0_
{let x =
let x = x0 in
( ( x ))
( x )
in
( x :: xs )}
| x0 = C xs = list___anonymous_0_
{let x =
let x = x0 in
( ( x ))
( x )
in
( x :: xs )}
......
......@@ -20,7 +20,7 @@ clauses:
| xs0 = loption_separated_nonempty_list_DOT_clause__ _2 = EOF
{let clauses =
let xs = xs0 in
( ( xs ))
( xs )
in
( clauses )}
......@@ -41,9 +41,9 @@ params:
let _1 = _10 in
let x =
let xs = xs0 in
( ( xs ))
( xs )
in
( ( x ))
( x )
in
( terms )}
......@@ -81,7 +81,7 @@ clause:
| tm = term _2 = INFERS xs0 = loption_separated_nonempty_list_COMMA_term__
{let ts =
let xs = xs0 in
( ( xs ))
( xs )
in
( (tm, ts) )}
| fact = term
......
......@@ -29,9 +29,9 @@ expr:
let _10 = _100 in
let x =
let _1 = _10 in
( ( (+) ))
( (+) )
in
( ( x ))
( x )
in
( op e1 e2 )}
| e1 = expr _100 = MINUS e2 = expr
......@@ -39,9 +39,9 @@ in
let _10 = _100 in
let x =
let _1 = _10 in
( ( (-) ))
( (-) )
in