プログラミング言語で識別子にスペースを使用できないのはなぜですか?
-
05-07-2019 - |
質問
これは愚かな質問のように思えるかもしれませんが、それでも答えはわかりません。
プログラミング言語で名前にスペースを使用できないのはなぜですか(たとえば、メソッド名)
構文解析を容易にする(許可する)ことであり、スペースが許可されている場合は、ある時点で構文解析が不可能になることを理解しています。
今日では、 norm がスペースを表示しないようにしています。
たとえば:
object.saveData( data );
object.save_data( data )
object.SaveData( data );
[object saveData:data];
など
次のように記述できます:
object.save data( data ) // looks ugly, but that's the "nature" way.
解析のみの場合、識別子は。
と(
の間にある可能性があると思います。もちろん、手続き型言語では、 「。」はありませんが、オブジェクト指向は..
構文解析が唯一の理由なのか、それがどれだけ重要なのか(すべてのプログラミング言語がそうでない限り、そうすることは不可能だと思うデザイナーは...オプションを忘れる)
編集
一般的な識別子(fortranの例として)で大丈夫です。オブジェクト指向言語、具体的にはメソッドに絞って、私はそれがそうあるべき理由を理解していません(ないという意味ではありません)。すべての。
と最初の(
を使用できます。
そして saveData
メソッドを忘れて、これを考慮してください:
key.ToString().StartsWith("TextBox")
as:
key.to string().starts with("textbox");
解決
インタープリターまたはコンパイラーが解析ツリーを構築する前に、字句解析を実行して、文字のストリームをトークンのストリームに変換する必要があります。次の解析方法を検討してください。
a = 1.2423 /(4343.23 * 2332.2);
そして、上記のルールがどのように機能するか。トークンの意味を理解せずに語彙化する方法を知るのは困難です。同時に語彙解析を行うパーサーを構築するのは本当に難しいでしょう。
他のヒント
実際に難しい場合は、2つのメイクコードを使用してください。
ALGOL (1978年)の実装を使用しましたが、これは非常に迷惑です。 8212;現在予約語として知られているものを引用する必要があり、識別子に許可されているスペース:
"proc" filter = ("proc" ("int") "bool" p, "list" l) "list":
"if" l "is" "nil" "then" "nil"
"elif" p(hd(l)) "then" cons(hd(l), filter(p,tl(l)))
"else" filter(p, tl(l))
"fi";
また、FORTRAN(大文字の形式はF77以前を意味します)は、スペースにほとんど影響されませんでした。したがって、これは次のように記述できます。
799 S = FLO AT F (I A+I B+I C) / 2 . 0
A R E A = SQ R T ( S *(S - F L O ATF(IA)) * (S - FLOATF(IB)) *
+ (S - F LOA TF (I C)))
これは構文的には同一でした
799 S = FLOATF (IA + IB + IC) / 2.0
AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
+ (S - FLOATF(IC)))
そのような虐待の歴史があるのに、なぜ人間にとって構文解析が困難になるのですか?複雑なコンピューター解析は言うまでもありません。
はい、それは構文解析です-人間とコンピューターの両方です。空白は問題ではないと安全に仮定できる場合、読みやすく、解析しやすくなります。そうしないと、あいまいになる可能性のあるステートメント、物事がどのように組み合わされるかが明確でないステートメント、読みにくいステートメントなどが含まれる可能性があります。
このような変更は、多くの場合、曖昧な言語になります。たとえば、C99のような言語の場合:
if not foo(int x) {
...
}
は次と同等です:
-
ifnot
型の値を返すfoo
の関数定義:ifnot foo(int x) { ... }
-
intfoo
という名前の変数を使用したnotfoo
という関数の呼び出し:if notfoo(intx) { ... }
-
foo
と呼ばれる関数の否定呼び出し(C99のnot
は!
を意味します):if not foo(intx) { ... }
これは、あなたが遭遇するかもしれない曖昧さのほんの一例です。
更新: C99のような言語では、明らかに if
ステートメントの条件が括弧で囲まれていることに気付きました。空白を無視することを選択した場合、余分な句読点はあいまいさを解消するのに役立ちますが、通常は空白を使用するはずの場所で、言語に多くの余分な句読点があることになります。
Stroustrupの古典的な C ++ 2000のオーバーロードの一般化をご覧ください。
1960年代にファイル名にスペースを入れることは許可されましたが、コンピューターはまだうまく処理できません(すべてが壊れていましたが、ほとんどの場合、今ではほんの一部です-それでも壊れます)。
コードが再び機能するまで、もう50年待つことはできません。 :-)
(もちろん、他の皆が言ったこと。英語では、スペースと句読点を使用して単語を分離します。コンピューターパーサーが「単語」をわずかに異なる意味で定義することを除いて、コンピューター言語にも同じことが言えます)
スペースを識別子の一部として使用すると、構文解析は本当に曖昧になります(構文上のスペースですか、それとも識別子ですか)。動作はキーワード引数で実現されます。 object.save(data:something、atomically:true)
識別子にスペースを使用できる言語がいくつかあります。ほぼすべての言語が識別子の文字セットを制約しているという事実は、解析がより簡単で、ほとんどのプログラマーがコンパクトな空白なしスタイルに慣れているためです。
私は本当の理由があるとは思わない。
LaTeX
でグラフィックを作成するための TikZ
言語では、パラメーター名に空白文字(「キー」とも呼ばれる)を使用できます。たとえば、次のようなものが表示されます
\shade[
top color=yellow!70,
bottom color=red!70,
shading angle={45},
]
キーと値のペアのコンマ区切りリストのこの制限された設定では、解析の難しさはありません。実際、 topColor
、 top_color
、または topcolor
などの代替手段よりも読みやすいと思います。