言語の文法をどのように説明すればいいのだろうか。規格では、Syntax Notationという記法を用いている。当初、これを使えばいいのではないかと思ったが、これは、あまりにも、普通のユーザーには不向きだ。
たとえば、整数リテラルのSyntax Notationは、いかに正しいとはいえ、こんな記述は、Language Lawyerでなければ、読む気がしないだろう。
integer-literal:
decimal-literal integer-suffixopt
octal-literal integer-suffixopt
hexadecimal-literal integer-suffixopt
decimal-literal:
nonzero-digit
decimal-literal digit
octal-literal:
0 octal-literal octal-digit
hexadecimal-literal:
0x hexadecimal-digit
0X hexadecimal-digit
hexadecimal-literal hexadecimal-digit
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
octal-digit: one of
0 1 2 3 4 5 6 7
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffixopt
unsigned-suffix long-long-suffixopt
long-suffix unsigned-suffixopt
long-long-suffix unsigned-suffixopt
unsigned-suffix: one of
u U
long-suffix: one of
l L
long-long-suffix: one of
ll LL
しかし、たとえば、if文の場合(イタリック体などの修飾は省略)、
if ( condition ) statement if ( condition ) statement else statement
このぐらいなら、使っても構わないだろう。あるいは、訳すか。
if ( 条件 ) 文 if ( 条件 ) 文 else 文
if文のような文であれば、別に、文法記法などといった、たいそうなものを使わなくても、サンプルコードひとつあれば、理解できるかもしれない。しかし、関数の宣言は、非常に厄介だ。
たとえば、関数の宣言は、T Dという形をとる。Dは、以下のようになる(文字の修飾は省略)。
D1 ( parameter-declaration-clause ) attribute-specifier opt cv-qualifier-seq opt ref-qualifier opt exception-specification opt
これは、この順番でなければならない。つまり、
struct Foo {
int // 戻り値の型
func // 関数名
(int x)// 仮引数の宣言句
[[]] // アトリビュート指定子
const // CV修飾子
& // リファレンス修飾子
throw() // 例外指定
}
もしこれらが、間違った順番であれば、文法違反である。
規格のSyntax Notationを使うべきか。あるいは、独自の文法記法を考えだすべきか。もし、規格の文法記法を使う場合、その文法カテゴリー(syntactic categories)、たとえば、parameter-declaration-clauseなどといったものは、翻訳するべきか。
現時点では、ユーザーにも分かる範囲の、規格の文法記法に準じた記法を使い、文法カテゴリーは、翻訳するべきであると考えている。つまり、関数の宣言の場合、T Dという形をとり、Dは、
D1 ( 仮引数の宣言句 ) アトリビュート指定子(省略可) CV修飾子(省略可) リファレンス修飾子(省略可) 例外指定(省略可)
となる。
たとえば、選択文の場合、
選択文:
if ( 条件 ) 文
if ( 条件 ) 文 else 文
switch ( 条件 ) 文
条件:
式
変数の宣言
となる。これは、普通のユーザーでも、理解できる範囲内だと思う。厳密には、条件(condition)は、以下のようになっている。
condition:
expression
type-specifier-seq attribute-specifier opt declarator = initializer-clause
type-specifier-seq attribute-specifier opt declarator braced-init-list
しかし、こんな文法記法が、一般に受け入れられるわけがない。変数の宣言は宣言で、また、別の場所で解説すればいいのだ。
No comments:
Post a Comment