Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 56c1b2f

Browse files
增加语法分析和代码生成js开源项目demo
1 parent e8126a8 commit 56c1b2f

File tree

7 files changed

+10039
-4
lines changed

7 files changed

+10039
-4
lines changed

‎04_运行时刻环境/README.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,10 @@
166166
-- parent:sp //子环境(字作用域)指向父环境的指针
167167
·源码到运行时的内存分配分析:
168168
源码: 三地址码: 符号表的设计 翻转符号表 映射到运行时的地址
169-
var a=2*3+1 p0=2*3 p0 b sp+0
170-
var b=a+1 p1=p0+1 p1 a sp+4
171-
a=p1 a p1 sp+8
172-
b=a+1 b p2 sp+12
169+
var a=2*3+1 p0=2*3 p0 b sp+0
170+
var b=a+1 p1=p0+1 p1 a sp+4
171+
a=p1 a p1 sp+8
172+
b=a+1 b p2 sp+12
173173
·三地址表达式实例2(斐波那契函数)栈的活动记录图示:
174174
栈空间(通过指针偏移拿到数据) 代码段(通过行号值拿到数据)
175175
| link7 |

‎demo/escodegen-test/package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "escodegen-test",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"author": "",
10+
"license": "ISC"
11+
}

‎demo/escodegen-test/src/index.html

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<!DOCTYPE HTML>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>JS code generator demo: JS → AST → JS</title>
7+
<link rel="stylesheet" href="./style.css" type="text/css" />
8+
<script src="./lib/esprima.js"></script>
9+
<script src="./lib/escodegen.browser.js"></script>
10+
<script type="text/javascript">
11+
function $D(elm) {
12+
var range = document.createRange();
13+
range.selectNodeContents(elm);
14+
range.deleteContents();
15+
range.detach();
16+
}
17+
function $T(mes) {
18+
return document.createTextNode(mes);
19+
}
20+
function hasClass(e, name) {
21+
name = name.toLowerCase();
22+
var cn = e.className;
23+
if (!cn) return false;
24+
var cnlist = cn.toLowerCase().split(/\s+/);
25+
for (var i = 0, l = cnlist.length; i < l; i++)
26+
if (cnlist[i] == name) return true;
27+
return false;
28+
}
29+
function addClass(e, name) {
30+
var cn = e.className || '';
31+
if (hasClass(e, name)) return;
32+
e.className = cn + ' ' + name;
33+
}
34+
function removeClass(e, name) {
35+
if (!hasClass(e, name)) return;
36+
var cn = e.className || '';
37+
name = name.toLowerCase();
38+
var cnlist = cn.toLowerCase().split(/\s+/);
39+
cnlist.splice(cnlist.indexOf(name), 1);
40+
e.className = cnlist.join(' ');
41+
}
42+
function toggleClass(e, name) {
43+
(hasClass(e, name)) ? removeClass(e, name) : addClass(e, name);
44+
}
45+
document.addEventListener('DOMContentLoaded', function (ev) {
46+
var textarea = document.getElementById("console");
47+
var pre = document.getElementById("output");
48+
textarea.value = "for(var i=1;i<=100;++i){if(i%15===0){console.log('FizzBuzz')}else if(i%3===0){console.log('Fizz')}else if(i%5===0){console.log('Buzz')}else{console.log(i)}}";
49+
function show() {
50+
$D(pre);
51+
try {
52+
removeClass(textarea, "invalid");
53+
var AST = esprima.parse(textarea.value);
54+
pre.appendChild($T(escodegen.generate(AST)));
55+
} catch (e) {
56+
addClass(textarea, "invalid")
57+
pre.appendChild($T("Invalid"));
58+
}
59+
}
60+
show();
61+
textarea.addEventListener("input", show, false);
62+
}, false);
63+
</script>
64+
</head>
65+
66+
<body>
67+
<h1>JS code generator demo: JS → AST → JS</h1>
68+
<p>using <a href="http://esprima.org/">esprima</a> as parser</p>
69+
<p>and using <a href="https://github.com/Constellation/escodegen">escodegen</a> as code generator</p>
70+
<textarea id="console" rows="10" cols="30" placeholder="write your code"></textarea>
71+
<pre id="output"></pre>
72+
</body>
73+
74+
</html>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /