-1

私は、制御フローと混合されたときに式がどのように解析されるかを知りたいと思います。数学的表現を制御フローと混合する

のは、このような構文を想定してみましょう:私たちはここで2つの条件式、Method() + 1Something(1)0を持って

case 
    when a == Method() + 1 
    then Something(1) 
    when a == Other() - 2 
    then 1 
    else 0 
end 

。それぞれはShunting-yard algorithmによって後置に変換され、容易にASTに翻訳されます。しかし、このアルゴリズムを拡張して制御フローを処理することも可能ですか?あるいは、表現や制御フローの混在を解決するための他のアプローチがありますか?

別の例:

a == b ? 1 : 2 

もどのように私は、このような表現を分類することができます:a between b and cを、私はbetweenは三つの引数の関数であると言うことができますか?あるいは、そのような式の特別な名前はありますか?

+2

「コントロールフロー」とは具体的にはどういう意味ですか? 「...と...と...」という言葉は、私がコントロールフローの構築物と考えるようなものではありません。あなたは "三元演算子"を意味するだけですか? – sepp2k

+0

あなたの権利、私は制御フロー文を使用すべきではありません。私はそのような表現をどのように分類するのか分かりません。三元演算子ではないと思いますが、どういう名前ですか? – Puchacz

+1

aとbとcの間には3つの引数があり、それはブール値を生成する式です。三項演算子です。 – EJP

答えて

2

演算子優先文法で3項演算子を確かに解析できます。

expr ? expr : expr 

バイナリ「演算子」では、ここで便利起動し、(異なるものが)演算子トークンで終わる? expr :、です。それにシャントヤードを適用するには、の優先順位を割り当てますか?と、?:演算子の優先順位の左優先順位は、です。 の左優先順位は?であり、右優先順位はであり、 ∞、かっこのようになります(実際はそうです)。

caseステートメントは基本的に3値演算子を繰り返し適用しているため、トークンにわずかに異なる綴りを使用し、同様の解決法になります。 (then残りwhen sは?:に対応しながら、ここcase whenendは、純粋に括弧である。)本当にLALR(1)パーサジェネレータを使用することが簡単であり、ほぼ確実に存在する、こと

を言ってあなたが書いているどんな言語で利用可能な1


それは三項演算子とOPのcase文の両方がオペレータの文法であることは明らかだ:。

  1. 三項演算子:

    ternary-expr: non-ternary-expr 
          | non-ternary-expr '?' expr ':' ternary-expr 
    

    通常は、三項演算子が書き込まれる方法上記で右に、他のオペレータと関連付ける、より低い優先順位であろう。 C言語や他の言語では、三項式は代入式と同じ優先順位を持ちますが、これは簡単に追加できます。

    :それは関係

    • X ·> ?
    • ? <· X
    • ? ·=· :
    • X ·> :
    • : <· X
  2. Caseステートメント(多くの可能な製剤の1)になりここ

    case_statement: 'case' case_body 'else' expr 'end' 
    case_body: 'when' expr 'then' expr 
         | case_body 'when' expr 'then' expr 
    

    上記の文法の優先順位の関係は、次のとおり

    • case <· when
    • case ·=· else
    • when <· X(下記参照)
    • when ·=· then
    • then ·> when
    • X ·> when
    • 上記関係でX ·> end

    X任意のバイナリまたは単項演算子を意味

  3. ​​
  4. else ·=· end
  5. else <· X 、任意の値端末、()

    これらの端末すべてで左優先順位関数と右優先順位関数を見つけるのは簡単です。パターンは標準代数文法のかっこのパターンに似ています。

+0

これは本当に質問に対する正確な答えではありません。問題は、タイトルごとに制御フローのステートメントと式についてですが、その質問にはケースステートメントがあります。演算子優先パーザでそれらを解析することはできません。 – EJP

+0

@EJP:あなたは絶対にできます。これは明らかにオペレータの文法である。なぜなら、2つの連続した非終端記号を持つプロダクションは存在せず、優先順位の関係も推測し易いからである。それが役に立つと思うなら、私はそれらを私の答えに入れます。 – rici

2

Shunting-yardアルゴリズムは、単項演算子と二項演算子を使用する式用です。制御フロー文を解析するには、LL(1)やLALR(1)などのより強力なものが必要です。また、それがあれば式も処理します。 Shunting-yardアルゴリズムはまったく必要ありません。

+0

OPはLALR(1)を使用しているはずですが、これは実際の質問に対する正確な回答ではありません。しかし、三項演算子と '(cond ...)'型の構造(OPが本当に求めているもの)は、演算子優先パースに確実に従います。 – rici

+0

@riciこれは本当に私の答えの正確なコメントではありません。私は演算子の優先順位パーサで三項演算子を解析できないと言っていません。質問はコントロールフローの文と表現に関するもので、質問にはcase文があります。演算子優先パーザでそれらを解析することはできません。 – EJP

関連する問題