当我尝试使用Spirit来解析东西时,我不断得到堆栈溢出

时间:2009-07-10 04:12:05

标签: stack-overflow boost-spirit

我想当我开始得到堆栈溢出时,是时候来这里问;)

我正在努力学习如何使用Boost Spirit。我已经找到了基本的东西。由于我有K& R方便(其中包含C的语法),我决定看看我是否可以为语言做出接受者。无论如何,这或多或少都是我最初的目标,因为我最终希望将其用作预处理器,从数据结构和内容中收集一些信息。

我能够解析常量和字符串,但是当我尝试解析它时,我开始遇到问题。

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. 

当我传递i++之类的内容时,它失败了。我认为这是因为i是有效的primary_expression,所以它不会继续检查++--。我试着把它放在底部,然后我得到堆栈溢出。我在这里得到了一些无限的左递归,但我不知道如何解决它。

1 个答案:

答案 0 :(得分:2)

你必须摆脱左递归。这篇维基百科文章解释了一些技巧:

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

然而,这可能是不可能的。 C具有非常灵活的语法,并且可能无法提供足够的上下文以允许递归下降解析器起作用,除非Boost Spirit允许回溯。或者你将能够做到,但协会将会倒退。

使用基于LALR的工具(如野牛)可能会更好。