2

Aには、yaccで記述された単純な文法があります。これは、部分式とAND(&&)、OR(||)、およびNOT(!)演算子で構成される論理式からツリーを構築します。文法自体はここでは提供しません。これは、特別なことは何もなく、数え切れないほどのYACCチュートリアルの例に似ているためです。

ただし、ドモルガンの法則に従って、NOT演算子のすべての括弧が展開されるように、これらの論理式を解析する必要があります。たとえば、私は表現を扱う必要があります

!( ( A && B ) || C ) ) 

なので

( !A || !B ) && !C

既存のyacc文法を変更することでこれを実装することは可能ですか?

4

2 に答える 2

1

これは、yacc文法自体で行うべきことではありません。このような削減を実行するには、文法構成のASTを後処理する必要があります。

文法は、ある種のASTを生成する必要があります。構造を歩き、の形状に一致するものを探して、その場でに変換する必要があります。!((A && B)|| C)(!A || !B) && C

これに関するガイダンスがさらに必要な場合は、情報を追加したり、質問をしたりすると便利な場合があります。

編集:これで何か助けが必要な場合は、文法を提供する必要があります。これは宿題のように聞こえるので、コードを提供しない理由はそれだけではないことを願っています。私たちがあなたを助けるのを手伝ってください。文法の動作であなたが何をしているのかわからないので、私たちがあなたのために何ができるかをどのように推測できますか?

于 2012-05-09T13:13:21.037 に答える
1

ASTを構築している間、 not(!)演算子に対するYACCの削減アクションでこれを行うことができます。セマンティックアクションでは、任意のコードを記述できます。子からではなくツリーノードを「盲目的に」組み立てる代わりに(このような縮小アクションで見つかる通常のコード)、子を検査して必要な形状があったかどうかを確認するコードを記述できます。それぞれのド・モルガン等価ツリーを構築します。これを行うためのコードは、ツリーを上下に移動し、ノードを照合し、サブツリーを再実行する必要があるため、少し面倒ですが、悪くはありません。ド・モルガンの法則は、(A && B)||のような形の子供にほぼ間違いなく適用されることに注意してください。C)と(A || B && C))なので、2つの主要なサブケースを処理します。

私はレンに同意します。通常、パーサーではこれを行いません。その目的は、より複雑なアクティビティを設定することです。DeMorganizingが唯一の目的でない限り、解析が完了した後、さまざまなASTを処理するために他のコードが必要になるので、すべての処理をそこまで残してみませんか?

その考えに従って、configured-deadコードを排除することに関する私の最近のSOの回答は、シンボリックブール論理を単純化します。これは、パターンマッチングのソースからソースへの変換を使用してブール論理ASTを変換する1つの方法を示しています。このアプローチは、厄介なツリーの検査/ハッキングコードを回避します。その手法でド・モルガンの法則を実装する読み取り可能な変換を作成する方法は明らかです(実際、過去に息子を作成しました)。

于 2012-05-09T13:49:48.490 に答える