一个由 TS 搭建的学习版编译器
A basic compiler for learning written in typescript language
yarn tsc
yarn check
yarn dev
- 预处理
- 词法分析
- 语法分析
What should be before running? 运行前代码是什么样的?
// example/sourceRoutine.js
let a = 12;
let b = 14;
let c = a + b;
After running it will become... 代码运行后将变成...
// example/output.js
let a=12;let b=14;let c=a+b;
// example/lexicalOutput.json
{
"tokens": [
{
"type": "keyword",
"val": "let",
"line": 1
}
]
}
C 语言子集语法 EBNF 描述
<语句> ∷= <变量>∶=<表达式> // 变量赋值
| if <表达式> <语句> // 条件语句
| if <表达式> <语句> else <语句> // 条件语句
<变量> ∷= i | i '['<表达式>']' // 对数组或列表的索引
<表达式> ∷= <项> | <表达式> + <项> // 单独的项或表达式 + 项(可以进行加法运算)
<项> ∷= <因子>| <项>*<因子> // 因子|项和因子(乘法运算)
<因子> ∷= <变量>| '('<表达式>')' //
这是一个简单的语法规则定义,描述了一个类似于编程语言中的语句、变量和表达式的结构。
-
<语句> ::= <变量>∶=<表达式>
这一行定义了一条语句的结构,它由一个变量和一个表达式组成,用冒号和等号连接。这可以表示给变量赋值的操作。
-
<语句> ::= if <表达式> <语句>
这一行定义了一个条件语句的结构,以关键字 "if" 开始,后面跟着一个表达式和一条语句。如果表达式的结果为真,就执行这条语句。
-
<语句> ::= if <表达式> <语句> else <语句>
这一行定义了一个条件语句的结构,与上一行类似,但多了一个 "else" 关键字和另一条语句。如果表达式的结果为真,执行第一条语句;否则,执行第二条语句。
-
<变量> ::= i | i '['<表达式>']'
这一行定义了变量的结构。变量可以是一个简单的标识符 "i",也可以是一个带有方括号的表达式,表示对一个数组或列表的索引。
-
<表达式> ::= <项> | <表达式> + <项>
这一行定义了表达式的结构。一个表达式可以是一个单独的项,或者是由一个表达式和一个加号连接的项。这表示可以进行加法运算。
-
<项> ::= <因子> | <项>* <因子>
这一行定义了项的结构。一个项可以是一个因子,或者由一个项、一个乘号和一个因子连接而成。这表示可以进行乘法运算。
-
<因子> ::= <变量> | '(' <表达式> ')'
这一行定义了因子的结构。一个因子可以是一个变量,或者是由一对括号括起来的表达式。这表示可以使用括号改变运算顺序。