削除された内容 追加された内容
Melan (会話 | 投稿記録)
m 曖昧さ回避ページ演算へのリンクを解消、リンク先を演算 (数学)に変更(DisamAssist使用)
 
(8人の利用者による、間の8版が非表示)
1行目:
{{Infobox notation
| logo=[[Image:Infix-dia.svg|125px]]
}}
'''中置記法'''(ちゅうちきほう、<em lang=en>infix notation</em>)とは、数式やプログラムを記述する方法(記法)の一種。[[演算 (数学)|演算子]]を操作対象の中間に記述することから、このように呼ばれる。
 
その他の記法として、演算子を操作対象の前(左)に記述する'''[[ポーランド記法|前置記法]]'''(ポーランド記法)、演算子を操作対象の後(右)に記述する'''[[逆ポーランド記法|後置記法]]'''(逆ポーランド記法)がある。
 
一般に、四則演算など初歩的な[[算]]においては[[数学]]教育ではもっぱら中置記法がされてられことが多い
 
== 概要多義性 ==
次のような[[バッカス・ナウア記法|BNF]]の構文規則群で定義される中置記法の文法について考える。
:<math>x \star y</math>
 
<expr> = <infix> | <num>
前置記法や後置記法に比べれば、式が表す意味を一意に確定するためのデリミタ(補助的な括弧など)が多用されなければならないなど、構文解析が比較的複雑になる。例えば[[結合法則]]の成り立たない場合に、演算の入れ子を中置記法で表すと、オペランドが四つなら
<infix> = <expr> <op> <expr>
:<math>(a\star b)\star(c \star d),\ a\star(b\star (c \star d)),\
<num> = 0 | 1 | 2 | 3 | 4 | ...
a\star((b\star c)\star d),\ (a\star(b\star c))\star d,\
<op> = + | - | × | ÷
((a\star b)\star c)\star d
 
</math>
この文法には多義性(ambiguity。[[曖昧]]さ、とも言うが、「曖昧」という語には「輪郭がはっきりしない」というような意味もあるがそちらの意味ではない)がある(「[[曖昧な文法]]」の記事を参照)。たとえば、
などはどれも異なる可能性をもつため個別に調べなければならず、結合的でない演算ではオペランドの数が増えるほどに入れ子構造が組合せ論的にかなり増大することが見て取れる(結合的演算なら全て同じである)。複数の演算を同時に扱うときは、デリミタの代わりに演算子に優先順位(例えば [[乗算|&times;]] は [[加算|+]] より先に計算を行うなど)を与えておく場合もある。
 
"1 - 2 + 3"
 
が、この構文規則からは「(1 - 2) + 3」と「1 - (2 + 3)」の、どちらに相当する[[構文木]]にも[[構文解析]]できてしまう。
 
加算のような[[結合法則]]の成り立つ演算だけが対象である場合など、むしろ便利である場合もあるが、一般の場合には補助的なカッコを多用して明示するなどの必要がある。算術の四則演算では、加減算の両方が使われている場合などについて、左から右という規則で意味の一意化が図られている。また、カッコの省略を意図して、加減算に対する乗除算の優先という規則も、もっぱら付加される。
 
[[yacc]]などでは、BNFによる定義に、さらに「[[演算子の優先順位]]」と「演算子の結合性」([[結合法則#プログラミング言語]]を参照)に相当する規則を付加することができ、これは大変に使い良い機能である。特に(yaccは違うが)[[再帰下降構文解析]]など[[LL法]]の構文解析では、四則演算の式のような左から右の順をナイーブに実装すると[[左再帰]]の問題があるので、問題を避けて簡潔に定義する方法があると良い。
 
== 関連項目 ==
25 ⟶ 35行目:
[[Category:プログラミング言語の構文]]
[[Category:数学に関する記事]]
 
[[cs:Infixová notace]]
[[de:Infixnotation]]
[[en:Infix notation]]
[[es:Notación de infijo]]
[[eu:Artizki notazio]]
[[hr:Infiksna notacija]]
[[it:Notazione infissa]]
[[simple:Infix notation]]
[[sr:Инфиксна нотација]]
[[zh:中缀表示法]]