|
299 | 299 | 和LR(k)的解析范围.jpg)
|
300 | 300 |
|
301 | 301 | * 该js parse将采用手写递归下降parser:从LL1开始,如果遇到实在不能解析的语法再扩大lookahead范围或加入ad-hoc,即自顶向下递归下降 + lookahead + ad-hoc + 运算符优先级 → AST
|
302 | | -* 表达式自顶向下分析方法过程:解析过程是通过3个解析函数,按照解析顺序自顶向下:parseExpr() → parseTerm() → parseLiteral() |
| 302 | +* 简单表达式的解析过程:解析过程是通过3个解析函数,按照解析顺序自顶向下:parseExpr() → parseTerm() → parseLiteral() |
303 | 303 | * EOF:end of file,程序编写中的一个小技巧,将EOF加入到tokens流的结尾,避免一些边界条件判断,俗称"哨兵"
|
304 | 304 | * 表达式顺序解析:但是该解析存在优先级的问题
|
305 | 305 | ```
|
|
344 | 344 | Term → LiteralTerm` | -ExprTerm` | (Expr)Term`
|
345 | 345 | Term` → *Term | /Term | e
|
346 | 346 | ```
|
347 | | -* statement:陈述语句。 |
348 | | - ``` |
349 | | - 例如 赋值语句(assign statement): var x=1 |
350 | | - 例如 if语句(if statement): if(Expr){}[else if(){}]else{} |
351 | | - ``` |
352 | | -* if语句的分析: |
353 | | - ``` |
354 | | - parseIfStmt() → eat(if) → parseExpr() → parseBlock() → eat(else) → parseIfStmt() |
355 | | - | eat(if) → parseExpr() → parseBlock() |
356 | | - | eat(if) → parseExpr() → parseBlock() → eat(else) → parseBlock() (该过程可简化为一个parseBlock()) |
357 | | - ``` |
358 | | -* function语句的分析: |
359 | | - ``` |
360 | | - parseFnStmt() → eat(function) → eat(id) → eat(params) → parseBlock() |
361 | | - params → e | param,params |
362 | | - param → Literal(可能是id、number、string) |
363 | | - ``` |
364 | | -* class语句的分析: |
365 | | - ``` |
366 | | - parseClassStmt() → eat(class) → eat(id) → eat(extends) → eat(id) → parseBlock() |
367 | | - | eat(class) → eat(id) → parseBlock() |
368 | | - ``` |
369 | | -* import语句的分析: |
370 | | - ``` |
371 | | - parseImportStmt() → eat(import) → eat(id | object | array) → eat(from) → eat(string) |
372 | | - ``` |
373 | | -* 整体的语法分析: |
374 | | - ``` |
375 | | - program → statements | e |
376 | | - statements → statement statements | e |
377 | | - statement → assignStmt | ifStmt | whileStmt | switchStmt | functionStmt | forStmt | classStmt |importStmt ... |
378 | | - statement → statement + Expr | Expr + Literal | ... |
379 | | - Expr → Expr + Term | Expr - Term | Expr |
380 | | - Term → -Expr | (Expr) | Term * Literal | Term / Literal | Literal |
381 | | - Literal → number | variable | string |
382 | | - ``` |
383 | | -* 复杂表达式的解析:以上只能解决+-*/的优先级问题,多层优先级问题使用后序遍历解决 |
| 347 | +* 复杂表达式的解析:通过引入其他非终结符Term只能解决+-*/这种简单表达式的优先级问题,多层优先级问题使用后序遍历算法解决 |
384 | 348 | * 中序表达式:例如:a+b*c、a*b+c。树节点的左子树一定比右子树先遍历,即先处理左树再节点再右树,但不太适合解析
|
385 | 349 | * 后序表达式:例如:ab+c*、ab*c+,适合解析
|
386 | 350 | * 中序转换为后序:
|
|
430 | 394 | 6其他出栈 → stack: ,abcd+*+
|
431 | 395 | 7abcd+*+ → ab(c+d)*+ → ab*(c+d)+ → a+b*(c+d)
|
432 | 396 | ```
|
| 397 | +* statement:陈述语句。 |
| 398 | + ``` |
| 399 | + 例如 赋值语句(assign statement): var x=1 |
| 400 | + 例如 if语句(if statement): if(Expr){}[else if(){}]else{} |
| 401 | + ``` |
| 402 | +* if语句的分析: |
| 403 | + ``` |
| 404 | + parseIfStmt() → eat(if) → parseExpr() → parseBlock() → eat(else) → parseIfStmt() |
| 405 | + | eat(if) → parseExpr() → parseBlock() |
| 406 | + | eat(if) → parseExpr() → parseBlock() → eat(else) → parseBlock() (该过程可简化为一个parseBlock()) |
| 407 | + ``` |
| 408 | +* function语句的分析: |
| 409 | + ``` |
| 410 | + parseFnStmt() → eat(function) → eat(id) → eat(params) → parseBlock() |
| 411 | + params → e | param,params |
| 412 | + param → Literal(可能是id、number、string) |
| 413 | + ``` |
| 414 | +* class语句的分析: |
| 415 | + ``` |
| 416 | + parseClassStmt() → eat(class) → eat(id) → eat(extends) → eat(id) → parseBlock() |
| 417 | + | eat(class) → eat(id) → parseBlock() |
| 418 | + ``` |
| 419 | +* import语句的分析: |
| 420 | + ``` |
| 421 | + parseImportStmt() → eat(import) → eat(id | object | array) → eat(from) → eat(string) |
| 422 | + ``` |
| 423 | +* 整体的分析文法: |
| 424 | + ``` |
| 425 | + program → statements | e |
| 426 | + statements → statement statements | e |
| 427 | + statement → assignStmt | ifStmt | whileStmt | switchStmt | functionStmt | forStmt | classStmt |importStmt ... |
| 428 | + statement → statement + Expr | Expr + Literal | ... |
| 429 | + Expr → Expr + Term | Expr - Term | Expr |
| 430 | + Term → -Expr | (Expr) | Term * Literal | Term / Literal | Literal |
| 431 | + Literal → number | variable | string |
| 432 | + ``` |
433 | 433 | * [语法分析器代码入口](../src/parser/parser.ts)
|
0 commit comments