Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


100 / 13645 ツリー ←次へ | 前へ→

【82003】A AND B OR (C OR D)をOR(AND(A,B),OR(C,D))に変換するアルゴリズム しょうち 22/3/26(土) 22:10 質問[未読]
【82004】Re:A AND B OR (C OR D)をOR(AND(A,B),OR(... よろずや 22/3/27(日) 13:18 発言[未読]
【82005】Re:A AND B OR (C OR D)をOR(AND(A,B),OR(... しょうち 22/3/28(月) 9:01 お礼[未読]
【82009】Re:A AND B OR (C OR D)をOR(AND(A,B),OR(... とおりすがり 22/4/4(月) 1:59 発言[未読]

【82003】A AND B OR (C OR D)をOR(AND(A,B),OR(C...
質問  しょうち E-MAIL  - 22/3/26(土) 22:10 -

引用なし
パスワード
   はじめまして表題のように
A AND B OR (C OR D)をOR(AND(A,B),OR(C,D))
などとVBAチックに書かれたStringデータを
エクセル調に変換したいです。

splitや色々と試してみたのですが
汎用的に作ろうとすると
なかなか良いアイデアが思い付かず

よろしくお願いいたします。

【82004】Re:A AND B OR (C OR D)をOR(AND(A,B),O...
発言  よろずや  - 22/3/27(日) 13:18 -

引用なし
パスワード
   ▼しょうち さん:
>はじめまして表題のように
>A AND B OR (C OR D)をOR(AND(A,B),OR(C,D))
>などとVBAチックに書かれたStringデータを
>エクセル調に変換したいです。

やろうとなさってる事は、ポーランド記法への変換だと思います。
残念ながら、ポーランド記法に関するページはほとんどありません。
※逆ポーランド記法についてのページならたくさんあるんですけどね。
LISP とか LOGO などを調べれば何かつかめるかも。

お力になれず、ごめんなさい。

【82005】Re:A AND B OR (C OR D)をOR(AND(A,B),O...
お礼  しょうち  - 22/3/28(月) 9:01 -

引用なし
パスワード
   ▼よろずや さん:
>▼しょうち さん:
>>はじめまして表題のように
>>A AND B OR (C OR D)をOR(AND(A,B),OR(C,D))
>>などとVBAチックに書かれたStringデータを
>>エクセル調に変換したいです。
>
>やろうとなさってる事は、ポーランド記法への変換だと思います。
>残念ながら、ポーランド記法に関するページはほとんどありません。
>※逆ポーランド記法についてのページならたくさんあるんですけどね。
>LISP とか LOGO などを調べれば何かつかめるかも。
>
>お力になれず、ごめんなさい。


循環参照し、自己解決できました!
アドバイスありがとうございます!

【82009】Re:A AND B OR (C OR D)をOR(AND(A,B),O...
発言  とおりすがり  - 22/4/4(月) 1:59 -

引用なし
パスワード
   構文木が取得できる言語であれば、例えば、以下のように書けます。
VBAだと難しいでしょう。
(簡単なものに限定すれば、ヒューリスティックな解法があるかもしれません)

s = "A AND B OR (C OR D)" の変換結果は、
  "OR(AND(A, B), OR(C, D))"となります。

function test()
  s = "A AND B OR (C OR D)"        
  s = replace(s, "AND" => "&&" , "OR" => "||" )
  a = Meta.parse(s)  # Expr型(AST表現)に変換
  return recursive(a)
end

function recursive(a)
  head = a.head
  args1,args2 = a.args
  
  if typeof(args1) == Expr
    ele1 = recursive(args1)
  else
    ele1 = string(args1)
  end

  if typeof(args2) == Expr
    ele2 = recursive(args2)
  else
    ele2 = string(args2)
  end

  if head == :&&
    return "AND(" * ele1 * ", " * ele2 * ")"
  elseif head == :||
    return  "OR(" * ele1 * ", " * ele2 * ")"
  end  
end

test()

100 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free