なでしこ3:単項演算子「-」が正しく処理されない

15 views
Skip to first unread message

うぇいく

unread,
Aug 28, 2017, 9:03:50 AM8/28/17
to 日本語プログラミング言語「なでしこ」開発
なでしこ3:単項演算子「-」が正しく処理されない件です。
forkしたリポジトリでは対策してみたのですが、以下の3つのmethodの役割分担が良くわからないため、
実装箇所・実装方法がどうもあってない感じがしているため、Requestは出していません(新しいJSも初見で良くわからないという理由も)

yGetArg
yCalc
yValue

これらは、必要に応じてかなり相互に呼び出しているようなのですが、数式の演算がGetArgにあるのが良くわかりませんでした。

なお、当方で試した対策は、単純に、yGetArgの数式の処理を、単項演算子にも対応して逆ポーランド変換を経由してASTに変換する方法です。ASTのnodeとして新たに「op1」(右結合の単項演算子)という種類に割り当てました。
優先順位を正しく設定すれば、AND(&&)、OR(||)、NOT(!)も、この枠組み内で扱えるはずですが、「not」はどこかに処理があるっぽいのでAND/OR含めて設定していません。

酒徳峰章

unread,
Aug 29, 2017, 6:30:49 PM8/29/17
to 日本語プログラミング言語「なでしこ」開発
うぇいくさん

クジラ飛行机です。いろいろ確認してくださりありがとうございます。

ご指摘の通り、現状では、「5 * -1を表示」などはうまくいくのですが、
「A=5。5 * -Aを表示」などがうまく通りませんね。
たぶん、-の後の処理で、数字だけを認めているのかもしれませんので、確認してみます。
あと、ご指摘の通り、三つの関数の呼び出しが複雑になっています。
yGetArg
yCalc
yValue

 これは、「(計算式)を表示」のように、関数の引数を取得する際に、計算を認めているため、yGetArgから、yCalcを呼びだすという感じになっており、yCalcの中でも、関数呼び出しに対応するために、yGetArgを呼ぶ・・・という複雑な感じになっています。なでしこの構文で、文脈の自由度を優先すると、複雑になりますね。

ちなみに、notは、"-"と同じくyValueの中で判定していますが、うぇいくさんの言うとおり、逆ポーランド変換の際に、-を考慮する方がスマートでしょうか。
ちょっと調べてみます。

ありがとうございます。


2017年8月28日月曜日 22時03分50秒 UTC+9 うぇいく:

酒徳峰章

unread,
Aug 29, 2017, 7:10:28 PM8/29/17
to 日本語プログラミング言語「なでしこ」開発
うぇいくさん

クジラ飛行机です。追伸です。
なでしこ3:単項演算子「-」が正しく処理されない件ですが・・・

nako_parser3.js のメソッド yValue ()で、マイナスの処理をしていたのですが、
この中で、yCalc()を呼びだすようになっていたため、
「5 * -aを表示」が、「5*と(-aを表示)」となってしまい、*が計算できないというエラーが出ていました。
yValue()を再帰的に呼びだすように修正したら、問題なく動くようになりました。

- 修正内容

ありがとうございました。



2017年8月28日月曜日 22時03分50秒 UTC+9 うぇいく:
Reply all
Reply to author
Forward
0 new messages