2011-03-09 10 views
0

この式はどのように派生しますか?私はこれのための解析木を描画する必要がありますが、これを導く実際の問題があります。 Google検索では便利なリンクはありませんでしたが、どんな助けでも大歓迎ですが、自分のやりたいことが他にないので簡単に説明してください。 "|"プログラミングのように "または"演算子の略ですか?それはcontext-free grammarだ...算術式の導出?

< exp> ---> < exp> * < factor> 
---> x * < factor> 
---> x * < factor> * < factor> 
+2

ASCII芸術代数のコースを受験する? –

+3

宿題のように聞こえます。 –

+0

構文解析ツリーを構成するためにその文法に合った具体的な例は必要ありませんか? – Orbling

答えて

1

< exp> ---> < exp> * < factor> | < factor> 
< factor> ---> < factor> - < term> | < term> 
< term> ---> x | y | z 

この

は、私が思い付くことが最高であり、私は完全に失われています。 「代数式」のセクションには、似た構文解析ツリーのサンプルが含まれています。

0

質問に答えるには|プログラミングにおけるものなどを示すために使用される。あなたが投稿した文法は、その優先順位のように見えますが、オフです。通常、乗算の方が加算よりも優先順位が高くなりますが、投稿した文法には逆の問題があります。

(あなたの例では操作の限定セット用)式の文法を右に通常の方法では

expression = expression+ term 
      | term 
term  = term * factor 
      | factor 
factor  = x 
      | y 
      | z 

あなたが加算前に乗算を行うこの方法です。 x + y * zの場合、次のようになります。私はアスキーアートを使っていないので、コンマの代わりに区切り文字として演算子を使ってS-expressionsを解決する必要があります。

(式(式(項(第X因子))) '+'(項(ファクタy) '*'(ファクターz)))

1

はい、|通常のプログラミングと同様です。以下のような行:

< exp> ---> < exp> * < factor> | < factor> 

は、それが< factor>であれば、それはフォーム< exp> * < factor>の場合、または何かが< exp>良いことを意味します。

あなたの完全な文法を見て:

次のように x - y * x - y - y * zのような式は、パスで構築することができ
< exp> ---> < exp> * < factor> | < factor> 
< factor> ---> < factor> - < term> | < term> 
< term> ---> x | y | z 

  e 
     /|\ 
     /| \ 
     e * f 
     /|\  \ 
    /| \  t 
    /| \  \ 
/ | \  z 
    e * f 
    |  /|\ 
    f  /| \ 
/|\  f - t 
f - t /|\ | 
| | f - t y 
t y | | 
|  t y 
x  | 
     x 

x  y  x   y  y  z 
<term> - <term> * <term> - <term> - <term> * <term> 
<factor>  * <factor> - <term> - <term> * <factor> 
<factor>  * <factor>   - <term> * <factor> 
<expr>   * <factor>     * <factor> 
<expr>          * <factor> 
<expr> 

は、解析を取得する順序を逆に

(その図は私が予想していたよりももっと多くの仕事を引き出した...)