在离开这个话题 20 多年(自从我获得 CS 本科学位以来)之后,我又回到了语言设计/规范(通过 BNF/EBNF 语法)。
我只是模糊地记得这个领域的各种相关术语,比如 LR(1)、LALR 等。我一直在尝试通过一些谷歌搜索和阅读来刷新,但它来得很慢(可能是因为我没有完全理解这些东西回到学校)。所以我可能做事相当粗略。
我决定用语法来描述一种玩具语言,然后尝试分析并可能优化它,作为我重新学习的一部分。
注意:下面的所有片段也可以在此处的要点中找到。
我从 EBNF 表示开始(由该工具处理/验证):
Program := WhSp* (StmtSemi WhSp*)* StmtSemiOpt? WhSp*;
Stmt := AStmt | BStmt | CStmt | DStmt;
StmtSemi := Stmt? (WhSp* ";")+;
StmtSemiOpt := Stmt? (WhSp* ";")*;
WhSp := "_";
AStmt := "a";
BStmt := "b";
CStmt := "c";
DStmt := "d";
Run Code Online (Sandbox Code Playgroud)
以下是该语言的一些有效匹配(每行一个匹配):
_____
;;;;;
_;_;_
a
__a__
a;
a;b;
a;_b;
_a;_b;_
_a_;_b_;_
__a__;;
_;_a;_b;c;;;__;;__d;___a___
Run Code Online (Sandbox Code Playgroud)
这里有一些该语言中没有的值(同样,每行一个):
ab
a_b
a;_b_c
Run Code Online (Sandbox Code Playgroud)
然后我将其手动转换为以下 BNF 形式( …
我正在寻找一种干净的方式来异步加载以下类型的javascript文件:一个"核心"js文件(嗯,我只是叫它,哦,我不知道,"jquery!"哈哈),x个js依赖于正在加载的"核心"js文件的文件,以及y个其他不相关的js文件.我有几个关于如何去做的想法,但不知道最好的方法是什么.我想避免在文档正文中加载脚本.
因此,例如,我希望以下4个javascript文件异步加载,适当命名:
/js/my-contact-page-js-functions.js // unrelated/independent script
/js/jquery-1.3.2.min.js // the "core" script
/js/jquery.color.min.js // dependent on jquery being loaded
http://thirdparty.com/js/third-party-tracking-script.js // another unrelated/independent script
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它不能保证在颜色插件之前加载jQuery ...
(function() {
var a=[
'/js/my-contact-page-functions.js',
'/js/jquery-1.4.2.min.js',
'/js/jquery.color.js',
'http://cdn.thirdparty.com/third-party-tracking-script.js',
],
d=document,
h=d.getElementsByTagName('head')[0],
s,
i,
l=a.length;
for(i=0;i<l;i++){
s=d.createElement('script');
s.type='text/javascript';
s.async=true;
s.src=a[i];
h.appendChild(s);
}
})();
Run Code Online (Sandbox Code Playgroud)
几乎不可能异步加载jquery和颜色插件?(因为颜色插件需要首先加载jQuery.)
我考虑的第一种方法是将颜色插件脚本和jQuery源组合到一个文件中.
然后我的另一个想法是加载颜色插件,如下所示:
$(window).ready(function() {
$.getScript("/js/jquery.color.js");
});
Run Code Online (Sandbox Code Playgroud)
任何人都对你如何做到这一点有任何想法?谢谢!
蝙蝠Magento带有超过6个JavaScript库,这些库对已经很繁琐的加载时间没有帮助.有没有人能够成功地使用像head.js或labjs这样的脚本加载器和Magento,以便它们可以异步加载?我一直在尝试,但无法让它工作.
似乎页面上的内联脚本在加载库之前触发.我知道head.js有一个像head.ready这样的函数来告诉脚本执行,但是有很多内联脚本将它添加到整个站点中的每个事件都是不切实际的.
我有一个非常简单的c/c ++程序,它要求子进程执行另一个程序,然后将一些数据发送到该子程序,并等待响应.
子程序从stdin读取并在继续之前等待EOF.
我的问题是,子程序从管道写入接收初始输入,但它从未看到EOF(即使我关闭管道),所以它永远等待.
我不确定为什么关闭管道并不意味着孩子的stdin的EOF?
这是代码:
问题是关于http://labjs.com - 一个非阻塞的JavaScript加载和依赖项管理的很棒的库.
我已经阅读了文档,但我必须太累或者其他东西 - 我找不到关于DOM ready事件的任何内容.在DOM准备好之后是否执行脚本?
也许如果我这样做:
$LAB.script('my-library.js').wait(function(){
// interacting with DOM
});
Run Code Online (Sandbox Code Playgroud)
它会安全吗?或者我应该使用某种$(function() {})等?
我确信我不完全理解这个问题,但似乎我们在我的项目中看到IE9上的奇怪行为,不知何故与通过调用注入的JavaScript的无序执行有关document.write,例如:
document.write('<scr'+'ipt type="text/javascript" src="'+file1+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file2+'"></src'+'ipt>');
document.write('<scr'+'ipt type="text/javascript" src="'+file3+'"></src'+'ipt>');
Run Code Online (Sandbox Code Playgroud)
我有限的谷歌研究表明,IE9将以与其他浏览器不同的顺序执行以这种方式注入的脚本(特别是Firefox和Chrome).有没有更好的方法来实现我们的目标,这将确保所有浏览器的执行顺序相同?
我把它拿回来了:我们并不关心所有浏览器,只关注Chrome和IE9.
javascript internet-explorer google-chrome javascript-injection labjs