Je continue à obtenir la pile déborde lorsque vous essayez d'utiliser Spirit pour analyser des choses

StackOverflow https://stackoverflow.com/questions/1107654

  •  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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top