我想知道是否有可能在给定的序列中识别某个序列。lex
生成三种不同的令牌:START
,AMINO
,STOP
。我想通过YACC
来识别所有以START
开头、有一系列AMINO
标记、以STOP
结尾的序列。示例:START AMINO AMINO ... AMINO STOP
我以前从未使用过YACC/bison
,所以我尝试过:
%%
seq_2: START seq_1 STOP {printf("%s", $2);};
seq_1: seq_1 AMINO
%%
但这些规则行不通。
通过
lex
和YACC
来解决这个问题是否可能(而且方便)?如果有可能的话,哪种方法是解决问题的好办法?
最佳答案
您可能会得到一个错误,因为在“seq_1”规则的末尾没有分号。例如:
seq_1 : seq_1 AMINO ;
而且,正如你目前所拥有的,seq_1不可能终止。你可以通过给它一个附加的终端规则来解决这个问题。
如果“seq_1”为空是有效的,那么您可以执行以下操作:
seq_1 : seq_1 AMINO ;
seq_1 : ;
或者,更典型的说法是:
seq_1 : seq_1 AMINO
|
;
如果在开始和停止之间应该始终至少有一个氨基,那么请这样做:
seq_1 : AMINO
| seq_1 AMINO
;