找回密码
 注册
关于网站域名变更的通知
查看: 339|回复: 1
打印 上一主题 下一主题

Unix编程的代码生成

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-15 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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" `
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 17:36 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表