問題タブ [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.
parsing - 左結合演算子の BNF 文法
左結合演算子を使用した単純な算術式には、次のEBNF文法があります。
演算子の結合性を変更せずに、これをBNF文法に変換するにはどうすればよいですか? 次の BNF 文法は、演算子が右結合になっているため、うまくいきません。
ウィキペディアは次のように述べています。
いくつかの解決策は次のとおりです。
- 再帰的なままになるように文法を書き直すか、または
- 正しい優先順位/結合性を強制するために、より多くの非終端記号で文法を書き直すか、または
- YACC または Bison を使用している場合は、%left、%right、および %nonassoc という演算子宣言があり、パーサー ジェネレーターにどの結合性を強制するかを伝えます。
しかし、文法の書き直し方については書かれておらず、YACC や Bison などの解析ツールは一切使用せず、単純な再帰降下のみを使用しています。私が求めていることは可能ですか?
programming-languages - 結合性が演算子の基本的なプロパティであり、優先レベルのプロパティではない理由
どのプログラミング言語の教科書でも、その言語の各演算子がどのように左結合性または右結合性を持っているかについて常に説明されています。結合性は、オペランドの数に関係なく、すべての演算子の基本的なプロパティのようです。また、結合性を他の演算子に割り当てる方法に関係なく、任意の結合性を任意の演算子に割り当てることができるように思えます。
しかし、なぜそうなるのでしょうか?おそらく、例の方が良いでしょう。架空のプログラミング言語を設計したいとします。この任意の方法でこれらの演算子に結合性を割り当てることは有効ですか (すべて同じ優先順位を持つ):
! + - * / は、すべて同じ優先順位を持つ 5 つの演算子です。
はいの場合、2+2!3+5*6/3-5!3!3-3*2 のような式は、仮説パーサーによってどのように括弧で囲まれますか? なぜ。
編集:
最初の例 (2+2!3+5*6/3-5!3!3-3*2) は正しくありません。おそらく単項演算子を忘れて、このように言えば、上記の方法のように、同じ優先順位の異なる結合性を持つ演算子を割り当てることができますか? はいの場合、たとえば 2+3-4*5/3+2 はどのように評価されますか? ほとんどのプログラミング言語は、同じ優先順位を持つ演算子に同じ結合性を割り当てるように見えるためです。しかし、OPERATOR ASSOCIATIVITY については、優先順位のプロパティではなく、個々の演算子のプロパティであるかのように常に話します。
c++ - C/C++ における演算子の優先順位と結合性
これは演算子の優先順位とは何の関係もないことに注意してください.. () と ++ 、未定義の動作とシーケンス ポイント、なぜこれらの構造 (++ を使用) は未定義の動作なのですか? これに関する何百もの同様の質問がここにあります
簡単に言うと、結合性は標準で保証されていますか?
詳細な例:ウィキペディアの演算子の優先順位に関する記事から、同じ優先度operator*
をoperator/
持ち、それらはLeft-to-right
演算子です。これは、標準が次のことを保証することを意味しますか?
として評価されます。
それとも実装定義ですか?
保証されている場合、引用していただけますか?
好奇心からです。これらの場合は常に括弧を書きます。
そのような質問があれば、削除する準備ができています。
parsing - LR(0) パーサーの後置演算子と右結合演算子
前置演算子と後置演算子の両方を使用して言語を解析できる LR(0) パーサーを構築することは可能ですか? たとえば、 + (足し算) と ! を使った文法があるとします。通常の優先順位の (階乗) 演算子、次に 1+3! 1 + 3 である必要があります。= 1 + 6 = 7 ですが、確かにパーサーが LR(0) の場合、スタックに 1+3 があった場合、シフトではなく減少しますか?
また、正しい連想演算子は問題を引き起こしますか? たとえば、2^3^4 は 2^(3^4) である必要がありますが、パーサーがスタックに 2^3 を持っている場合、どのようにして削減またはシフトを知るのでしょうか?
これが不可能な場合、おそらく文法を変更して適切な場所に括弧を追加することにより、LR(0) パーサーを使用する方法がまだありますか?
c - このコードの演算子の結合性を説明してください
output: 11 99
出力について説明してください。アドレスにインクリメントがあるのはなぜですか?
c++ - 単項演算子が結合的であることは理にかなっていますか?
http://en.cppreference.com/w/cpp/language/operator_precedenceの C++ 演算子の優先順位テーブル(規範的ではないことはわかっていますが、標準では優先順位や結合性については言及されていません) は、単項演算子を右/左結合としてマークします。 .
別の質問に関する議論から、私には疑問が残ります。単項演算子が結合的であることは理にかなっていますか?
c++ - 関数の適用は左に関連付けます
この表によると、関数の適用は左側に関連付けられます。どういう意味ですか?のように二項演算子が複数回現れる場合、結合性は重要a - b - c
です。それは関数の適用にどのように関連していますか? 代わりに右に関連付けられている場合、関数の適用はどのように異なりますか?
c++ - C / C ++演算子の優先順位と結合性の規則に違反したことはありますか?
C / C ++式で演算子の優先順位と結合性の規則に違反したことはありますか?
もしそうなら、例を挙げていただけますか?
優先順位と結合性のルールの主張は次のとおりであると想定します。
各演算子には特定の優先順位レベルがあり、各優先順位レベルには特定の結合性があります。部分式がオペランドを期待する2つの演算子によって見られる場合、それは優先順位の高い方に属します。結合は結合性によって切断されます。
編集:背景
この標準では、C / C ++式をCFGとして定義しています。これは、優先順位ベースのパーサーよりもはるかに柔軟性があります。たとえば、二項演算子に非対称の「優先順位」を与えることができたため、優先順位テーブルが正しくなくなりました。しかし、文法の設計は単純な優先順位規則を支持するように制約されていたように私には思えます。これが私が出くわしたいくつかの疑わしい「反例」です:
1) a?b,c:d
は次のように解釈されません(a?b),(c:d)
たとえば、はとして解釈されない?:
ため、演算子は他のオペランドとは異なる優先順位を中間オペランドに対して示すと主張する人もいます。ただし、内部オペランドとして表示される位置を占めることもありません。その推論によって、ばかげていると解釈されるべきです。a?b,c:d
(a?b),(c:d)
b
c
?:
a[b+c]
(a[b)+(c])
2) ではなくsizeof(int)*a
として解釈されます(sizeof(int))*a
sizeof((int)(*a))
... Cは、括弧で囲まれていないキャストをsizeofの演算子として許可しないためです。ただし、これらの解釈は両方とも優先順位規則に準拠しています。混乱は、*
演算子のあいまいさから生じます(それは2進演算子ですか、それとも単項演算子ですか?)。優先順位テーブルは、演算子のあいまいさを解決するためのものではありません。結局のところ、これらは演算子記号の優先順位テーブルではありません。したがって、演算子の優先順位ルール自体はそのままです。
3) a+b=c
セマンティックエラーではなく、構文エラーが発生します
a+b=c
、標準によれば、無効なC構文です。Cに優先順位ベースのパーサーがあった場合、セマンティックレベルでのみキャッチされます。Cでは、単項式ではない式をl値にすることができない場合があります。したがって、これらの意味的に運命づけられたLHS式は、構文的に対応する必要はありません。言語全体に違いはなく、優先順位テーブルは、式から生じるエラーの構文/構文性を予測するためのものである必要はありません。
list - Haskell初心者:カリー化/リスト結合性
Learn You a Haskell から:
このリストについて考えてみましょう:
[5]
. それは単なる構文糖衣です5:[]
。の左側に:
値があります。右側にリストがあります。この場合、それは空のリストです。リストは[4,5]
どうですか?さて、それは に脱糖し4:(5:[])
ます。最初の : を見ると、左側に要素があり、(5:[])
右側にリスト , もあります。 のようなリストにも同じことが言えます。これは、そのように、または(右結合であるため)3:(4:(5:6:[]))
または のように記述できます。3:4:5:6:[]
:
[3,4,5,6]
太字の部分については、成長するリストが3:(4:(5:(6:[])))
. これは、カリー化、結合性、またはその両方に対する私の理解不足と関係があります。誰かが私の考えの欠陥を教えてもらえますか?