Я подумал, когда у меня началось переполнение стека, пришло время прийти сюда, чтобы спросить;)
Я пытаюсь научиться использовать 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
, и поэтому он не проверяет ++
или --
. Я попытался положить его внизу, а затем я получил переполнение стека. У меня тут бесконечная левая рекурсия, но я не знаю, как ее решить.