私はものを解析するスピリットを使用しようとすると、スタックオーバーフローを取得しておきます
-
12-09-2019 - |
質問
私は、スタックオーバーフローを取得し始めたとき、頼むためにここに来る時間だった考え出し;)
私は今、ブーストスピリットを使用する方法を学習しようとしています。私は基本的なものを考え出しました。私は(Cの文法が含まれています)便利なK&Rを持っていたので、私は言語の受容体を作ることができるかどうかを確認することにしました。私は最終的にデータ構造とスタッフからいくつかの情報を収集するために、プリプロセッサとしてこれを使用したいので、これは、とにかく、多かれ少なかれ、私の当初の目標でした。
私は定数と文字列を解析することができるよ、私はこれを解析しようとすると、私は問題を抱えてスタート。
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
あるので、それが++
または--
をチェックするために行かないためであると仮定します。私は一番下にそれを入れてみました、そして私は、スタックオーバーフローを取得します。私はここにいくつかの無限の左再帰を取得していますが、私はそれを解決する方法がわかりません。
解決
あなたは左再帰を取り除く必要があります。このWikipediaの記事は、いくつかのテクニックを説明します:
http://en.wikipedia.org/wiki/Left_recursionする
しかし、それができない場合があります。 Cはかなり柔軟な構文を持っており、ブーストスピリットは、バックトラッキングを可能にしない限り、再帰下降パーサを機能させるのに十分なコンテキストを提供することはできません。それとも、それを行うことができるでしょうが、協会は後方になります。
あなたは、このようなバイソンなどLALRベースのツールを使用したほうが良いかもしれません。