12

intC# では、やなどの識別子stringは、実際には言語レベルのキーワードです。
その理由は何ですか?

作成者がこれらの名前を持つユーザー型を禁止したい場合、構文エラーではなく、セマンティック エラーになる可能性があることに注意してください。

回答に基づくいくつかの説明:

  1. パーサーを開発しているので、構文解析が可能/簡単になるため、それらはキーワードです。理由はわかり
    ません。Type.Rule = IdentifierType.Rule = Identifier | "int" | "string" | ...

  2. それらは特別なエイリアス
    varでありdynamic、特別なものであるためキーワードですが、キーワードではありません (互換性の理由から、キーワードであることが特別である必要がないことを示しています)。別の例では、型に適用すると、標準のカスタム属性ではなく[Serializable]魔法の IL メタデータ修飾子が生成されます。serializableしかし、それはまだキーワードではありません。

  3. それらは他の言語のキーワードだったのでキーワードです
    良い答えですが、なぜ他の言語のキーワードなのですか? また、キーワードでなくても青色で強調表示することは確かに可能ですが、なぜ他の言語からそれを持ち込むのでしょうか?

4

3 に答える 3

3

私が学んだほとんどの言語: C、C++、Java、Pascal、C#。よくわかりませんがCompiler Design、大学で学んだクラスによると (このコースでは、人々がどのようにコンパイラーを作成し、段階的に独自のコンパイラーを実装するかを学びます)、あなたの質問の主な理由は次のとおりです。 at字句解析

コーディングする場合、すべてのコードは単純な文字列にすぎませ。コンパイラは、実際にコンパイルする前に多くのフレーズを実行する必要があります。

たとえば、次のように入力すると:

int a = 5;

最初のフレーズは字句解析で、以下のような辞書を提供し、パーサー pharseに送信する必要があります。

    int ---> identifiers
    a   ---> Variable
    =   ---> Operator(=)
    5   ---> Integer
    ;   ---> ;

そして、これをどのようにLexical Analysis知るか:最初に、辞書のテーブルを作成し、入力した文字列を検索します。最初のトークナイザーが出会うと、それは停止し、そのトークナイザーを受け取ります。(重要です!)

このような辞書:

if   ---> if
then ---> then
int  ---> int
.... // all keywords here
[a-z][a-z0-9_]* ---> variable  // example of regular expression :  I don't sure it's true, just something like this :D

そのため、言語で int を変数と同じように指定できる場合。そのような :

int int = 5;

上記のメソッドlexical analysis壊れています。 second を読み取るとint、それが変数またはキーワードであることを認識せず、それを判断するためのより複雑な手順が必要になります。

できないとは言いませんが、コンパイルするときはより複雑で遅くなり、コンパイルする必要はありません。プログラマーに簡単に言ってください:

これが役立つことを願っています:)

于 2012-07-21T11:01:50.523 に答える
3

私が読んだ限りでは、C# の設計者は、C スタイルの言語で通常行われている典型的な型名、つまりstring、などを許可したいと考えてintいました。同時に、これらの各型には、System.Stringやなどの完全修飾型名が必要System.Int32です。したがって、これらの頻繁に使用される型のエイリアスを提供することにしました。

この声明のソースを再度見つけたら、リンクを追加します。

他の CLI ベースの言語では、同じ完全修飾型識別子が有効です。intただし、またはなどの型名はそのstringような言語では一般的ではない可能性があるため、他のエイリアスが提供される場合があります。

型エイリアスを使用する利点の 1 つは、読みやすさの向上です。これが、通常の型名よりもエイリアスの使用を強制するStyleCop ルールがある理由です。簡潔さについてのポイントは、同じトピックのこのスレッドでも言及されています。

于 2012-07-21T10:28:07.493 に答える
1

これはint、C# 言語に組み込まれているその他の特別な値の型が、実際には型ではなく、.NET Framework システムの型のエイリアスであるためです。

これがセマンティック エラーではなく構文エラーである理由は、単純に、セマンティック エラーの前に発生する構文エラー検出フェーズでエラーが検出されるためです。構文エラー検出には、 が型として使用されているか、それ以外として使用されているかを判断するために必要なすべての情報が含まintれています。次のルールがあるとします。

declaration = type identifier ;

構文フェーズでは、識別子が [aZ]([aZ]+ | [0-9]+)+ であり、予約済みのキーワードまたはエイリアスではないかどうかを確認します。したがって、これを構文エラーと呼ぶのは理にかなっています。

于 2012-07-21T10:24:53.567 に答える