HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0229
NoapHSP 3.5 beta 3のプリプロセッサのとげっかっこの不具合8解決


Noap

リンク

2016/2/29(Mon) 18:01:22|NO.74730

複数行の文字列をそのまま記述する際に使うとげかっこですが、
プリプロセッサが引数とみなしてくれません。
3.4、3.5 beta 2では引数として取り扱ってくれていました。

エラーになります


//引数とみなされずにエラーになりました #define mes2(%1) mes %1 mes2 {" "}


エラーになりません


#define mes2(%1) mes %1 #module #deffunc mes3 str p1 mes p1 return #global //マクロでもとげかっこを使わなければエラーになりませんでした mes2 "マクロ" //マクロでなければとげかっこを使用してもエラーになりませんでした mes {"標準命令 "} mes3 {" ユーザ定義命令"}



この記事に返信する


kanamaru

リンク

2016/2/29(Mon) 18:03:42|NO.74731

何ででしょうね?
余談ですが、それはとげカッコではなく、波カッコと言います。



Noap

リンク

2016/2/29(Mon) 18:05:43|NO.74732

そうなのですか。ありがとうございます。



Noap

リンク

2016/2/29(Mon) 19:32:55|NO.74733

調べてみました
プリプロセッサだけでも規模が大きいので処理の流れがよくわからないので間違いがたくさんあるかもしれません
間違っていればごめんなさい
言葉が変かもしれません

hspcmp/token.cpp

ReplaceLineBufでマクロの置換をしますがそこでトークンの切り出しにGetTokenを使いますがそこで

if (a1==':' || a1 == '{' || a1 == '}') { // multi statement


こうなっていて{と}でも別々に切り出されてしまって

#define mes2(%1) mes %1 mes2 {" "}
は ReplaceLineBuf内で
{の前と後ろを


#define mes2(%1) mes %1 mes2 :" "

と同じように別々にマクロ展開するので省略エラーや文法エラーなどになりました

でも


#define mes2(%1="") mes %1 mes2 ""+{"a "}

こうした場合
{までが展開されて


mes@hsp ""+
となりそのあとに

{" "}
が続くので結果的に問題なくコンパイルできます


ただもともと

if (a1==':') { // multi statement
だったのがバグ修正として上記のif文になっているのでよくわかりません
たぶん別のところに関係するバグ修正だと思いますがわかりません

変な文章だったり間違いがあればごめんなさい



Noap

リンク

2016/2/29(Mon) 20:41:02|NO.74734

あてにする人はいないと思いますが、量が多くてどこがどうなっているのかどうつながっているのかまったくわからず上記は辛うじて理解できたかどうかというところを書いたのであまりあてにはしないでください。
上の投稿の文章は理解の範囲内で書いたので間違っている気がします。間違っていればごめんなさい。



ue_dai

リンク

2016/2/29(Mon) 23:11:20|NO.74737

確かにその変更が原因ですね。失礼しました。

いま気づいたのですが、今までもマクロ展開時は
{"..."} をうまく処理できていなかったようです。
例えば


#define m(%1) mes (%1) m {" hello "}

としたら

mes ({") "}

に置換されるなど。

{""}を先のif文より前に扱うようにてみしようかと思います。



Noap

リンク

2016/2/29(Mon) 23:15:01|NO.74739

すばやい対応にありがとうございます。



ue_dai

リンク

2016/2/29(Mon) 23:32:52|NO.74740

やはり複数行に渡る操作になると修正はかなり大変そうです
この問題の解決はバージョン3.6以降に回して、
ひとまず先の変更を差し戻したほうがいいかもしれません。

ちなみに先の変更は if 文がマクロの引数に取り込まれてしまうという問題への対処でした

#define unless(%1) if ((%1) != 0) unless a == 0 { // '{' は文の区切りであるべき //... }



おにたま(管理人)

リンク

2016/3/4(Fri) 22:44:31|NO.74774

β版の不具合について情報ありがとうございます。
次のバージョンでは何らかの対応をしたいと思います。



ONION software Copyright 1997-2018(c) All rights reserved.