1

我想当我开始出现堆栈溢出时,是时候来这里询问了;)

我现在正在尝试学习如何使用 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,所以它不会继续检查++or --。我试着把它放在底部,然后我得到堆栈溢出。我在这里得到了一些无限的左递归,但我不知道如何解决它。

4

1 回答 1

2

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

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

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

您最好使用基于 LALR 的工具,例如 bison。

于 2009-07-10T08:08:38.440 回答