|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 `) d3 \0 L' \
Unix下有很强大的专用代码生成器,如用yacc/lex来构建语法分析器和词法分析器、用autoconf或automake生成makefile等。这些工具具有很强大的功能,但还有一些简单轻巧的代码生成方式,下面是《Unix编程艺术》中的两个例子。. H. u; l" F* n) l: s. T* A
3 d8 S/ r! n/ O( g
. }( s$ ]" @3 B/ F$ _4 U3 A/ O生成ASCII显示的代码
" ~# Y$ N& V' {1 _* t$ G
6 Z4 l$ Q( D! W) [( t3 ]. m# A& g9 b/ ?- N& @' ]* }
如果在程序中直接通过初始化器来写出所有行,会出现对齐、每行很难保证79字符的问题。Ascii源码的解决方法是通过脚本生成这部分代码。
P" G( W- |( {! t, Y( o ^% S. s, F' a0 Q9 H
void; B& P0 d# ]% m& N0 N
) O9 k9 D: r( m3 d
showHelp(FILE *out, char *progname)
4 e) j% D, G1 P$ Y" C. b6 i! T M% ^( j; A" z
{' e. Y) i7 {# \: o
" n/ O+ M. v# A6 Hfprintf(out,"Usage: %s [-dxohv] [-t] [char-alias...]\n", progname);
4 Z! N0 I( X: C& T/ P; x0 z D, O3 W C! c, x; H: S8 w: x% J# i
#define P(s) fputs(s "\n", out);" J) V3 \2 X$ t+ O8 T1 ?+ s3 L7 {
1 a' h$ c. J6 k( _" t( @, y, z
#include "splashscreen.h"
* E1 p4 _2 b9 l% }8 _4 R+ E5 z" A9 o/ g1 }1 x
#undef P
7 ?* x6 E8 I/ g9 x" i5 `4 Z" i# k+ O1 B* C# M
2 W, B# q7 p" E+ C
1 {1 n6 O; |) `( Cexit(0);
+ o/ v! o3 E7 q* \+ o' ~, p s B
* W# _* T' c% o1 h3 c3 `}
3 r2 v& |( Z2 H8 p& f7 {5 }. e4 O! s/ C
) R8 [2 S/ y' ^; }( ~$ g# I+ l) ]5 J& _
splashscreen.h由Makefile生成:/ Q0 U9 p) ^2 `, Z' X0 z
b, \- O1 f+ J* M7 [; H# e" K. Q
splashscreen.h: splashscreen, m7 C. p% C4 X+ e) g7 N& a
. h3 p' Z- B* G# ~/ f/ t$ g7 b
sed <splashscreen >splashscreen.h -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/.*/P("&");/'
4 r/ ]" @2 p4 h& @& b6 F9 k
5 f2 W4 _7 [ ^从数据产生代码,使得可编辑的用法屏幕和它的显示一致。
5 x! v; S+ v% `9 i8 B8 {9 w8 J6 U
: L$ N1 u) S D+ s% o6 a
: }3 G* l* w, Y, w为列表生成HTML代码. I* m4 d# R( z# z! ^
0 O9 f6 ]) q0 | [2 \8 d
6 C0 n [6 x+ r* g- Z# {. R q我们可以在代码中直接编写生成HTML表格的代码,但这样每当新添加数据的时候都需要修改生成<tc>和<td>的代码。更好的解决方案是把数据放在类似下面的文本文件中:
0 R0 q* @7 S) r) Q! d6 J: T# x9 |) q5 [8 f# x% b' [: ^
Aalat :David Weber :The ARMageddon
) L+ M9 k3 O3 h- E5 u: G# \- V( X2 y1 ?2 o. @
Aelmos :Alan Dean Foster :The man+ B4 K$ ~& s6 g
. g4 t; C, {2 V, t0 G
Agandar :Donald Kingsbury :Psychohistorical Crisis; Y1 Q- _$ s+ V) n7 w. h
- |- R' k& {. E7 l而使用脚本来生成HTML表格:
2 _1 U, x/ A+ {2 U
( {5 m% x: Z- ?- w1 ~! l# cat data | awk -F: '{printf("<tr><td>%s</td><td>%s</td></tr>\n",$1,$2,$3)}'8 N0 P0 ]; g* g* j8 j2 l. ~
! Y1 F) \+ G) u3 B3 m; G<tr><td>Aalat </td><td>David Weber </td></tr>
0 y8 U; p- |5 a7 \+ m5 d7 {# ^) {8 ^1 L% _4 Q ^, `
<tr><td>Aelmos </td><td>Alan Dean Foster </td></tr>/ B: }7 @! l2 r8 }) r4 I
" w! Y# K( p8 ~<tr><td>Agandar </td><td>Donald Kingsbury </td></tr>8 e) e% x/ [$ P B5 o1 m
. k8 @5 b6 ~2 F4 {
, N3 `, _7 g; w4 x# L( c
5 p% v: ?8 R( F% F6 b$ z
代码生成的好处:: v, Y+ t3 _% X7 ~1 f
! K k, w' B6 }8 x尽可能少干活;
# i' N& S4 ?, G+ g# V( \1 O, w+ ]% |7 e; J
让数据塑造代码;
* s* l* Z9 _7 f7 B
* K' ^: N3 H2 J0 A依靠工具;
1 A! n) S8 W+ `# Q6 d3 e! V: `2 ~' c& q
机制同测试分离。1 m! ?- v! X+ E+ C4 J" `
|
|