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
input.peek()会返回某种类型的令牌对象。但 return
最终会回归什么? True
/ false
或 tok
对象本身?
为什么 tok
在返回表达式中出现两次,一次在返回表达式的开头和第二位?
答案 0 :(得分:1)
它返回对象,或者为false。
tok
在表达式中出现两次,因为一些讨厌其他人能够阅读他的代码的聪明的开发人员需要能够在最后返回tok
并且还评估{{1}属性。
这是一个合理的重写,以便除了原始开发人员之外的所有人都可以阅读它:
.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;
这将使他不必在开始时检查var tok = input.peek() || {};
是否为假y:
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;
)也不必要地分配一个对象....
答案 1 :(得分:1)
如果令牌(AST节点)属于类型操作(缩写为" op")并且它与传入的操作类型({{1)匹配,则该函数的意图是返回令牌本身。参数)。
如果您没有传递op
参数,那么该功能只是检查令牌是否是" op"任何类型的
如果不符合条件,则返回false。
在布尔表达式的末尾添加op
的原因是返回tok
而不是true,这是在满足所有条件时的最后一次评估的结果。
这是一个更易阅读的版本
tok
由于在函数中使用全局变量(function is_op(op) {
var tok = input.peek();
if (!tok || tok.type !== "op") {
return false;
}
if (op && tok.value !== "op") {
return false
}
return tok;
}
)并且函数名称is_xxx应该返回一个布尔值是不好的做法,我会重写函数以返回一个布尔值并传入令牌。然后表达看起来更容易消化。
input
然后调用者已经拥有对令牌的引用
function is_op(tok, op) {
return tok && tok.type == "op" && (!op || tok.value == op);
}