Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 07c646d

Browse files
Update README.md
1 parent 53a929c commit 07c646d

File tree

1 file changed

+38
-38
lines changed

1 file changed

+38
-38
lines changed

‎02_语法分析/README.md

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@
299299
![LL和LR的范围](imgs/LL(k)和LR(k)的解析范围.jpg)
300300

301301
* 该js parse将采用手写递归下降parser:从LL1开始,如果遇到实在不能解析的语法再扩大lookahead范围或加入ad-hoc,即自顶向下递归下降 + lookahead + ad-hoc + 运算符优先级 → AST
302-
* 表达式自顶向下分析方法过程:解析过程是通过3个解析函数,按照解析顺序自顶向下:parseExpr() → parseTerm() → parseLiteral()
302+
* 简单表达式的解析过程:解析过程是通过3个解析函数,按照解析顺序自顶向下:parseExpr() → parseTerm() → parseLiteral()
303303
* EOF:end of file,程序编写中的一个小技巧,将EOF加入到tokens流的结尾,避免一些边界条件判断,俗称"哨兵"
304304
* 表达式顺序解析:但是该解析存在优先级的问题
305305
```
@@ -344,43 +344,7 @@
344344
Term → LiteralTerm` | -ExprTerm` | (Expr)Term`
345345
Term` → *Term | /Term | e
346346
```
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只能解决+-*/这种简单表达式的优先级问题,多层优先级问题使用后序遍历算法解决
384348
* 中序表达式:例如:a+b*c、a*b+c。树节点的左子树一定比右子树先遍历,即先处理左树再节点再右树,但不太适合解析
385349
* 后序表达式:例如:ab+c*、ab*c+,适合解析
386350
* 中序转换为后序:
@@ -430,4 +394,40 @@
430394
6其他出栈 → stack: ,abcd+*+
431395
7abcd+*+ → ab(c+d)*+ → ab*(c+d)+ → a+b*(c+d)
432396
```
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+
```
433433
* [语法分析器代码入口](../src/parser/parser.ts)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /