2017-02-15 79 views
0
function is_op(op) { 
    var tok = input.peek(); 
    return tok && tok.type == "op" && (!op || tok.value == op) && tok; 
} 

該功能可以在這個網站上找到:http://lisperator.net/pltut/parser/the-parser這個Javascript函數返回值是什麼?

input.peek()不會返回某種類型的令牌對象。但是return最後還是會回來? True/falsetok對象本身? 爲什麼tok在返回表達式中出現兩次,一次是在開始處,另一次是在返回表達式的結尾處?

+0

參考它將返回第一falsy或最後truthy值。例如。如果'tok'是虛假的,它會返回。如果'tok.type =='op「'爲'false',它將返回那個,等等。 –

回答

1

它返回對象,或者是false。

tok表達中出現了兩次,因爲一些自作聰明的開發商誰不喜歡其他人能夠讀取,以便能夠在年底返回tok和需要他的代碼也評價這是.value財產。

這裏是一個明智的重寫,這樣比原來的開發商其他每個人都可以閱讀:

//if tok is false 
if(!tok) { 
    return false; 
} 

if(tok.type !== 'op') { 
    return false; 
} 

//if op is defined and tok.value is not the same as op 
if(op && tok.value != op) { 
    return false; 
} 

//tok.type == 'op' and tok.value == op, if it was defined 
return tok; 

ALSO

的開發也許能寫這行:

var tok = input.peek() || {}; 

這將允許他不必檢查是否tok在開始時是假的:

//if toke.type is 'op' and tok has a non-false-y value that is equal to op, return it 
return tok.type == 'op' && (!op || tok.value == op) && tok.value == op && tok; 

但一個純粹也可以說,線(input.peek() || {})不必要地分配對象,以及....

+1

當'op'未定義時,我不認爲你的第一個代碼是等價的。 '(!op || tok.value == op)' –

+0

@JuanMendes - OP從未顯示op被定義的位置,所以我假定它是在上面的某處定義的,可能是通過「undefined」的值'var op;' – Adam

+0

'op'是傳遞給函數的參數,如果你不通過它,它不需要檢查'tok.value =='op'' –

1

函數的意圖是返回如果令牌(AST節點)令牌本身是操作類型(縮寫爲「op」),它與傳入的操作類型(op參數)相匹配。

如果你沒有在op參數傳遞,該函數只是要檢查,如果令牌是任何類型的「OP」

如果條件不滿足,則返回錯誤。

在布爾表達式的末尾添加tok的原因是,返回tok而不是true,這是在滿足所有條件時最後一次評估的結果。

這裏是一個更可讀的版本

​​

因爲它是不好的做法,使用全局變量在函數(input)和函數名is_xxx應該返回一個布爾值,我會返工函數返回一個布爾值和你傳入令牌。然後表情看起來更容易消化。

function is_op(tok, op) { 
    return tok && tok.type == "op" && (!op || tok.value == op); 
} 

然後調用者就已經擁有令牌

var tok = input.peek(); 
if (is_op(tok, "plus")) { 
    parsePlusExpression(tok); 
} else { 

}