Je continue à obtenir la pile déborde lorsque vous essayez d'utiliser Spirit pour analyser des choses
-
12-09-2019 - |
Question
Je me suis quand j'ai commencé à débordement de la pile, il était temps de venir ici pour demander;)
Je suis en train d'apprendre à utiliser Spirit Boost en ce moment. J'ai compris les trucs de base. Depuis que j'avais K & R à portée de main (qui contient la grammaire de C) j'ai décidé de voir si je pouvais faire un accepteur pour la langue. Cela a été plus ou moins mon objectif initial de toute façon, puisque je veux éventuellement l'utiliser comme un préprocesseur pour recueillir des informations à partir de structures de données et d'autres choses.
Je suis capable d'analyser des constantes et des chaînes, mais lorsque je tente d'analyser ce que je commence à avoir des problèmes.
postfix_expression =
primary_expression
// omitting some other rules for simplicity's sake
| (postfix_expression >> chseq+p("++"))
| (postfix_expression >> chseq_p("--"));
primary_expression =
identifier
| constant
| string_literal;
// The parsers for constants and strings are
// pretty trivial so I'm not going to C+P them here.
Quand je passe quelque chose comme i++
il échoue. Je suppose que cela est dû au fait i
est valide primary_expression
et il ne va pas donc à vérifier la ++
ou --
. J'ai essayé de le mettre au fond, puis je me empile trop-pleins. Je reçois une récursion infinie gauche ici, mais je ne sais pas comment le résoudre.
La solution
Vous devez vous débarrasser de la récursion gauche. Cet article de Wikipedia explique certaines techniques:
http://en.wikipedia.org/wiki/Left_recursion
Toutefois, il ne peut pas être possible. C a une syntaxe assez souple et ne peut pas fournir un contexte suffisant pour permettre à un analyseur de descente récursive de fonctionner à moins que Spirit Boost permet retours en arrière. Ou vous serez en mesure de le faire, mais les associations seront en arrière.
Vous pouvez être mieux à l'aide d'un outil de LALR comme le bison.