File tree Expand file tree Collapse file tree 1 file changed +8
-4
lines changed Expand file tree Collapse file tree 1 file changed +8
-4
lines changed Original file line number Diff line number Diff line change 347
347
例如 赋值语句(assign statement): var x=1
348
348
例如 if语句(if statement): if(Expr){}[else if(){}]else{}
349
349
```
350
- * if语句的递归向下分析 :
350
+ * if语句的分析 :
351
351
```
352
352
parseIfStmt() → eat(if) → parseExpr() → parseBlock() → eat(else) → parseIfStmt()
353
353
| eat(if) → parseExpr() → parseBlock()
354
354
| eat(if) → parseExpr() → parseBlock() → eat(else) → parseBlock() (该过程可简化为一个parseBlock())
355
355
```
356
- * function语句的递归向下分析 :
356
+ * function语句的分析 :
357
357
```
358
358
parseFnStmt() → eat(function) → eat(id) → eat(params) → parseBlock()
359
359
params → e | param,params
360
360
param → Literal(可能是id、number、string)
361
361
```
362
- * class语句的递归向下分析 :
362
+ * class语句的分析 :
363
363
```
364
364
parseClassStmt() → eat(class) → eat(id) → eat(extends) → eat(id) → parseBlock()
365
365
| eat(class) → eat(id) → parseBlock()
366
366
```
367
- * import语句的递归向下分析 :
367
+ * import语句的分析 :
368
368
```
369
369
parseImportStmt() → eat(import) → eat(id | object | array) → eat(from) → eat(string)
370
370
```
373
373
program → statements | e
374
374
statements → statement statements | e
375
375
statement → assignStmt | ifStmt | whileStmt | switchStmt | functionStmt | forStmt | classStmt |importStmt ...
376
+ statement → statement + Expr | Expr + Literal | ...
377
+ Expr → Expr + Term | Expr - Term | Expr
378
+ Term → -Expr | (Expr) | Term * Literal | Term / Literal | Literal
379
+ Literal → number | variable | string
376
380
```
377
381
* 复杂表达式的解析:以上只能解决+-*/的优先级问题,多层优先级问题使用后序遍历解决
378
382
* 中序表达式:例如:a+b*c、a*b+c。树节点的左子树一定比右子树先遍历,即先处理左树再节点再右树,但不太适合解析
You can’t perform that action at this time.
0 commit comments