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のチェックに進まないためだと思います。一番下に置いてみたところ、スタックオーバーフローが発生しました。ここで無限の左再帰が発生していますが、解決方法がわかりません。++--

4

1 に答える 1

2

左再帰を取り除く必要があります。このウィキペディアの記事では、いくつかのテクニックについて説明しています。

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

ただし、それができない場合があります。Cは非常に柔軟な構文を持っており、Boost Spiritがバックトラックを許可しない限り、再帰下降パーサーが機能するのに十分なコンテキストを提供しない可能性があります。または、それを行うことはできますが、関連付けは逆になります。

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

于 2009-07-10T08:08:38.440 に答える