12

私は現在Javascript: The Good Partsを読んでいますが、それらの「文法」図を理解するのに苦労しています。

最初のものは空白です

ここに画像の説明を入力

読み方がよくわかりませんが、おそらくいくつかのコードが理解に役立つでしょうか?

上級者の助けをありがとう。

4

5 に答える 5

7

一番左から始めて、||右に進みます。カーブが左(進行方向)から始まっていないため、最初のバー(開始点のすぐ隣)をたどることはできません。カーブがどこから来ているかを見ると、それがwhileループ:

while (!EOF) {} // While there's still text to parse

曲線は左から始まっているため、2行目をたどることができます(現在のディレクトリをたどっています)。この行は、次のif-elseステートメントを表しています。

if (char == '/') {}       // Forward slash
else if (char == '\n') {} // Line end
else if (char == '\t') {} // Tab
else if (char == ' ') {}  // Space

スペース、タブ、および終了行は両方とも、機能を終了し、いずれかreturnまたはcontinueすぐに終了します。ただし、文字がスラッシュの場合は、1行(//)または複数行()のどちらであるかを確認する必要があります/* */

*char++;                 // Move to next character
if (char == '*') {}      // Multi line
else if (char == '/') {} // Single line

単一行の場合は、行の終わりまで読み取り、続行します。複数行の場合は、「*」の後に「/」が続くまで同様の方法で読み取り、続行します。

于 2012-10-08T04:41:42.990 に答える
3

左側の二重バー( "||")は関数の「入力」と見なすことができ、右側の二重バーは「出力」と見なすことができます。したがって、この場合、文字または行が入力であり、二重バー間のパスがテストです。いずれかのテストで文字/行が「空白」と見なされた場合、関数の出力は「true」になり、そうでない場合は「false」になります。

特に、4番目のパスをたどるとします。このパスでは、最初に「/」が表示され、次に別の「/」が表示され、その後にEOL文字まで他の文字が表示されます。この場合、コード行が「//例」の場合、出力はtrueになります。

于 2012-10-08T04:24:54.180 に答える
1

Think about it as if you are the parser or the language, and you need a set of rules to understand the input stream of characters.

By thinking how the parser does, you can understand exactly what constitues the tokens of the JavaScript language.

于 2012-10-08T04:31:13.430 に答える
1

あなたが参照している文法図は、Pascal 構文を文書化するために広く使用されていました。これは基本的に、ソース コードがどのように解析されるかのフローチャートです。チャートの各「チャンク」、例では「空白」は関数呼び出しのようなものです。技術的には、再帰降下パーサーについて話しています。

したがって、それについての私の考え方は次のとおりです。

パーサーは、入力ストリームから文字を取得します。そのため、空白関数を「試して」、その文字がスペース、タブ、行末、または「/」文字である場合は次のステップに進み、そうでない場合は「見つからない」戻り値で終了します。

'/' の場合は、次の文字を取得します。それが別の '/' である場合、行末になるまで文字を読み取り、'found' 戻り値で終了します。

次の文字が ' ' の場合、'/' や ' ' 以外の文字を読み取ります。など...

基本的に流れは左から右ですが、ラインが左にループする場合は繰り返しになります。これらのダイアグラムの優れた点は、一度コツをつかめば、構文的に正しいコードをすばやく簡単に記述できることです。そして、「フローチャート」に従うことで、再帰降下パーサーをかなり簡単にコーディングできます。

于 2012-10-09T22:52:56.633 に答える