2012-10-08 58 views
11

我正在閱讀Javascript:好部件我無法理解他們的「語法」圖。如何閱讀此javascript圖表?

第一個是空白

enter image description here

我不太知道該如何解讀它,也許一些代碼,會幫助我瞭解?

感謝您在高級人員的幫助。

+2

基本上,空格,製表符和新行字符都被認爲是空白,以及任何意見。 – Brad

+0

我在試圖弄清楚註釋語法與白色空間有什麼關係時遇到了麻煩,但是現在用Brad的答案是有道理的。 –

+0

我現在有點了解。但是結構呢?仍然有點混淆與下一節例子:/我應該跳過語法章節,並與對象? – RufioLJ

回答

3

左側的雙向條(「||」)可以被視爲一個函數的「輸入」,右側的雙向條被視爲「輸出」。因此,在這種情況下,字符或行是輸入,而雙條之間的路徑是測試。如果任何測試將字符/行視爲「空白」,則函數的輸出將爲「真」,否則將爲「假」。

特別是,假設您遵循第四條路徑。在這條路上,你將首先遇到一個「/」,隨後跟着另一個「/」,接着是任何其他字符,直到EOL字符。在這種情況下,如果代碼行是「//示例」,那麼輸出將爲真。

+0

好吧,這有幫助,但我卡在第三行後,但。出於某種原因,我認爲該圖試圖告訴第三行/ *// * /的空白。 感謝您的幫助。 – RufioLJ

1

認爲它好像是解析器或語言,你需要一套規則來理解輸入的字符流。

通過思考解析器是如何工作的,您可以準確理解什麼是JavaScript語言的標記。

4

從最左側的||開始並繼續。因爲曲線不是從左邊開始(你正在旅行的方向),所以不能遵循第一個橫條(緊接着你的起始點)。如果你看它來自哪裏,應該很容易將它表示爲while循環:

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

第二行可以遵循,因爲曲線從左邊(繼當前目錄)該線始於表示該if-else語句:

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

空格,製表和結束線都立即結束該功能,並立即結束returncontinue。但是,如果字符是一個正斜槓,它需要檢查它是否是單行(//)或者多(/* */):

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

如果這是它讀取一行,直到行的結束和繼續。如果它是多行,則以類似的方式讀取,直到找到'*'後跟'/',然後繼續。

1

您引用的語法圖被廣泛用於記錄Pascal語法。它基本上是解析源代碼的流程圖。在您的示例中,圖表中的每個「塊」都是一個函數調用。從技術上講,我們正在討論遞歸下降解析器。

所以,我想它的方式是:

解析器會從輸入流的字符。所以我們去「嘗試」空白函數,如果那個字符是空格,製表符,行結束符或'/'字符,我們將進入下一步,如果不是我們用'未找到'返回值退出。

如果它是'/',那麼我們得到下一個字符。如果它是另一個'/',那麼我們讀取字符,直到我們得到一個行結束,然後用'找到'返回值退出。

如果下一個字符是'',那麼我們看看任何不是'/'或''的東西。 etc ...

基本上流程是從左到右,但是當一條線循環回到左側時,我們有一個重複。關於這些圖的簡潔之處在於,一旦掌握了它,就可以快速編寫語法正確的代碼。您可以按照'流程圖'輕鬆編寫遞歸下降解析器。

1

(參見this answer

要學會如何閱讀鐵路圖,你需要了解圖的差異在這三種情況:

零個或多個,零或一個,一個或更多

要了解它們的不同之處(如下圖所示),點爲「您從左邊緣開始,沿着軌道到達右邊緣。」所以想象你是火車,你只是右轉,不能左轉。

enter image description here

通過http://bottlecaps.de/rr/ 創建的上述圖象在「編輯語法」選項卡,輸入以下語法:

zeroormore ::= element* 
zeroorone ::= element? 
oneormore ::= element+