2009-07-10 14 views
1

を解析するスピリットを使用しようとすると、スタックオーバーフローを取得し続ける;私はブーストスピリットの権利を使用する方法を学習しようとしている)私は、私は、スタックオーバーフローを取得し始めたとき、頼むためにここに来る時間だった考え出しもの

今。私は基本的なものを考え出した。私は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であるためです。したがって、++または--を確認することはできません。私は一番下に置いてみましたが、スタックオーバーフローが発生しました。私はここでいくつかの無限左回帰を得ているが、私はそれを解決する方法を知らない。

答えて

2

あなたは左回帰を取り除かなければなりません。このWikipediaの記事は、いくつかのテクニックについて説明します。

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

しかし、それができない場合があります。 Cは非常に柔軟な構文を持ち、ブーストスピリットがバックトラッキングを許可しない限り、再帰的降下パーサーが機能するのに十分なコンテキストを提供しない可能性があります。またはあなたはそれを行うことができますが、協会は後方になります。

バイソンなどのLALRベースのツールを使用する方がよい場合があります。

関連する問題