Skip to content

Commit 8cdef78

Browse files
author
kanalin
committed
feat(asm): asm 汇编器架构
1 parent 9724f02 commit 8cdef78

File tree

10 files changed

+16240
-16
lines changed

10 files changed

+16240
-16
lines changed

package-lock.json

Lines changed: 16037 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import React, { useCallback, useState } from 'react';
2+
import { Input, Button, Layout } from 'antd';
3+
import { AssemblerBox } from './style';
4+
5+
const Assembler = () => {
6+
const [input, changeInput] = useState<string>('');
7+
const handleChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
8+
if (!event.target.files || !event.target.files[0]) {
9+
return;
10+
}
11+
12+
const file = event.target.files[0];
13+
const reader = new FileReader();
14+
15+
// @ts-ignore
16+
reader.onloadend = (ev: ProgressEvent<FileReader>) => {
17+
if (!ev.target || ev.target.readyState !== FileReader.DONE) {
18+
return;
19+
}
20+
changeInput((ev.target.result as string) || '');
21+
};
22+
reader.readAsText(file);
23+
}, []);
24+
25+
const parser = useCallback(() => {
26+
console.log('input', input);
27+
}, [input]);
28+
29+
return (
30+
<Layout>
31+
<Layout.Header>
32+
<h1 style={{ color: 'white' }}>assembler</h1>
33+
</Layout.Header>
34+
<Layout.Content
35+
style={{
36+
boxSizing: 'border-box',
37+
height: 'calc(100vh - 64px)',
38+
padding: '20px',
39+
}}
40+
>
41+
<AssemblerBox>
42+
<div className="header operate">
43+
<input type="file" onChange={handleChange} />
44+
<Button type="primary" className="parser-btn" onClick={parser}>
45+
编译
46+
</Button>
47+
</div>
48+
<div className="body">
49+
<div className="content left">
50+
<Input.TextArea className="file-content" rows={20} disabled value={input} />
51+
</div>
52+
<div className="content right">
53+
<Input.TextArea className="file-content" rows={20} disabled value={input} />
54+
</div>
55+
</div>
56+
</AssemblerBox>
57+
</Layout.Content>
58+
</Layout>
59+
);
60+
};
61+
62+
export default Assembler;

src/component/assembler/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import Assembler from './Assembler';
2+
export default Assembler;

src/component/assembler/style.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import styled from 'styled-components';
2+
3+
export const AssemblerBox = styled.div`
4+
.header {
5+
margin-bottom: 10px;
6+
}
7+
8+
.body {
9+
position: relative;
10+
display: flex;
11+
justify-content: space-between;
12+
13+
.content {
14+
box-sizing: border-box;
15+
width: 49%;
16+
17+
.file-content {
18+
color: rgba(0, 0, 0, 0.65);
19+
}
20+
}
21+
}
22+
`;

src/component/router/Router.tsx

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
import React from 'react';
2-
import {
3-
BrowserRouter,
4-
Switch,
5-
Route,
6-
Redirect,
7-
} from 'react-router-dom';
2+
import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';
83
import TankGame from '../tank-game/layout';
94
import Regular from '../regular';
105
import PlusTimes from '../plus-times';
6+
import Assembler from '../assembler';
117

128
const Router = () => {
13-
return (
14-
<BrowserRouter>
15-
<Switch>
16-
<Route path="/regular" component={Regular} />
17-
<Route path="/plus-time-compiler" component={PlusTimes} />
18-
<Route path="/mini-compiler/:level" component={TankGame} />
19-
<Redirect from="*" to="/regular" />
20-
</Switch>
21-
</BrowserRouter>
22-
);
9+
return (
10+
<BrowserRouter>
11+
<Switch>
12+
<Route path="/regular" component={Regular} />
13+
<Route path="/plus-time-compiler" component={PlusTimes} />
14+
<Route path="/mini-compiler/:level" component={TankGame} />
15+
<Route path="/asm" component={Assembler} />
16+
<Redirect from="*" to="/asm" />
17+
</Switch>
18+
</BrowserRouter>
19+
);
2320
};
2421

2522
export default Router;

src/core/assembler/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# 汇编解析器
2+
3+
https://github.com/CorleoneYu/nand2tetris
4+
5+
https://www.jianshu.com/p/19bd2a6761d0
6+
7+
https://www.jianshu.com/p/19fb662248cd
8+
9+
课程中第六章,将 「汇编代码」 转换为 「机器语言」。

src/core/assembler/code.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Code {
2+
/**
3+
* 返回 dest 助记符 的 二进制
4+
*/
5+
public dest() {
6+
7+
}
8+
9+
/**
10+
* 返回 comp 助记符 的 二进制
11+
*/
12+
public comp() {
13+
14+
}
15+
16+
/**
17+
* 返回 jump 助记符 的 二进制
18+
*/
19+
public jump() {
20+
21+
}
22+
}
23+
24+
export default Code;

src/core/assembler/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Code from './code';
2+
import Parser from './parser';
3+
4+
class Assembler {
5+
6+
}
7+
8+
export default Assembler;

src/core/assembler/parser.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* 封装对输入代码对访问操作
3+
* 1. 提供访问汇编命令(域 符号)的方法;
4+
* 2. 去掉所有空格和注释
5+
*/
6+
class Parser {
7+
public hasMore() {
8+
9+
}
10+
11+
public advance() {
12+
13+
}
14+
15+
/**
16+
* 返回当前命令的类型:
17+
* 1. A_COMMAND: @Xxx 其中 Xxx 是符号或十进制数字
18+
* 2. C_COMMAND: dest = comp:jump
19+
* 3. L_COMMAND @Xxx 其中 Xxx 是符号
20+
*/
21+
public commandType() {
22+
23+
}
24+
25+
/**
26+
* 返回形如 @Xxx 的当前命令的符号或十进制
27+
* 当且仅当类型为 A_COMMAND 或 L_COMMAND
28+
*/
29+
public symbol() {
30+
31+
}
32+
33+
/**
34+
* 返回当前 C_COMMAND 的 dest 助记符
35+
* 8 种情况
36+
*/
37+
public dest() {
38+
39+
}
40+
41+
/**
42+
* 返回当前 C_COMMAND 的 comp 助记符
43+
* 28 种情况
44+
*/
45+
public comp() {
46+
47+
}
48+
49+
/**
50+
* 返回当前 C_COMMAND 的 jump 助记符
51+
* 8 种情况
52+
*/
53+
public jump() {
54+
55+
}
56+
}
57+
58+
export default Parser;

src/core/assembler/symbol-table.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class SymbolTable {
2+
3+
}
4+
5+
export default SymbolTable;

0 commit comments

Comments
 (0)