2012-10-23 12 views
17

言語設計者は、オプションの次のシナリオでは、中括弧を作るために選択した:Cスタイルの言語で関数の中括弧がオプションでないのはなぜですか?

if (a) 
    b 
while (a) 
    b 
... 

同じこのような関数で許可されていないのはなぜ?

int add(int a, int b) 
    return a + b; 
+0

おそらく、関数がその本体に何が具体的に含まれているかを知っている必要があります。 – Afaq

+0

関数または条件付き/ループ構造にかかわらず、中括弧は命令を編成する単なる方法なので、本体の長さと内容をコンパイル時に知っていなければなりません。 – sean

+2

この質問に対する回答はほとんど投機的であることが保証されています。これは話題にはなりません。 –

答えて

24

これは文法を混乱させるだろうと確信しています。

void empty(); 
+3

あなたはそれを釘付けにしました。 +1 –

2

私は推測していた場合、私は、関数が正常であればまたはwhile文のに対し、複数の文は、多くの場合、一つだけのステートメントが含まれている含まれているので、それはだと言うだろう。また、C++のように、{}の宣言がメンバ関数のあいまいさを引き起こすことを許して、長い目で見ていることが分かりました。例:

struct s 
{ 
    void f() const int i; //does const refer to int i or the function? 
} 
+0

その宣言は実際に何をしていますか? – djechlin

+0

@djechlin:{}は関数ではオプションではないため、コンパイラエラーが発生します。私の主張は、もしそうであれば、C++のあいまいさにつながるだろうということでした。ロバート・クーパーの答えは、それがCでもあいまいさを引き起こすことを示しています。 –

4

私は彼らがこれを「選択」したとは確信していません。むしろ、if、while、forなどの中かっこの中括弧は、文法を指定する自然な結果として出現します。文法は、おそらく古いスタイルの関数宣言のために関数のためにそれを禁じています。

3

関数定義に関連する固定キーワードはありません。 if/else/for/while/switchには、論理制御構造の先頭を示すキーワードが1つあります。

int some_name (some_expression) some_other_expressions;がどのように機能するのかを人間に見分けることはできますが、プログラミングの練習では(明らかに可能ですが)、トークンストリームの3-4-6シンボル先が何も変わらないことを確認するために多くのバックトラックが必要ですこれを関数宣言から別のものに移します。

プログラミング言語パーサーは、構文解析の手法によって分類することができます。トークンリストの現在のトークンを取り、次のトークンが「これはif」か「this is a function」を確認するか、最大ルックアヘッドトークン(2-3-6?)を確認し、「これは関数になる可能性がある」ことを確認します。「今度は5番目のトークンが確かに関数であることがわかりました」または可変ルックアヘッドアプローチ私たちが勉強している構築物が何か他のものではないことを確認するために、必要に応じてトークンリストの先に進んでいきます。

1

中括弧「「であれば」とのオプションのコンポーネントではありません:たとえば...

void empty() 
{ 
    ; 
} 

...と、この関数の宣言は、この空の関数定義の間に違いはないだろうif-else "制御ステートメントです。 "if"制御ステートメントのための文法上の生成は、1つの非終端記号がその式の後に続くことを可能にする。 "if-else"制御文の文法上の生成によって、1つの非終端記号が式に続き、1つの非終端記号が "else"終端記号に従うことができます。その非終端記号の名前は<ステートメント>です。制御構造(別名制御文)の文脈において

、中括弧(時々<ブロック>と称する)<化合物文>として知られている言語非終端記号に属しています。非終端記号<複合ステートメント>は、<ステートメント>の文法上のプロダクションの右側に現れます。そのため、中括弧を "if"および "if-else"制御ステートメント(つまり、コンパウンドステートメントは、ステートメントです)。関数宣言に関して

<statement> ::= <if-then-statement> | 
       <if-then-else-statement> | 
       <for-statement> | 
       <do-while-statement> | 
       ... 
       <compound-statement> 

<statement-list> ::= <statement> | <statement-list> <statement> 

<if-then-statement> ::= "if" "(" <expression> ")" <statement> 

<if-then-else statement> ::= "if" "(" <expression> ")" <statement> 'else' <statement> 

<compound-statement> ::= "{" <statement-list> "}" 

、<化合物ステートメント>非終端記号は<関数宣言>文法的生産の右側の最後の非終端記号です。

P.S.すべての非終端記号は文法上のプロダクションです。すべての文法的生成は、1つ以上の非終端記号および/または終端記号に還元される。ターミナルシンボルは言語キーワードです。

関連する問題