2010-01-02

C++規格におけるoperatorの優先順位の定義方法

ふと、C/C++の規格上は、どのようにoperatorの優先順位が定義されているのかということが気になった。そこで、調べてみた。

operatorはすべて、Expressionの下に配置されているが、どうやら、優先順位を示す表や、文章は見当たらない。しかし、何らかの方法で優先順位を定義しているはずである。

いくら探しても見当たらなかったので、何気なくふと、Grammar summaryを見たところ、なんと、Sytax Notationの形で、優先順位が定義してあった。

たとえば、

expression:
    assignment-expression
    expression , assignment-expression

となっている。では、assignment-expressionの定義はどうか。

assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator initializer-clause
    throw-expression

なるほど、ではlogical-or-expressionはいかに。

logical-or-expression:
    logical-and-expression
    logical-or-expression || logical-and-expression

このように定義されているのである。ちなみに、primary-expressionは、( expression )となっている。これで、括弧も定義されている。

なるほど、面白い定義のしかただ。

この方法は厳密だが、人間にとっては分かりにくい。C++0x本では、分かりやすく表にしようと思う。

ちなみに、この定義を見て始めて、Nicolai Josuttisの、Object-Orientend Programming in C++での、operatorの優先順位の表の意味が分かった。表が、濃い線と薄い線を使い分けているのは、そういう意味だったのか。ちなみに、この本は、C++の入門書として最適である。日本語に訳されていないのだが。

C++0x本では、規格に書いてあるSyntax Notationを用いようと思っている。他のパーフェクトシリーズは、【】なども駆使した、独自のSyntax Notationを編み出しているようだが、私は、規格に従おうと思う。ただし、規格にあるすべてのSyntax Notationは出さない。あくまで、個々の文法を説明するだけに留める。

3 comments:

Anonymous said...

誤字です。
誤:Object-Oritend Programming in C++
正:Object-Oriented Programming in C++

江添亮 said...

修正

Anonymous said...

別にC++の規格に限った話ではなく、文脈自由文法を採用しているプログラミング言語ではごく普通の定義の仕方ですね。ECMA-262でもC言語(++の付かない)でもそんな感じだし。