出于兴趣,我想学习如何为一种简单的语言编写一个解析器,最终为我自己的小代码打高尔夫语言编写一个解释器,一旦我理解了这些东西的工作原理.
所以我开始阅读Douglas Crockfords的文章Top Down Operator Precedence.
注意:如果您想更深入地了解下面代码片段的上下文,您应该阅读本文
我无法理解var语句和赋值运算符=应如何协同工作.
DC定义了一个赋值运算符
var assignment = function (id) {
return infixr(id, 10, function (left) {
if (left.id !== "." && left.id !== "[" &&
left.arity !== "name") {
left.error("Bad lvalue.");
}
this.first = left;
this.second = expression(9);
this.assignment = true;
this.arity = "binary";
return this;
});
};
assignment("=");
Run Code Online (Sandbox Code Playgroud)
注意:[[value]]是指一个简化为其值的标记
现在,如果表达式函数达到例如[[t]],[[=]],[[2]],结果[[=]].led是这样的.
{
"arity": "binary",
"value": "=",
"assignment": true, //<-
"first": {
"arity": "name",
"value": "t" …Run Code Online (Sandbox Code Playgroud) 我目前正在编写一个ECMAScipt5编译器,它在解析树上执行各种给定的优化/转换,并编译回ECMAScipt5.
一个功能是在EnvironmentRecord中重命名绑定.
这种转换可以自动执行,例如作为旨在减少代码大小的优化的一部分,其中每个变量(不在全局范围内)将被赋予下一个最短可用名称,或者在引入引用的语句之后通过注释手动执行.新范围.
但是,我必须将(自动)进程仅限制为变量声明.
考虑这两个例子.第一个,编译,指定[Minify]为转换,第二个使用[Directives, PrettyPrint]
句法: Compiler.fromSource (src).compile ([/*Array of transformations*/]);
var bar,foo;
(function exampleMin () {
var bar="foo",
foo="bar";
function fooBar () {
return foo + bar;
}
})
Run Code Online (Sandbox Code Playgroud)
编译成
var bar,foo;function exampleMin(){var A="foo",B="bar";function fooBar(){return B+A}}
和
var bar,foo;
(function exampleMin () {
@Rename bar:A
@Rename foo:B
@Rename fooBar:C
var bar="foo",
foo="bar";
function fooBar () {
return foo + bar;
}
})
Run Code Online (Sandbox Code Playgroud)
编译成
var bar,foo;
function exampleMin(){
var A="foo",B="bar";
function C(){ …Run Code Online (Sandbox Code Playgroud) 最常见的是,模运算符%用于测试偶数或奇数.
现在的问题是,有没有使用按位对奇数任何问题的测试和,因为它感觉更自然的测试最右边的位是1或0不是做对一个模校验2
并且因为32位转换不会改变最右边的位.
都
(1 + Math.pow(2,52)) & 1 //1
和
(1 + Math.pow(2,52)) % 2 //1
产生相同的结果.
是否有理由更喜欢模运算符而不是按位?
编辑:这个问题只考虑了64位精度范围内的值,因为只有偶数可以精确地表示在2 ^ 53以上,因此两个操作数都会失败(9007199254740993 % 2 //0)
每次我重新加载这个页面http://prince27.bplaced.net/Prince27-Website/html/slider_true.html时,倒计时都会重新开始.我做错了什么?
我已将endDate设置为2012年9月20日,并计算了now和endDate之间的毫秒数.
var today = new Date();
var endDate = new Date("20/09/2012"); //set the date you want timer to end
var diffMs = (280800000); // milliseconds between now & endDate
var diffDays = Math.round(diffMs / 86400000); // days
var diffHrs = Math.round((diffMs % 86400000) / 3600000); // hours
var diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000); // minutes
var diffSecs = Math.floor((((diffMs % 86400000) % 3600000) % 60000) / 1000);
Run Code Online (Sandbox Code Playgroud)
完整的脚本文件