2009-07-10 9 views
1

je me suis dit quand j'ai commencé à débordement de pile, il était temps de venir ici pour demander;)Je continue de recevoir la pile déborde lorsque vous essayez d'utiliser Spirit pour analyser des choses

Je suis en train d'apprendre à utiliser le droit de Spirit Boost à présent. J'ai compris les choses de base. Puisque j'avais K & R pratique (qui contient la grammaire de C) j'ai décidé de voir si je pouvais faire un accepteur pour la langue. C'était plus ou moins mon objectif original, puisque je veux finalement l'utiliser comme préprocesseur pour collecter des informations à partir de structures de données et d'autres choses.

Je suis capable d'analyser les constantes et les chaînes, mais lorsque j'essaie d'analyser cela, 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 c'est parce que i est un primary_expression valide et donc il ne va pas pour vérifier le ++ ou --. J'ai essayé de le mettre en bas, et ensuite j'ai des débordements de pile. Je reçois ici une récursion gauche infinie mais je ne sais pas comment la résoudre.

Répondre

2

Vous devrez vous débarrasser de la récursion gauche. Cet article de Wikipedia explique certaines techniques:

http://en.wikipedia.org/wiki/Left_recursion

Cependant, il peut ne pas être possible. C a une syntaxe assez flexible et peut ne pas fournir suffisamment de contexte pour permettre à un analyseur de descente récursif de fonctionner à moins que Boost Spirit ne permette de revenir en arrière. Ou vous serez capable de le faire mais les associations seront à reculons.

Il est peut-être préférable d'utiliser un outil à base de LALR tel que le bison.

Questions connexes