-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathC-- grammar productions.txt
81 lines (54 loc) · 1.92 KB
/
C-- grammar productions.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
C--产生式规则
2021年06月07日 08点43分
//P程序
P -> FP|ε
TYPE -> int | string | bool
//F函数
F -> TYPE id () { D_ALL S_ALL }
/* var_decl : id [ = expr ] */
V -> id V_ASSIGN
V_ASSIGN -> = E_ALGO @ActionAssign |ε
/* {type var_decl {',' var_decl} ';' } */
D_ALL -> D D_ALL | ε
D -> TYPE V D_SAME ;
D_SAME -> , V D_SAME | ε
E_LOGICAL -> E_LOGICAL_T E_LOGICAL_SEMI @ActionAnd
E_LOGICAL_SEMI -> && E_LOGICAL @ActionAndOp
E_LOGICAL_T -> E_LOGICAL_F E_LOGICAL_T_SEMI @ActionOr
E_LOGICAL_T_SEMI -> || E_LOGICAL_T @ActionOrOp
E_LOGICAL_F -> E_ALGO logical_op E_ALGO @ActionLogical
-> ( E_LOGICAL ) @ActionLogicalWithBracket
-> ! E_LOGICAL @ActionLogicalNot
E_ALGO -> E_ALGO_T E_ALGO_SEMI @ActionAddOrSub
E_ALGO_OP -> E_ALGO|ε
E_ALGO_SEMI -> + E_ALGO @ActionAddOp
| - E_ALGO @ActionSubOp
| ε
E_ALGO_T -> E_ALGO_F E_ALGO_T_SEMI @ActionMulOrDiv
E_ALGO_T_SEMI -> * E_ALGO_T @ActionMulOp
| / E_ALGO_T @ActionDivOp
| ε
E_ALGO_F -> (E_ALGO) | int | id
logical_op -> == | != | <= | >= | < | >
/* assg : id = expr ';' */
ASSG -> id = E_ALGO @ActionAssign
ASSG_OP -> ASSG | ε
/* {stmt} */
S_ALL -> S S_ALL | ε
/* stmt */
S -> S_IF | S_WHILE | S_FOR | S_RETURN | S_ASSG | S_BLOCK | S_END
/* if '(' expr ')' stmt [else stmt] */
S_IF -> if ( E_LOGICAL_F ) @ACTION_BEGIN_IF_TRUE S @ACTION_IF_TRUE_DONE S_ELSE
S_ELSE -> else @ACTION_BEGIN_ELSE S @ACTION_ELSE_DONE | ε @ACTION_ELSE_DONE
/* while '(' expr ')' stmt */
S_WHILE -> while ( @ACTION_WHILE_BEGIN E_LOGICAL @ACTION_WHILE_TERMINATE ) S @ACTION_WHILE_TERMINATE
/* for '(' ASSG_OP ';' E_OP ';' ASSG_OP ')' stmt */
S_FOR -> for ( ASSG_OP @ACTION_FOR_INIT ; E_LOGICAL_OP @ACTION_FOR_TERMINATE ; ASSG_OP @ACTION_FOR_INCREMENT ) S @ACTION_FOR_DONE
/* return [expr] ';' */
S_RETURN -> return E_ALGO_OP ;
/* assg ';' */
S_ASSG -> ASSG ;
/* '{' {stmt} '}' */
S_BLOCK -> { S_ALL }
/* ';' */
S_END -> ;