2016-10-28 7 views
0

私はインターネットを検索して答えを見つけましたが、できませんでした。私を助ける人はいますか?BNFのような文法からJavaまたはC++へ

expr   ->term moreterms 

moreterms -> +term {print(‘+’)} moreterms 
     |­‐term {print(‘‐’)} moreterms 
     |ε 

term  ->factor morefactors 

morefactors ->*factor {print(‘*’)} morefactors 
     |/factor {print(‘/’)} morefactors 
     |ε 

factor  ->(expr) 
     |id {print(id)} 
     |num {print(num)} 

このコードは、非常に基本的な電卓コンパイラとインタプリタに使用します。

この文法をC++またはJavaに変換するにはどうすればよいですか?

答えて

2

文法を取り、構文解析を生成する多くのツールがあります.Yaccからboost spiritまでの範囲です。

パーザを書く技術は広く研究されています。それは自明ではない。 1つのアプローチは、BNFをLR(1)文法にしてLRパーサーを書くことができるかどうかを判断することです。

構文解析の簡単な方法は、構文解析をトークン化(物を識別子にバンドルする)と構文木の生成に分割することです。

Wikipediaには、LR解析の説明があります。 KnuthのCanonical LR(1) parserも見ておく価値があります。

LR(1)パーサー(LR(k)パーサーはもちろん)の書き方を教える方法は、大学の短期コースまたは書籍の章であり、スタックオーバーフローポストではありません。

しかし、一般的な考え方は左から右に読むことです。次のトークンに適用するルールを決定するために、kトークン(通常は1)を先読みします。パースツリーはボトムアップから構築します。

多くの技術的な詳細、技術、癖や問題があります。多くのパースジェネレータが処理できる制限されたものだけでなく、すべてのBNF文法をLR(1)文法に変換できるわけではありません。

@nnholySheepによるmentioendとして、TheDragonBookは、ほとんどの人がこれらの技術を学ぶ本です。

+0

驚くべき答え、ありがとう。 –

+0

コンパイラ/パーサーの作成に関する本については、事実上の標準は[Dragon book](https://en.wikipedia.org/wiki/Compilers:Principles,Techniques,__Tools)です。「コンパイラ、原則、テクニック、ツール」(OPがそれを知らない場合には言及する価値があると思う) – UnholySheep

0

Yaccをご覧になりましたか?これはあなたが探しているものを正確に行うことができます。

+0

私は学習の目的のためにそれを私自身で実装したいと思います。しかし、コンパイラと電卓のための通訳の非常に非常に基本的な実装は、基本的:) –

関連する問題