2

すべてのプログラミング言語がキーワードを予約しているかどうか疑問に思っていますか? はIfWhile予約済みのキーワードです。私が持っている場合は、通常の変数または関数名として使用しないでくださいIf = 3。そのため、コンパイラは sanner フェーズでエラーを生成します。Ifプログラマーが変数名や関数名などの予約済みキーワードを使用できる言語の場合はどうなるでしょうか。コンパイラはこれをどのように処理できますか? これはスキャナーまたはパーサーで処理されますか? セマンティック分析は何をすべきか?

更新: これは良い習慣ではないことは理解していますが、ほとんど/すべてのプログラミング言語がこれをサポートしていない本当の理由は、スキャナーまたはパーサーが言語を正確にスキャンしたり、言語を解析したり、または実際に背後にあるものを実行できないためです? ありがとう。

4

6 に答える 6

5

確かにそのようなことはできますが、ソース コードの直感性が損なわれることは明らかです。これを想像してください:

if if == 1

実際に実装する限り、レクサーを変更する必要はまったくありません。レクサーがソースの「if」に一致する場合、IFタイプを持つトークンを返します。次の割り当てステートメントがあるとします。ここifで、 は変数名で、値 1 が割り当てられています。

if <- 1;

パーサーに供給されるレクサーのトークン ストリームは次のとおりです。

IF, LARROW, INTLITERAL, SEMICOLON

割り当てステートメント (\w integer rvals) を記述するために、次のプロダクションを使用できます。

assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}

LARROWIDIFINTLITERAL、およびSEMICOLONはターミナルであり、レクサーによって返されるトークンでありassignStmt、 、id、およびintExprは非ターミナルです。ID識別子を表します (例: クラス/変数/メソッド名)。

if ステートメントの生成に失敗した後、最終的に代入ステートメントの最初の生成に入ります。id唯一のプロダクションが である非ターミナルを展開しIDますが、一致させたいトークンはIFであるため、assignStmtプロダクションは完全に失敗します。

私の言語で変数に「if」という名前を付けられるようにするために必要なことは次のとおりです。

assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}
     |IF {: RESULT = "if"; :}

|非端末の代替プロダクションを定義することに注意してください。id現在のトークンに一致する非終端記号の2 番目の生成があり、最終的に割り当てステートメントに一致します。

AssignmentStatementは、次のように定義された AST ノードです。

class AssignmentStatement {
     String varName;
     int intVal;
     AssignmentStatement(String s, int i){varName = s; intVal = i; }
}

ソースが構文的に正しいとパーサーが判断すると、他に影響はありません。変数の名前は、コンパイルの後半の段階に影響を与えるべきではありません。つまり、それを可能にする条件を作成しない場合です。

于 2012-04-16T01:23:50.303 に答える
1

いったいどうしてできたとしてもやりたいの?

それができるのは、保守不可能なコードを作成することだけです。

if (a==b)if--if式またはブール引数を渡す関数の呼び出しですか?

いずれかの言語でそれが可能になったとしたら、それはおそらく3人のユーザーがいる奇妙な学術的なことでしょう。

[3人のユーザーからの容赦ない炎に備えてアスベスト下着を着用する;-)]

于 2012-04-15T23:57:13.037 に答える
1

パーサーの前に字句スキャナーを配置するのが好きなため、プログラミング言語には予約語が含まれる傾向があります。レキシカル スキャナはソース コードを一連のトークンに変換するため、最終的に ">>" トークンになり、そのようなトークンはすべてシフト演算子であると言うことができます。トークン (引用符で囲まれた文字列など)。これは、C++ でよくある問題です。「if」などの他の単語も同じで、ある種の「if」トークンに変換され、パーサーが「if」トークンを検出すると、それを何らかの条件構造の最初の部分として扱います。別の例は、次のように記述できる JavaScript です。

JSON.stringify({バー:2})

しかし、あなたは書くことができません

JSON.stringify({var:2})

「var」は「var」トークンですが、「bar」は他の識別子と同じです。

于 2012-04-16T00:29:30.137 に答える
0

任意のキーワードを許可する1つの方法は、すべての非識別子構文変数に非アルファベット記号を使用することです。APLはこのアプローチを採用しており、間違いなくSmalltalkも同様です(Smalltalk-80には6つの予約語がありますが、それらはすべて変数のようなセマンティクスを持っています。条件などの通常はキーワードであるものは、構文的に通常のメッセージです)。

于 2012-04-16T08:36:29.787 に答える
0

ええと、予約語なしでコンパイルされた言語を考えることはできません。それは単にはるかに便利であり、それらの予約されたキーワードを使用する正当な理由はめったにありません(「if」は適切な変数名ではありません)。

PHPでは、変数はドル記号で始まるものとして使用されるため、言語はそれをそのように実装できると思います(非文字を使用して変数のプレフィックスを付け、$ ifを使用できるようにします)。私はそれを機能させることができると思いますが、これもそうすることはあまり役に立ちません。

于 2012-04-15T23:56:44.607 に答える
-1

そのような言語は存在しないと思います。すべての情報言語は、文法、つまり、コードをどのように構築する必要があるかを示す一連のルールに基づいています。このようにして、コードが構造的に有効であることを証明できます。必要に応じて名前の切り替えを許可する場合は、コードの検証が正しく行われるように、「オンザフライ」で文法を変更する方法が必要になります。

より実用的なレベルでは、なぜそのようなことをわざわざするのですか?予約キーワードの何が問題になっていますか?それらは本当に便利です、少なくとも誰もが同じ方法で同じ言語を話します。実世界の言語ではそんなことは考えられないでしょう...意味のある単語を切り替え始めたら想像してみてください!もう誰も何も理解しないでしょう!

于 2012-04-16T00:02:16.630 に答える