メタ構文とは、プログラミング言語または形式言語の構文を定義するために使用される構文です。メタ構文は、自然言語またはコンピュータプログラミング言語のいずれかを記述するために使用されるメタ言語の句と文の許容される構造と構成を記述します。[ 1 ]コンピュータ言語で広く使用されている形式メタ言語には、バッカス・ナウア記法(BNF)、拡張バッカス・ナウア記法(EBNF)、ワース構文記法(WSN)、拡張バッカス・ナウア記法(ABNF)などがあります。
メタ言語はそれぞれ独自のメタ構文を持ち、各メタ構文は終端記号、非終端記号、およびメタ記号から構成されます。単語やトークンなどの終端記号は、定義される言語における独立した構造です。非終端記号は構文カテゴリを表し、n個の要素からなる部分集合で構成される1つ以上の有効な句構造または文構造を定義します。メタ記号は、特定のメタ構文において、指示的な目的のための構文情報を提供します。終端記号、非終端記号、およびメタ記号は、すべてのメタ言語に共通して適用されるわけではありません。
一般的に、トークンレベル言語(正式には「正規言語」と呼ばれる)のメタ言語には非終端記号がありません。これは、これらの正規言語ではネストが問題にならないためです。特定の言語を記述するためのメタ言語である英語にはメタシンボルは含まれていません。これは、すべての説明を英語の表現で行うことができるためです。再帰言語(正式には文脈自由言語と呼ばれる)を記述するために使用される特定の形式的なメタ言語のみが、メタ構文に終端記号、非終端記号、およびメタシンボルを含んでいます。
"else"、、、"if""then""while"<int>、、<char><boolean>:=、、、、、|{}()[]*A BA|B{A B}[A B](A|B)::=規則において、終端記号はメタ記号の左側に現れることはありません。右側の定義本体は、複数の代替形式で構成することができ、各代替構文構造はメタ記号で区切られます。これらの代替構造はそれぞれ、終端記号または非終端記号のいずれかになります。|=。また、すべての非終端記号を明示的に定義する必要もありません。やなどの非終端記号は、<text>それぞれ<opt-whitespace>ASCII文字と省略可能な空白文字として暗黙的に定義されます。%、その後にbまたは、xまたはd、その後に数値またはで区切られた数値の連結.。メタシンボルは、値の範囲-を表すために2つの数値の間に配置されます。BNFと同様に、ABNFの終端記号は、導出規則のメタシンボルの左側には決して現れません。メタシンボルは、交替を表します。定義本体の要素を区切るために空白が使用されます。ABNFの繰り返しに関するメタ構文には、いくつかの形式があります。要素の前に があると、その要素は0回以上繰り返されます。数値n1、その後に、続いて数値n2、さらにその要素があると、その要素は少なくともn1回、最大n2回繰り返されます。要素の前に単一の数値n を付けると、その要素がn回繰り返されることを示します。メタシンボルの後にコメントを記述できます。EBNF と同様に、句を角括弧で囲むと、その句は省略可能であることを示します。=/**;これらの形式メタ言語のメタ構文規約はまだ形式化されていません。さまざまなコンピュータプログラミング言語のリファレンスマニュアルには、多くのメタ構文のバリエーションや拡張が存在します。非終端記号と終端記号を表す標準的な規約のバリエーションの1つは、山括弧や引用符などのメタシンボルを削除し、意図した単語にフォントタイプを適用することです。たとえば、Adaでは、構文カテゴリは、意図した単語またはシンボルに小文字のサンセリフフォントを適用することによって示されます。Adaのすべての終端単語またはシンボルは、コード位置が16#20#から16#7E#(両端を含む)の文字で構成されます。各文字セットの定義は、ISO/IEC 10646:2003で説明されている国際規格を参照します。CとJavaでは、構文カテゴリはイタリックフォントを使用して示され、終端記号はゴシックフォントで示されます。Jでは、そのメタ構文はJの構文を記述するためにメタシンボルをまったく適用しません。むしろ、すべての構文の説明は、英語に非常によく似たDictionaryと呼ばれるメタ言語で行われ、これはJ用に独自に文書化されています。
新しい拡張機能の目的は、よりシンプルで曖昧さのないメタ構文を提供することです。シンプルさという点では、BNFのメタ表記は、開始記号と終了記号が多すぎるため、メタ構文の読みやすさを向上させるのに役立っていません。曖昧さという点では、引用符、アポストロフィ、小なり記号、大なり記号が終端記号として使われる場合(実際によく使われます)、BNFのメタ表記は不必要な複雑さを生み出します。拡張されたメタ構文は、文字の大文字小文字、フォント、コード位置などのプロパティを利用して、前述の不必要な複雑さを軽減します。さらに、一部のメタ言語は、レイアウト規則のためのメタ構文機能を組み込むためにフォント付き区切りカテゴリを使用しますが、これはBNFでは正式にはサポートされていません。