我想知道是否有可能在给定的序列中识别某个序列。
lex生成三种不同的令牌:STARTAMINOSTOP。我想通过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
%%

但这些规则行不通。
通过lexYACC来解决这个问题是否可能(而且方便)?
如果有可能的话,哪种方法是解决问题的好办法?

最佳答案

您可能会得到一个错误,因为在“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
      ;

07-24 09:25