我想当我开始得到堆栈溢出时,是时候来这里问;)
我正在努力学习如何使用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
,所以它不会继续检查++
或--
。我试着把它放在底部,然后我得到堆栈溢出。我在这里得到了一些无限的左递归,但我不知道如何解决它。
答案 0 :(得分:2)
你必须摆脱左递归。这篇维基百科文章解释了一些技巧:
http://en.wikipedia.org/wiki/Left_recursion
然而,这可能是不可能的。 C具有非常灵活的语法,并且可能无法提供足够的上下文以允许递归下降解析器起作用,除非Boost Spirit允许回溯。或者你将能够做到,但协会将会倒退。
使用基于LALR的工具(如野牛)可能会更好。