« 这个假期没得玩 | 首页 | PIFdb --> SRS (2) »
May 01, 2004
PIFdb --> SRS (1)
这简直是解读天书,SRS是英国的LION公司开发的数据库平台,有他独特的语法规则($rule),这些语法代码就是一本天书。
截取genbank.is中的一小段:
以下内容为程序代码:
$rules={
# entry and fields
entry: ~ {$In:[file:text] pre {$write=1 $Skip:0} $Out}
('LOCUS ' {$Not} lnT)*
(/LOCUS +([^ \n]+)[^\n]*\n?/ {$entryFip=$Fip $entryName=$1 $str=$Ct}
( 'VERSION ' {$Not} (lnT {$str.+=$Ct}))+
/VERSION +([A-Z_0-9]+)[^\n]*\n?/ {$acc=$1 $str.+=$Ct
if[img]/images/frown.gif[/img]$checkname.!='[img]/images/wink.gif[/img] {
# We need to check that we can use this entry
$filelist=$gbcheck.query:["[($checkname)-acc[img]/images/frown.gif[/img]$acc)]" sortOn:dat sortDir:2]
if[img]/images/frown.gif[/img]$filelist.size:[]>1) {
$hit=$filelist.getEntry
$ver=$JobFile.name:name
if[img]/images/frown.gif[/img]$ver.!=$hit.entry_nm) {
$Print:|Not using $acc from $ver - will use $hit.entry_nm
$write=0
}
}
}
if[img]/images/frown.gif[/img]$write==1) $Wrt:[s:$str]}
(/[O\/][R\/]/ {$Not} lnT {if[img]/images/frown.gif[/img]$write==1) $App})* ln?)?
~
lnT: ~ /[^\n]*\n?/ ~ # line terminator may be missing if truncated
fields: ~ {$In:entry $Out $Skip:1}
(ftList | / *([A-Z]+)[^\n]*\n/
{if:$fn.$1.=="" $dpe:"+++ unknown: $1 in $entryName +++"
$Wrt:$fn.$1} (/ [^\n]+[\n]+/ {$App})*)+ ~
ftList: ~ /FEATURES[^\n]*\n/ {$Wrt:ftTitle}
(/ [^ ][^\n]+\n/ {$Wrt:ft} / [^\n]+\n/* {$App})+ ~
到现在为止,我对$rule的几个关键命令有了一点了解,照样画葫芦,写了pif.is,已经可以分离出ID(识别号)和DE(描述)信息。
以下内容为程序代码:
#!/bin/env icarus
$rules={
# the entry
entry: ~ {$In:[file:text] $Out pre $Skip:0}
('ID' {$Not} ln)*
('ID' {$entryFip=$Fip $Wrt} ln {$App}
('ID' {$Not} ln {$App})*)?
~
# ln: ~ /[^\n]*\n/ {$Print:"...the line is |$Ct|\n"} ~
ln: ~ /[^\n]*\n/ ~
# the datafields
fields:~ {$In:entry $Out $Skip:1}
f_id f_xx* f_de?
~
f_id: ~ {$Wrt:id} 'ID' ln ~
f_xx: ~ 'XX' ln ('XX' ln)* ~
f_de: ~ {$Wrt:de} 'DE' ln ('DE' ln)* ~
# indexing
tag: ~ /../ ~
word: ~ /[a-zA-Z0-9_]+/ ~
noword: ~ /[^a-zA-Z0-9_]+/ ~
i_id: ~ {$In:[fields c:id] $Out:id}
# tag (word {$Wrt}|noword)* ~
tag word {$Wrt} ~
i_de: ~ {$In:[fields c:de] $Out:de}
tag (word {$Wrt}|noword)* ~
}
# testing
if: $TestMode {
$job = $Job:[prod:$rules
skip:'\t'
fileName:"/home/database/pif/os.pif"]
while:$job.hasInput {
$job.tokens:[entry print:n]
$job.tokens:[fields print:y]
#$job.tokens:[de print:y]
$job.reset
}
}
这里要注明的是,zy所写的PIFdb记录为了保持格式的美观,所以插入了一些空行,但是这些空行又并非空行,而仅仅是两个字符XX,并且出于开头。所以,我插入了 f_xx: ~ 'XX' ln ('XX' ln)* ~ 以匹配这样的空行。与之相对应的,fields也被修改为: fields: ~ $In:entry $Out $Skip:1} f_id f_xx* f_de? ~ 即插入了 f_xx
Posted by 西瓜 at May 1, 2004 09:07 AM