Skip to content

开发相关

mzz edited this page Aug 6, 2021 · 3 revisions

在 docker 环境中开发

docker-compose -f docker-compose.dev.yml up --build

gin 会监测文件改动并热重载,见codegangsta/gin

如果出现ERROR: ...Connot start service...container...is not running,尝试添加参数-V

RoutingA

EBNF

<程序>::=<行>{\n<行>}
<行>::=<说明>|<路由规则>
<说明>::=<标识符>:<定义语句>
<定义语句>::=<标识符>=<调用>
<调用>::=<标识符>(<参数列表>)
<参数列表>::=<值>{,<值>}{,<值>:<值>}|<值>:<值>{,<值>:<值>}
<值>::={<非界符>}|"{<字符>}"|'{<字符>}'
<非界符>::=<除<界符>外的所有字符>
<界符>::=,|'|"|(|)
<路由规则>::=<调用>{&&<调用>}-><标识符>
<标识符>::=<字母>{<字母>|<数字>}
<字母>::=a|b|...|Y|Z
<数字>::=0|1|...|9

分析

基于LR(1)文法(有两个状态存在特例[special1]),见csv

https://www.processon.com/view/link/5daf2228e4b06b7d6fb92480

<程序>::=<行>{\n<行>}
<行>::=<说明>|<路由规则>
<说明>::=<标识符>:<定义语句>
<定义语句>::=<标识符>=<调用>
<调用>::=<标识符>(<参数列表>)
<参数列表>::=<值>{,<值>}{,<值>:<值>}|<值>:<值>{,<值>:<值>}
<值>::={<非界符>}|"{<字符>}"|'{<字符>}'
<非界符>::=<除<界符>外的所有字符>
<界符>::=,|'|"|(|)
<路由规则>::=<调用>{&&<调用>}-><标识符>
<标识符>::=<字母>{<字母>|<数字>}
<字母>::=a|b|...|Y|Z
<数字>::=0|1|...|9
0	*->S
1	S->AR
2	R->rAR
3	R->ε
4	A->B
5	A->C
6	B->D:E
7	E->D=F
8	F->D\(G\)
9	G->HMN
10	M->,HM
11	M->ε
12	N->,H:HN
13	N->ε
14	G->H:HN
15	H->O
16	O->IO
17	O->ε
18	H->'Y'
19	H->"Z"
20	Y->UY
21	Y->ε
22	Z->VZ
23	Z->ε
24	C->FQ->D
25	Q->&&FQ
26	Q->ε
27	D->kT
28	T->kT
29	T->lT
30	T->ε
31	U->k
32	U->l
33	U->n
34	U->y
35	V->k
36	V->l
37	V->n
38	V->z
39	I->k
40	I->l
41	I->n
42	k->a|b|...|Y|Z|...|...||...
43	l->0|1|...|9
44	n->除了界符o和:&->=的标点符号
45	o->,|'|"|\(|\)
46	y->,|"|\(|\)
47	z->,|'|\(|\)
48	E->D
49  A->ε
50  r->\n
FIRST(S')=FIRST(S)={k}
FIRST(S)=FIRST(A)={k}
FIRST(R)={\n ε}
FIRST(A)=FIRST(B) ∪ FIRST(C)={k}
FIRST(B)=FIRST(D)={k}
FIRST(C)=FIRST(F)={k}
FIRST(D)={k}
FIRST(E)=FIRST(D)={k}
FIRST(F)=FIRST(D)={k}
FIRST(G)=FIRST(H)={ k l n ε ' " }
FIRST(M)={ , ε }
FIRST(N)={ , ε }
FIRST(H)=FIRST(O) ∪ {' "}={ k l n ' " ε }
FIRST(Y)=FIRST(U) ∪ {ε}={ k l n , " ( ) ε }
FIRST(Z)=FIRST(V) ∪ {ε}={ k l n , ' ( ) ε }
FIRST(U)={k l n , " ( )}
FIRST(V)={k l n , ' ( )}
FIRST(O)=FIRST(I) ∪ {ε}={ k l n ε }
FIRST(Q)={& ε}
FIRST(T)={k l ε}
FIRST(I)={k l n}

FOLLOW(S')={#}
FOLLOW(S)=FOLLOW(S')={#}
FOLLOW(R)=FOLLOW(S)={#}
FOLLOW(A)=FIRST(R)-ε followR={ \n # }
FOLLOW(B)=FOLLOW(A)={\n #}
FOLLOW(C)=FOLLOW(A)={\n #}
FOLLOW(D)={ : = ( } ∪ FOLLOW(C) followE={ : = ( \n # }
FOLLOW(E)=FOLLOW(B)={\n #}
FOLLOW(F)=FOLLOW(E) ∪ FIRST(Q) followQ={\n # & -}
FOLLOW(G)={)}
FOLLOW(M)=FIRST(N)-ε followG={ , ) }
FOLLOW(N)=FOLLOW(G)={ ) }
FOLLOW(H)=(FIRST(M)-ε) ∪ followG followM followN ∪ {:} ∪ FIRST(N)={ , : ) }
FOLLOW(Y)={'}
FOLLOW(Z)={"}
FOLLOW(U)=FIRST(Y)-{ε} followY={ k l n , ' " ( ) }
FOLLOW(V)=FIRST(Z)-{ε} followZ={ k l n , ' " ( ) }
FOLLOW(O)=FOLLOW(H)={ , : ) }
FOLLOW(P)={ ' " }
FOLLOW(Q)={ - }
FOLLOW(T)=FOLLOW(D)={ : = ( \n # }
FOLLOW(I)=FIRST(O)-ε followO={ k l n , : ) }