2011-11-11 6 views
0

こんにちは、私は質問があります、オートマトンの簡単な質問、私はこれが適切な場所かどうかこの種の質問をpsotingのかどうかはわかりません。 実際に今年私は、コンパイラの構築コースを持っています。もし誰かが良いリソースを知っていれば、ここに投稿すると良いでしょう。文法ヘルプ(オートマトン理論)?

私は非常に基本的な質問があります。例えば、2 + 3 * 5のような式があります。この式の文法はどうやって書くのですか? 1つのあいまいな例とあいまいでないものの1つを意味します。 ありがとう

+0

実際、私は質問で明らかかどうかはわかりません。 – Samuel

+1

一つの例しか与えられていない文法を開発するのは難しいです... –

+0

私は+演算子から*で始まらないパーサを*より優先度が高いので、文法は何かこのケースのために書かれたパーサーが*から計算を開始するように書かれています。そして、ANTLRがトップダウン解析を使用することを知っていますので、このケースの文法を教えてください。 – Samuel

答えて

1

[an]式の文法を書くことはできません。文法は制作のルールです。簡単な例は次のとおりです。

S -> (S) 
S -> SS 
S -> [empty] 

この文法は何ですか?

これにより、基本的に、 ""、 "()"、 "(()())()"のような文字列を生成することができます。私は「生成する」と言った - 論理的には、単一の「S」から始まり、そこから作業し、各Sを右側の「生産」に置き換える。しかし、この方法で生成する文字列は、正式な意味で「文法的に正しい」ということが鍵です。

構文解析はこれとは逆です。つまり、文字列をプロダクションの対応する順序に変換します。これを複数の方法で行うことができれば、文法はあいまいです。

コンパイラを書くときは、まず入力を「レックスする」必要があります。 2 + 3 * 5は、NUM ADD NUM TIMES NUM(それぞれがトークンである)のようなものにレキシングされるべきである。あなたが有効な文字列を生成することができる唯一のものであるような生産のためのルールを記述する必要があります

_ + _ 
2  * 
     3/ \5 

:次に、「構文木」のような、おそらく何かを構築するための文法に基づいてトークンを解析します。それはちょっとやりにくいですし、ちょっとした芸術なので、私はそれ以上のことはできません。

優先順位は、異なる非終端記号(たとえば、SおよびT)で処理されます。実際のパーサーには数十ものものがあります。 Cは何百もあります。巧みにそれらを配置することによって、特定のものが他のものより先にマッチするように強制します。

関連する問題