プログラミング言語/文法仕様

出典: フリー教科書『ウィキブックス(Wikibooks)』

言語を記述する方法には、構文( syntax )で記述する方法と意味論( semantics )で記述する方法があります。言語の構文は、その言語に属する文字列(文章( sentence )や文( statements ))を定義する一連の規則で、言語の意味論は、与えられた文の意味を記述するものです。

プログラミング言語の文法仕様[編集]

字句とトークン[編集]

言語の場合、文を字句の一連の並べに分解できます。これは、言語の分解不可能な構成要素です。 たとえば、次のPerlの文は

do { sleep 1; } while (++$i < 10);

次の字句を含みます。

do, {, sleep, 1, ;, }, while, (, ++, $i, <, 10, ) そして ;

字句はカテゴリーにグループ化することができます。このようなカテゴリーをトークン( token )といいます。

文脈自由文法[編集]

  • Backus-Naur Form(BNF)
  • Arithmetic grammar
  • Unary negation (~)

構文解析木[編集]

  • 指数などを使用した複雑な数式の解析ツリー

拡張バッカス・ナウル形式[編集]

拡張バッカス・ナウル形式( Extended Backus-Naur Form )は、言語の構文を正確に指定するための方法であることを意図しています。言語を記述するための言語であるという点で、メタ言語であると言えます。また、コマンドの使い方やヘルプの文書でよく使われているのを見かけます。

EBNFの完全なドキュメントは、ここにあります。

[1].

言語の基本要素はEBNFの終端記号で記述し、それを非終端記号でまとめて言語全体の論理的な上位表現とします。終端記号は、言語の変数名の適切な構文や、数字を表現するために使われます、実際に有効な文字パターンを指定します。非終端記号は、与えられたもの(例えば、10進数、16進数、科学的記数法の数値定数)のさまざまな可能な表現を、1つの論理的なもの([Numerical_Constant])にまとめます。最終的には、さまざまな構文要素を積み重ね、それらの組み合わせ方を表現することで、その言語のプログラムを表す記号ができあがります。

いくつかの例は awk ユーティリティのマニュアルページにあります。

[2] より抜粋したものです。)

まず、その使用方法です。

awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]

大括弧の中の項目は EBNF の例で、awk のコマンドラインで使用するオプションのパラメータを示しています。

次に、使用法の詳細部分は部分的に EBNF で指定されています。

下の例では、'pattern', 'action', 'expression', 'statement' といった単語が EBNF の非終端記号になっています。

pattern-action文は次のような形式です。

pattern { action }

{ action } がない場合は、その行を表示します。パターン-アクション文は、改行またはセミコロンで区切られます。

アクションは、一連のステートメントです。ステートメントは、次のいずれかになります。

if( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression              # commonly var = expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next                    # skip remaining patterns on this input line
nextfile                # skip rest of this file, open next, start at top
delete array[ expression ]# delete an array element
delete array            # delete all elements of array
exit [ expression ]     # exit immediately; status is expression

文はセミコロン、改行、右中括弧で終端します。

言語全体がEBNFで文書化されることもあります。以下のリンクはC++のANSI定義を文書化したものですが、この文書の多くの部分はEBNFで書かれています。

[3]