2

中括弧を使用して配列ではない変数を初期化しようとすると、コンパイルエラーが発生します。Java文法変数宣言生成規則

例: "のjavac" を使用して

public class test1 { 
    public static void main(String[] args) { 

     double a = {1.5,6.3}; 

    } 
} 

、私はこのコンパイル・エラーが発生します:

test1.java:13: error: illegal initializer for double 
double a = {1.5,6.3}; 
     ^
1 error 

しかし、私はJavaの文法を勉強していると私は(The Java Language Specificationから)以下の作品が見つかりました:

VariableDeclarators: 
    VariableDeclarator 
    VariableDeclarators , VariableDeclarator 

VariableDeclarator: 
    VariableDeclaratorId 
    VariableDeclaratorId = VariableInitializer 

VariableDeclaratorId: 
    Identifier 
    VariableDeclaratorId [ ] 

VariableInitializer: 
    Expression 
    ArrayInitializer 

ArrayInitializer: 
    { VariableInitializersopt ,opt } 

これらのルールを使用すると、上のコードを正常にコンパイルできます(これを試しましたjflexと文法が指定された.cup仕様ファイルを使用するコンパイラ) これはなぜ可能ですか?私が無視するものはありますか?

ありがとうございます。

+0

@ElliottFrischこれは公式Java仕様の文法です。私はそれが間違っていないと推測できると思う。 – sepp2k

+0

@ sepp2k * * OPの(存在しない)実装を**意味する**は**不完全でなければなりません。 –

答えて

2

事は、はい、文法ですが、それは意味がありません。

「豚は空を飛んでいる」文法的な英語の文ですが、意味がありません。

文法的なJava文を作成しましたが、コンパイルは文法にマッチするだけではなく、型も一致する必要があります(他の多くのものの中で)。ここでは、=の左側がダブルタイプの変数で、右側がdouble[]の式です。 2つの型は暗黙的に変換可能ではないため、コードはコンパイルに失敗します。

正常にコンパイルするには、doubledouble[]に変更してみてください。 (それはパースエラーを生成したメッセージだろうjavacのエラーメッセージが言っていないことに注意してください 『[何か]期待』、)あなたは成功しあなたのコードを解析することができますので、javacできる文法で

2

。コンパイルには構文解析以外のことも含まれています。型チェックも含まれており、コードにチェックを入れないとコンパイルされません。

もう1つの例として、文法でもint x = "lala";を使用できます。あなたの例のように、これは正しく解析されますが、型チェッカーによって拒否されます。

プログラムの型が正しく指定されている場合の規則も、仕様の一部ですが、文法とは別です。これらのルールは、double a = {1.5,6.3};またはint x = "lala";のようなものを禁止します。

1

通常、コンパイラは、プログラムを有効なものとして受け入れる前に、3つの段階を経ます:語彙、構文、および意味。形式的文法仕様に従うコードは、字句的および構文的にのみであるが、必ずしも意味論的に有効であるとは限らない。この場合、スカラ変数に値のベクトルを割り当てる意味的な意味を持たないため、意味的に有効ではありません。