Я продолжаю получать переполнения стека при попытке использовать Spirit для разбора вещей - PullRequest
1 голос
/ 10 июля 2009

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

Я пытаюсь научиться использовать 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 Ответ

2 голосов
/ 10 июля 2009

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

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

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

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

...