2017-03-21 9 views
0

私は自分自身でFlex/Bisonを学習していますが、VHDL93でいくつかの実験を行っています。中括弧を使用する文法的な "制作"(標準では呼ばれている)には問題があります。高度なEBNF構造(中括弧を使用)をBNF(Bisonと併用する)に変換する方法

私は意味を理解し、どのように標準で与えられる。この例変換する方法:

term ::= factor { multiplying_operator factor } 
term ::= factor | term multiplying_operator factor 

しかし、何について:

choices ::= choice { | choice } 

そして、私はこの

block_configuration ::= 
    for block_specification 
      { use_clause } 
      { configuration_item } 
    end for ; 
を変換する方法を理解していないが

私はstackoverflowで多くの質問を読んで、いくつかのEBNFチュートリアルを検索しましたが、私は見ませんでしたこの種の工事について何か

configuration_declarative_part ::= | 
    configuration_declarative_part configuration_declarative_item 

それはOKです:

configuration_declarative_part ::= 
    { configuration_declarative_item } 

として翻訳さ:

最後に、私はこの種の構造があることを理解しますか?

ご協力いただきありがとうございます。

答えて

1

一般的なケースは、各{ ... }は(n1n2それらを呼び出す)と第二の1に置き換えられる二つの新しいルールを作成するということです。

n1: ...whatever was in the braces... 
n2: /* empty */ | n2 n1 ; 

そうchoices ::= choice { | choice }ために、次のようになります。

n1 ::= /*empty*/ | choice 
n2 ::= /*empty*/ | n2 n1 
choices ::= choice n2 

あなたはそれをリファクタリングして、あいまいさを取り除き、必要に応じて簡略化します。上記と同等に削減:

choices ::= choice | choices choice 
+0

この回答は、私がhttp://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3.htmlを理解するのに便利でした。 – RAM

0

は、私が理解していれば、私は見てみましょう:

choices ::= choice { | choice } 

n1 ::= %empty | choice 
n2 ::= %empty | n2 n1 

choices ::= choice n2 
     ::= choice (%empty | n2 n1) 
     ::= choice | choice n2 n1 
     ::= choice | choices n1 
     ::= choice | choices (%empty | choice) 
     ::= choice | choices | choices choice 

しかしchoices ::= choicesので、簡単です:

choices ::= choice | choices choice 

configuration_declarative_part ::= { configuration_declarative_item } 

n1 ::= configuration_declarative_item 
n2 ::= %empty | n2 n1 

configuration_declarative_part ::= n2 
           ::= %empty | n2 n1 
           ::= %empty | configuration_declarative_part n1 
           ::= %empty | configuration_declarative_part configuration_declarative_item 

block_configuration ::= for block_specification { use_clause } { configuration_item } end for ; 

n1 ::= use_clause 
n2 ::= %empty | n2 n1 

n3 ::= configuration_item 
n4 ::= %empty | n4 n3 

block_configuration ::= for block_specification n2 n4 end for ; 
        ::= for block_specification (%empty | n2 n1) (%empty | n4 n3) end for ; 
        ::= for block_specification end for ; | 
         for block_specification n2 n1 end for ; | 
         for block_specification n4 n3 end for ; | 
         for block_specification n2 n1 n4 n3 end for ; 

今すぐですか?または実行することをお勧めします:付き

block_configuration ::= for block_specification n2 n4 end for ; 

n2 ::= %empty | n2 use_clause 
n4 ::= %empty | n4 configuration_item 

それは良いルール:-D おかげ


UPDATEだ:私はその結論に到着しました置き換えてより複雑なルールを持つより新しいルール(http://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3.htmlに基づく)を追加する方が良い(より明確です)。

関連する問題