就像前面提到的,解析器將會爲程序構建一個準確的語義意義的結構.咱們的AST節點是普通的javascript對象,包含一個type屬性,其餘屬性根據type不一樣而不一樣.javascript
類型 | AST節點 |
---|---|
num | { type: "num", value: NUMBER } |
str | { type: "str", value: STRING } |
bool | { type: "bool", value: true or false } |
var | { type: "var", value: NAME } |
lambda | { type: "lambda", vars: [ NAME... ], body: AST } |
call | { type: "call", func: AST, args: [ AST... ] } |
if | { type: "if", cond: AST, then: AST, else: AST } |
assign | { type: "assign", operator: "=", left: AST, right: AST } |
binary | { type: "binary", operator: OPERATOR, left: AST, right: AST } |
prog | { type: "prog", prog: [ AST... ] } |
let | { type: "let", vars: [ VARS... ], body: AST } |
123.5
複製代碼
{ type: "num", value: 123.5 }
複製代碼
"Hello world"
複製代碼
{ type: "str", value: "Hello world" }
複製代碼
true
false
複製代碼
{ type: "bool", value: true }
{ type: "bool", value: false }
複製代碼
foo
複製代碼
{ type: "var", value: "foo" }
複製代碼
lambda (x) 10
λ (x) 10
複製代碼
{
type: "lambda",
vars: [ "x" ],
body: { type: "num" , value: 10}
}
複製代碼
foo(a, 1)
複製代碼
{
type: "call",
func: {
type: "var", value: "foo"
},
args: [
{ type: "var", value: "a" },
{ type: "num", value: 1 }
]
}
複製代碼
if foo then bar else baz
-->
{
type: "if",
"cond": { type: "var", value: "foo" },
"then": { type: "var", value: "bar" },
"else": { type: "var", value: "baz" }
}
複製代碼
if foo then bar
-->
{
type: "if",
"cond": { type: "var", value: "foo" },
"then": { type: "var", value: "bar" }
}
複製代碼
a = 10
-->
{
type: "assign",
operator: "=",
left: { type: "var", value: "a" },
right: { type: "num", value: 10 }
}
複製代碼
z + y * z
-->
{
type: "binary",
operator: "+",
left: { type: "var", value: "x" },
right: {
type: "binary",
operator: "*",
left: { type: "var", value: "y" },
right: { type: "var", value: "z" }
}
}
複製代碼
{
a = 5;
b = a * 2;
a + b;
}
-->
{
type: "prog",
prog: [
{
type: "assign",
operator: "=",
left: { type: "var", value: "a" },
right: { type: "num", value: 1 }
},
{
"type": "assign",
"operator": "=",
"left": { "type": "var", "value": "b" },
"right": {
"type": "binary",
"operator": "*",
"left": { "type": "var", "value": "a" },
"right": { "type": "num", "value": 2 }
}
},
{
"type": "binary",
"operator": "+",
"left": { "type": "var", "value": "a" },
"right": { "type": "var", "value": "b" }
}
]
}
複製代碼
let (a = 10, b = a * 10) {
a + b;
}
-->
{
"type": "let",
"vars": [
{
"name": "a",
"def": { "type": "num", "value": 10 }
},
{
"name": "b",
"def": {
"type": "binary",
"operator": "*",
"left": { "type": "var", "value": "a" },
"right": { "type": "num", "value": 10 }
}
}
],
"body": {
"type": "binary",
"operator": "+",
"left": { "type": "var", "value": "a" },
"right": { "type": "var", "value": "b" }
}
}
複製代碼
原文連接: lisperator.net/pltut/parse…java