Я продолжаю получать переполнение стека, пытаясь использовать дух, чтобы проанализировать вещи

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

  •  12-09-2019
  •  | 
  •  

Вопрос

Я подумал, что когда я начал получать переполнение стека, пришло время прийти сюда, чтобы спросить;)

Я сейчас пытаюсь научиться использовать дух Boost. Я выяснил основные вещи. Поскольку у меня была K & R Dishy (которая содержит грамматику 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 И так не проверяет на наличие ++ или же --. Анкет Я попытался положить его внизу, а затем я получаю переполнение стека. Я получаю здесь бесконечную левую рекурсию, но я не знаю, как ее решить.

Это было полезно?

Решение

Вам придется избавиться от левой рекурсии. Эта статья в Википедии объясняет некоторые методы:

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

Однако это может быть невозможно. C имеет довольно гибкий синтаксис и может не обеспечить достаточно контекста, чтобы позволить рекурсивному анализатору спуска функционировать, если только дух усиления не допускает отступания. Или вы сможете сделать это, но ассоциации будут задом наперед.

Вам может быть лучше, используя инструмент на основе LALR, такой как Bison.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top