1

式エバリュエーターの数値に +/- 記号のサポートを追加したいのですが、それが数値トークン (例: number = [\+\-]*[0-9]+) の一部として字句要素であるべきか、構文要素 (例: primary ::= [ ( "+" | "-" ) ] primary | numberwhere number = [0-9]+) であるべきかわかりません。

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

4

2 に答える 2

0

実際問題として、「-」を字句要素にするのは困難です。これは、標準の 2 オペランドの「減算」演算子として、他の使用法でも認識する必要があるためです。

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

設計上、パーサーの状態にアクセスできないため、レクサーはこの決定を下すことができません。では、「-」文字に遭遇したかどうか、「-」トークンを生成するか、または次の数値リテラルによって消費されるかを合理的に判断するにはどうすればよいでしょうか? 次の数値リテラルによって消費される場合、パーサーは式に問題を抱えます。

 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 ;

(これらをあなたに合った形にリファクタリングさせてください)。

于 2011-10-25T11:31:32.460 に答える
0

両方を使用すると良いと思います:1 - -1 = 2

于 2011-10-21T14:24:54.190 に答える