質問

また、書くわけ信頼性には最大限の発電機として、個人ます。

あるウェブベースのオンラインのもの こちらのこちらの.

alt text
(Example screenshot of an existing Truth Table Generator)

私のテーマは、次のとおりです。

  • いつ、どのようにくい構文解析表現のように: ((P=>Q)&(Q=>R)=>(P=>R)
  • どちらを使うべき、パーサに発電機のようにAoetoolsはYACC、直正規表現?
  • 一度に発現解析され、どのようにいくつの真実。各部の表現が必要で分けられて、その最小部品から左側のテーブルです。はどのように評価していいそうですよね。

誰でもできるので提供しくヒントに関する解析これらの任意の表現とその評価、解析された。

役に立ちましたか?

解決

これは素晴らしい個人的なプロジェクトのように聞こえます。あなたは、コンパイラの仕事の方法を基本的な部分について多くのことを学びます。私は、パーサジェネレータを使用しようとしてスキップします。これはあなた自身の啓発のためであれば、あなたは最初からすべてをすることによって多くを学びます。

このようなシステムは、仕事のやり方は、私たちが自然言語を理解する方法の定式化です。私はあなたの文章を与える場合:「犬、ローバーは、彼の料理を食べた」、あなたが最初のものは、単語や句読点に分割しています。 ""、 "SPACE"、 "犬"、 "COMMA"、 "SPACE" は、 "ローバー" は、...それは、 "トークン化" または "レクサー" です。

あなたは次のことは、文は文法的であるかどうかを確認するためにトークンストリームを分析しています。英語の文法は非常に複雑ですが、この文は非常に簡単です。 SUBJECT-同格-VERB-OBJECT。これは、 "パース" されます。

あなたは文が文法的であることを知っていたら、その後、実際にそこから意味を得るために文を分析することができます。たとえば、あなたはこの文の三つの部分があることがわかります - 件名、同格は、と「彼」オブジェクト内 - すべてが同じエンティティを参照していること、すなわち、犬。あなたは犬が食べることをやっものであることを把握することができ、そして食べ物が食べられるものです。これは、意味解析フェーズである。

コンパイラは、その後、彼らは言語で記述されたアクションを表すコードを生成している人間がいないことを第四相を、持っています。

だから、すべてのことを行います。あなたの言語のトークンが何であるかを定義することによって開始し、ベースクラストークンとそれぞれの派生クラスの束を定義します。 (IdentifierToken、OrToken、AndToken、ImpliesToken、RightParenToken ...)。次に、文字列を受け取り、「IEnumerableをを返すメソッドを記述します。それはあなたのレクサーです。

第二に、あなたの言語の文法があるかを把握し、あなたの言語で文法的実体を表す抽象構文木へのIEnumerableを壊す再帰下降パーサを書きます。

そして、その木を見て、同じよう数字は、アウト詰め込むアナライザ書く「どのように多くの異なる自由変数私が持っていますか?」

次に、真理値表を評価するために必要なコードを吐き出すコードジェネレータを書きます。唾吐きILはやり過ぎのように思えるが、あなたは本当にバフになりたい場合は、可能性。式ツリーのライブラリはあなたのためにそれをやらせることが容易であるかもしれません。あなたが式ツリーにあなたのパースツリーを変換した後、デリゲートに式ツリーを回すと、デリゲートを評価することができます。

グッドラック!

他のヒント

私は、パーサジェネレータはやり過ぎだと思います。あなたは接尾辞に式を変換するアイデアを使用することができますし、は後置表現する(または直接の評価します中置式のうち、式ツリーを構築し、この問題を解決するために)真理値表を生成することを使用します。

Mehrdadそれはレクサー/パーサの構文を学ぶためにかかるだろうとあなたは同じ時間で解析をロール渡しすることができるはず述べています。あなたが望む最終的な結果は、あなたが与えられた表現のいくつかの抽象構文木(AST)です。

あなたはその式で定義されたシンボルのための入力の組み合わせを作成し、いくつかの入力ジェネレータを構築する必要があります。

次に、最初のステップで解析されたルール(AST)が与えられると、各入力コンボの結果を生成する、入力セットを横切って反復

の私はそれを行うだろうか。

私はあなたが、その後の計算に、ラムダ式ツリーにシンボルテーブルを解析し、入力セットを構築することができ、あなたは木を解析してAST /ルールを表現するためにラムダ関数を使用して、あなたが解析としてシンボルテーブルを構築する想像できます結果ます。

あなたの目標は、ブール式を処理している場合は、

は、一緒に行くパーサジェネレータと、すべての機械は、あなたは彼らが(そして、それらのいずれかが、大丈夫だと思う)どのように機能するかを学習したい場合を除き、時間の無駄です。

しかし、表現を、「評価」の結果を計算して返すブール式の手で再帰下降パーサを、構築することは容易です。そのようなパーサは、「評価」が「それぞれの新しい変数名にcouunt 1」を意味する固有の変数の数を決定するために、最初のパスで使用することができます。 Nの変数のすべての可能な真理値を生成するジェネレータを書くことは簡単です。値の各セットのために、単純に評価する手段は、「オペレータに応じて部分式の値を組み合わせて」ここで、もう一度、パーサーを呼び出し、式を評価するために使用します。

あなたは文法を必要があります。

formula = disjunction ;
disjunction = conjunction 
              | disjunction "or" conjunction ;
conjunction = term 
              | conjunction "and" term ;
term = variable 
       | "not" term 
       |  "(" formula ")" ;

Yoursを、より複雑になることができますが、ブール式のためにそれははるかに複雑にすることはできません。

各文法規則は、構文解析された文字列にグローバル「スキャン」インデックスを使用し1つのサブルーチンを書きます

  int disjunction()
 // returns "-1"==> "not a disjunction"
 // in mode 1:
 // returns "0" if disjunction is false
 // return  "1" if disjunction is true
 { skipblanks(); // advance scan past blanks (duh)
   temp1=conjunction();
   if (temp1==-1) return -1; // syntax error
   while (true)
     { skipblanks();
       if (matchinput("or")==false) return temp1;
       temp2= conjunction();
       if (temp2==-1) return temp1;
       temp1=temp1 or temp2;
     }
  end

  int term()
  { skipblanks();
    if (inputmatchesvariablename())
       { variablename = getvariablenamefrominput();
         if unique(variablename) then += numberofvariables;
         return lookupvariablename(variablename); // get truthtable value for name
       }
     ...
  }

あなたのパースの各ルーチンは、この複雑な程度になります。真剣ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top