2011-10-21 7 views
1

私の式評価ツールの数値に+/-符号のサポートを追加したいのですが、数字トークンの一部としての字句要素(例えばnumber = [\+\-]*[0-9]+)か構文(例えばprimary ::= [ ("+" | "-") ] primary | numberの場合はnumber = [0-9]+)のどちらであるべきかわかりません。+/-数字のプレフィックスの記号:字句/構文要素?

上記から分かるように、この記号は任意に多くなる可能性があります。現在、再帰的降下と演算子の優先順位の解析の両方を使用して構文バージョンを実装しました。しかし、私はまだこれが良い選択かどうかは分かりません。一つ目は、文法上のバージョンでは、それが満たしている各記号に対して再帰が必要です。

+1

なぜあなたは任意の数を許可しますか? 'のようなもの' primary :: = [( "+" | " - ")] number |数字がよかったようです。 –

+0

ええ、私はそれもちょっと役に立たないと思った。言語は書くのを容易にするほど表現力豊かでなければならないが、ほとんど何も受け入れられないことを過度に表現してはならない。とにかく、これを可能にする多くのプログラミング言語なので、おそらく私もそれを実装すべきだと思った。私はそのシンプルなオプションのシングルサインアプローチをとるでしょう。 – LeleDumbo

答えて

0

私はあなたが両方を使用する場合、それは良いことだと思う:1 - -1 = 2

+0

私はそれを取得しません。どちらも? – LeleDumbo

+0

私はduedl0rはバイナリマイナス(あなたの文法には表示されません)と単項マイナス(あなたが示した)の両方を意味すると思います。私はこれがあなたの質問に対する答えだとは思わないが、答えを示唆している。 –

+0

ああ、私はすでにそれを持っています。両方とも問題なく動作していますが、私はアプローチの効率に疑問を抱いています – LeleDumbo

0

実際問題として、それを作るのは難しいです「 - 」あなたはまた、標準としての他の使用でそれを認識する必要があるため、字句要素であります2つのオペランドの「減算」演算子。

スタンドアロンの語彙素として " - "を生成すると、パーサは、あなたが提供する文法規則のために、それが減算演算子か否定演算子かを簡単に判断できます。

レクサーは、意図的にパーサ状態にアクセスできないため、この決定を下すことはできません。だから、 " - "トークンの生成を引き起こすか、または次の数値リテラルによって消費されるべきかどうかを合理的にどのように伝えることができますか?それは、以下の数値リテラルによって消費されている場合は、あなたのパーサーは、表現に問題があります:文法規則は、マイナス記号の両方のタイプを処理するようおprobabaly欲しい

x - -2 

は以下のとおりです。

expression = sum ; 

sum = term ; 
sum = sum '+' term ; 
sum = sum '-' term ; 

term = primary ; 
term = term '*' primary ; 
term = term '/' primary 

primary = '-' primary ; 
primary = '(' expression ')' ; 
primary = number ; 
primary = identifier ; 

(私はあなたにどんな形にでもリファクタリングさせます)。

+0

私はすでに完全な文法を持っていますが、私は上に投稿した主な表現だけを疑うことができます。とにかく私の文法は自由に左回帰です:) – LeleDumbo