小编Mor*_*ler的帖子

Crockfords自上而下的运营商优先权

出于兴趣,我想学习如何为一种简单的语言编写一个解析器,最终为我自己的小代码打高尔夫语言编写一个解释器,一旦我理解了这些东西的工作原理.

所以我开始阅读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)

javascript parsing

26
推荐指数
1
解决办法
1331
查看次数

以编程方式重命名函数

我目前正在编写一个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)

javascript compiler-optimization

19
推荐指数
1
解决办法
1467
查看次数

测试奇数

最常见的是,模运算符%用于测试偶数或奇数.

现在的问题是,有没有使用按位对奇数任何问题的测试和,因为它感觉更自然的测试最右边的位是10不是做对一个模校验2

并且因为32位转换不会改变最右边的位.

(1 + Math.pow(2,52)) & 1 //1

(1 + Math.pow(2,52)) % 2 //1

产生相同的结果.

是否有理由更喜欢模运算符而不是按位?

编辑:这个问题只考虑了64位精度范围内的值,因为只有偶数可以精确地表示在2 ^ 53以上,因此两个操作数都会失败(9007199254740993 % 2 //0)

javascript modulo bitwise-and

8
推荐指数
1
解决办法
235
查看次数

Javascript倒计时不起作用

每次我重新加载这个页面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)

完整的脚本文件

javascript

-4
推荐指数
1
解决办法
106
查看次数