問題タブ [associativity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 異なる演算子の結合性が異なるのはなぜですか?
The Ruby Programming Language の演算子に関するセクションを読んで、演算子の結合性について考えさせられました。ちなみに、これは Ruby に関する質問ではありません。すべての言語に当てはまります。
オペレーターがどちらかの方法で関連付ける必要があることはわかっています。場合によっては、ある方法が他の方法よりも望ましい理由はわかりますが、全体像を見るのに苦労しています。言語設計者が何を左から右、何を右から左にするかを決定するために使用する基準はありますか? それが他の方法よりも一方向であることが「理にかなっている」場合と、それが単なる恣意的な決定である場合がありますか? それとも、これらすべての背後にある壮大な設計がありますか?
programming-languages - BNF 文法と演算子結合性
(まず第一に、これはハードウェアではありません。私はすべての答えを持っています)
私は単純な BNF 文法を持っています
and
演算子は左結合 (左再帰)
or
演算子は右結合 (今回は右再帰)
式 が与えられたときc and b or not a and ( not b or c )
、解析ツリーで一番右の「and」が上位にあるのはなぜですか?
ちなみに、c **and** b or not a and ( not b or c )
一番左が解析ツリーの上位にあるはずです。
私たちの教授はこの答えを提供しました:
Lispy 表記の解析ツリーを次に示します。
python - pyparsing による再帰式
再帰的な (何も囲まれていない) 式が可能な左結合式を実行する方法を理解しようとしています。たとえば、私はやりたい:
1 x 2 x 3
結果のような2つの操作を解析し(expr OP expr) OP expr
ます。
expr
無限再帰からの解析を防止しようとすると、次のようなことができます。
しかし、その後、expr OP (expr OR expr)
結果が得られます。
左バインディングを強制するにはどうすればよいですか?
編集: については知っていますoperatorPrecedence
が、演算子が"IS" + Optional("NOT")
または類似している場合、適切に一致しないようです。
perl - 演算子の優先順位と結合性を判断する簡単な方法はありますか?
私はパーロプについて知っています。私が探しているのは、GHCi:info
コマンドのようなクイック ルックアップです。
私が学ぶ場所(+)
は左結合であり、行からの優先レベルは 6infixl 6 +
です。
parsing - 文法と演算子結合性の関係
いくつかのコンパイラの本/記事/論文は、文法の設計とその演算子の結合性の関係について語っています。私はトップダウン、特に再帰降下パーサーの大ファンであり、これまでに書いたほとんどの (すべてではないにしても) コンパイラーは、次の式の文法を使用しています。
これは、この BNF の EBNF 表現です。
私が読んだことによると、演算子の結合性 (これらの 4 つの演算子は左から右) の変更により、この文法が「間違っている」と見なす人もいます。これは、解析ツリーが左ではなく右に成長することによって証明されています。属性文法を介して実装されたパーサーの場合、l-attribute 値ではこの値が最初に作成されてから子ノードに渡される必要があるため、これは当てはまります。ただし、通常の再帰降下パーサーで実装する場合、最初にこのノードを構築してから子ノードに渡す (トップダウン) か、最初に子ノードを作成してから、戻り値をこのノードの子として追加する (渡される) かは私次第です。このノードのコンストラクターで) (ボトムアップ)。この文法が「間違っている」という声明に同意しないため、ここで見逃しているものがあるはずです この文法は多くの言語で使用されています。ワーシアンのもの。通常 (またはすべて?) LL ではなく LR 解析を促進するという読み方です。
c - インクリメント前とインクリメント後の演算子の関連性の問題:(
1の出力を取得しています!! およびgccで4。私はubuntulinuxを使用しています
c - C における演算子の優先順位
誰かがこれがどのように評価されるか説明できますか? 私が最も混乱しているのは!
、3の前の記号です...評価方法は2 > !3
?
scala - 逆結合インフィックス表記を使用したカリー化された関数の部分適用の構文
言い換えれば、これがコンパイルされるべきではない正当な理由はありますか?
以下にいくつかの回避策を示します。
しかし、私の質問は主に一般的な適切な構文に関するものです。
c++ - iostream の挿入子と抽出子は、グローバル オーバーロードの代わりにクラス メンバーにすることができますか?
シリアライゼーションを行うために「グローバルフレンド演算子のオーバーロード」を宣言しなければならないことは、いつも面倒だと思いました。クラスの外でシリアライゼーション演算子を宣言しなければならないことは、基本的なことではないように思われました。だから私はその理由についての確かな答えを探していました。
(注:すでに書かれた良い答えを見つけるために誰かがより良いGoogle-Fuを持っているなら、私はそれを読むことに興味があります。)
私が疑っているのは、技術的に可能であり、表記上の問題にすぎないということです。ライブラリが<<
andのメンバー オーバーロードを行うように設計されてい>>
た場合、左から右ではなく、右から左への一連のストリーミング操作を作成する必要があります。したがって、書く代わりに:
出力行を次のように記述する必要があります。
>>
および<<
左から右に関連付けるため、後方連鎖を開始するには括弧が必要です。r >> "Your rational number is "
それらがなければ、 before に一致するものを見つけようとします"Your rational number is " >> cout
。右から左への結合性を持つ演算子が選択されていた場合、これは回避できます。
(注: ライブラリ内では、文字列リテラルのような非クラス型は、グローバル演算子のオーバーロードで処理する必要があります。)
しかし、それが限界なのでしょうか? クラスにシリアライゼーションをディスパッチする必要がある iostream スタイルの設計では、この逆転はほとんど避けられないのでしょうか? 私は他の問題を見逃していますか?
更新おそらく「問題」のより良い言い回しは、私が次のことを疑うようになったと言うことです:
自分自身をシリアライズしたい非ストリーム オブジェクトの場合、iostream ライブラリは、挿入子と抽出子がグローバル オーバーロードの代わりにクラス メンバーになるように、仮説的に設計されている可能性があります...そしてランタイム プロパティに (大幅に) 影響を与えません。しかし、これは、iostream の作成者がクライアントに右から左へのストリーミング操作を強制することを受け入れる意思がある場合にのみ機能します。
しかし、オペレーターとメンバーをグローバルにオーバーロードすることで、(右から左ではなく) 左から右に自分自身を表現する、それ以外の場合はロック解除可能な機能をロック解除できる理由について、私は直観に欠けています。問題は、後知恵、テンプレート、または C++11 のいくつかの難解な機能が代替手段を提供できるかどうかです。または、「C ++の物理学」には、ある方向に対して別の方向に固有のバイアスがあり、グローバルなオーバーロードは、それをオーバーライドするための本で唯一のコンパイル時のトリックです。
c - C の結合性と優先順位
i) if(0) とはどういう意味ですか?
どのような出力が得られるかをテストするために使用するたびに、偽の部分が返されます。
真の部分が評価される場合は、if(0 == 0) と同等ですか。
ii) 論理 NOT の結合性 ! 右から左です。
リンク: http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode94.html
論理演算子のリンクの 2 番目の例:
しかし、「モナド .NOT. を含む 2 つの部分式が最初に効果的に評価されます。左端に .NOT.A が最初に実行され、続いて .NOT.E. が実行されます」という行に従って、左の NOT が評価されます。最初ですが、最初に評価されるのは右側のものです...???