|
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。树节点的左子树一定比右子树先遍历,即先处理左树再节点再右树,但不太适合解析
|
|
0 commit comments