|
1 | 1 | # parser-stage 语法规范(同 step6) |
2 | 2 |
|
3 | | - |
4 | 3 | <pre id='vimCodeElement'> |
5 | 4 | <code></code> |
6 | 5 | <span class="SpecRuleStart">program</span> |
7 | 6 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">function</span> |
| 7 | + |
8 | 8 | <span class="SpecRuleStart">function</span> |
9 | | -<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'('</span> <span class="SpecToken">')'</span> <span class="SpecToken">'{'</span> <span class="SpecRule">block_item</span><span class="SpecOperator">*</span> <span class="SpecToken">'}'</span> |
| 9 | +<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'('</span> <span class="SpecToken">')'</span> <span class="SpecRule">compound_statement</span> |
10 | 10 | <span class="SpecRuleStart">type</span> |
11 | 11 | <span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'int'</span> |
| 12 | + |
| 13 | +<span class="SpecRuleStart">compound_statement</span> |
| 14 | +<span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'{'</span> <span class="SpecRule">block_item</span><span class="SpecOperator">*</span> <span class="SpecToken">'}'</span> |
| 15 | + |
12 | 16 | <span class="SpecRuleStart">block_item</span> |
13 | 17 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">statement</span> |
14 | 18 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">declaration</span> |
| 19 | + |
15 | 20 | <span class="SpecRuleStart">statement</span> |
16 | 21 | <span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'return'</span> <span class="SpecRule">expression</span> <span class="SpecToken">';'</span> |
17 | | -<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">expression</span><span class="SpecOperator">?</span> <span class="SpecToken">';'</span> |
18 | | -<span class="SpecRuleIndicator"> |</span> <span class="SpecToken">'if'</span> <span class="SpecToken">'('</span> <span class="SpecRule">expression</span> <span class="SpecToken">')'</span> <span class="SpecRule">statement</span> <span class="SpecOperator">(</span><span class="SpecToken">'else'</span> <span class="SpecRule">statement</span><span class="SpecOperator">)?</span> |
| 22 | +<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">compound_statement</span> |
19 | 23 | <span class="SpecRuleStart">declaration</span> |
20 | 24 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecOperator">(</span><span class="SpecToken">'='</span> <span class="SpecRule">expression</span><span class="SpecOperator">)?</span> <span class="SpecToken">';'</span> |
| 25 | + |
21 | 26 | <span class="SpecRuleStart">expression</span> |
22 | 27 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">assignment</span> |
| 28 | + |
23 | 29 | <span class="SpecRuleStart">assignment</span> |
24 | 30 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">conditional</span> |
25 | 31 | <span class="SpecRuleIndicator"> |</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'='</span> <span class="SpecRule">expression</span> |
| 32 | + |
26 | 33 | <span class="SpecRuleStart">conditional</span> |
27 | 34 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">logical_or</span> |
28 | 35 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_or</span> <span class="SpecToken">'?'</span> <span class="SpecRule">expression</span> <span class="SpecToken">':'</span> <span class="SpecRule">conditional</span> |
| 36 | + |
29 | 37 | <span class="SpecRuleStart">logical_or</span> |
30 | 38 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">logical_and</span> |
31 | 39 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_or</span> <span class="SpecToken">'||'</span> <span class="SpecRule">logical_and</span> |
| 40 | + |
32 | 41 | <span class="SpecRuleStart">logical_and</span> |
33 | 42 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">equality</span> |
34 | 43 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_and</span> <span class="SpecToken">'&&'</span> <span class="SpecRule">equality</span> |
| 44 | + |
35 | 45 | <span class="SpecRuleStart">equality</span> |
36 | 46 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">relational</span> |
37 | 47 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">equality</span> <span class="SpecOperator">(</span><span class="SpecToken">'=='</span><span class="SpecOperator">|</span><span class="SpecToken">'!='</span><span class="SpecOperator">)</span> <span class="SpecRule">relational</span> |
| 48 | + |
38 | 49 | <span class="SpecRuleStart">relational</span> |
39 | 50 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">additive</span> |
40 | 51 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">relational</span> <span class="SpecOperator">(</span><span class="SpecToken">'<'</span><span class="SpecOperator">|</span><span class="SpecToken">'>'</span><span class="SpecOperator">|</span><span class="SpecToken">'<='</span><span class="SpecOperator">|</span><span class="SpecToken">'>='</span><span class="SpecOperator">)</span> <span class="SpecRule">additive</span> |
| 52 | + |
41 | 53 | <span class="SpecRuleStart">additive</span> |
42 | 54 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">multiplicative</span> |
43 | 55 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">additive</span> <span class="SpecOperator">(</span><span class="SpecToken">'+'</span><span class="SpecOperator">|</span><span class="SpecToken">'-'</span><span class="SpecOperator">)</span> <span class="SpecRule">multiplicative</span> |
| 56 | + |
44 | 57 | <span class="SpecRuleStart">multiplicative</span> |
45 | 58 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">unary</span> |
46 | 59 | <span class="SpecRuleIndicator"> |</span> <span class="SpecRule">multiplicative</span> <span class="SpecOperator">(</span><span class="SpecToken">'*'</span><span class="SpecOperator">|</span><span class="SpecToken">'/'</span><span class="SpecOperator">|</span><span class="SpecToken">'%'</span><span class="SpecOperator">)</span> <span class="SpecRule">unary</span> |
| 60 | + |
47 | 61 | <span class="SpecRuleStart">unary</span> |
48 | 62 | <span class="SpecRuleIndicator"> :</span> <span class="SpecRule">primary</span> |
49 | 63 | <span class="SpecRuleIndicator"> |</span> <span class="SpecOperator">(</span><span class="SpecToken">'-'</span><span class="SpecOperator">|</span><span class="SpecToken">'~'</span><span class="SpecOperator">|</span><span class="SpecToken">'!'</span><span class="SpecOperator">)</span> <span class="SpecRule">unary</span> |
| 64 | + |
50 | 65 | <span class="SpecRuleStart">primary</span> |
51 | 66 | <span class="SpecRuleIndicator"> :</span> <span class="SpecToken">Integer</span> |
52 | 67 | <span class="SpecRuleIndicator"> |</span> <span class="SpecToken">'('</span> <span class="SpecRule">expression</span> <span class="SpecToken">')'</span> |
53 | 68 | <span class="SpecRuleIndicator"> |</span> <span class="SpecToken">Identifier</span> |
54 | 69 | </pre> |
55 | | - |
|
0 commit comments