我正在写一些语法分析器,不允许更改原语。
所以我知道人们可以通过以下方式修改原语:
<?xml version="1.0" encoding="UTF-8"?>
<response errorcode="0" errormessage="">
<categories>
<category>
<id>33</id>
<title><![CDATA[Audio HIFI]]></title>
</category>
<category>
<id>34</id>
<title><![CDATA[Audio HI End]]></title>
</category>
<category>
<id>35</id>
<title><![CDATA[Receivers]]></title>
</category>
</categories>
这真的是完整,详尽的方法清单吗?还是我忘记了什么...
P.S。该分析仪用于我特有的库。不允许将传递的参数更改为返回测试闭包的对象常量的函数,即每个闭包都不得更改其公共原语。
答案 0 :(得分:1)
您在这里:
// assignment operators
p = 1;
p += 1;
p -= 1;
p *= 1;
p /= 1;
p %= 1;
p <<= 1;
p >>= 1;
p >>>= 1;
p &= 1;
p ^= 1;
p |= 1;
p **= 1;
// decrement / increment operators
p++;
++p;
p--;
--p;
// destructuring
({ p } = { p: 1 });
({ a: p } = { a: 1 });
([p] = [1]);
请注意,以上所有内容也可能出现在解析的字符串中:
(new Function("p = 1"))();
eval("p = 1");
分析器用于我特有的库。不允许更改传递的参数。
那我想最简单的方法就是解析:
function toTest(p) { /* body */ }
对此并执行:
const p = 1;
try {
eval(/* body */);
} catch(e) {
//...
}
如果发生错误,则有人试图对const进行变异。