2016-04-09 3 views
0

私は、Haskell言語用のパーサーを書こうとしました。プログラムが解析した付加的な注意書きは、有効なHaskellソースコードの接頭辞にすることができます。たとえば、これは私の場合は有効なソースである定義済みの言語のすべての接頭辞を受け入れるBison文法

https://www.haskell.org/onlinereport/syntax-iso.html#sect9.5

func x = (x + 

ここHaskellのためのBNFのような仕様があります。

BNF文法をそのようなプレフィックス言語を受け入れるbison文法に変換する模式的な方法はありますか?

この練習の文脈はEmacsのエディタであり、ソースコードはプログラムが記述されているので、目標はプログラマがソースコードを書くときにインデントのヒントを与えることです。

答えて

1

それはCFGを取り、すべてのプレフィックスに一致する言語用CFGにそれを変換するために、かなりストレートフォワードです:すべての非端末の

  • 、非の追加-prefixのバージョンを追加フォームX := A B Cのすべてのルールのための端末

  • terminal_prefixを参照するすべてのルールを削除し、フォームX_prefix := A B C_prefix | A B | A B_prefix | A | A_prefix

  • のルールを追加し、recursivel Y_prefixの場合はy Y_prefixにはルールがありません。もちろん

、この新しいCFGは、(1)LALRではないかもしれませんので、簡単にバイソンが直接使用することはできません - あなたはそれがLALR(1)作ってそれをリファクタリングする必要がある、またはGLRを使用することができます適切なマージルールを持つパーサー。

+0

良いアイデアのように見えます。これらのXX_prefixプロダクションはすべて返されますか? –

+0

あなたが返すものは何でも - 基本的なshift-reduceパーサーは文字列が記述された言語かどうかを認識します。 bisonの意味情報を使用して、解析に対応するAST、または必要な他のデータ構造を構築することができます。 –

+0

これは私の質問に答えるので、答えを受け入れました。これらのプレフィックス規則から何を返すべきかはまだ分かりませんが、それは別の研究の話題です。ありがとうございます。 –

関連する問題