我们如何定义用于识别给定系列中特定序列的规则?

How can we define rules for identifying a certain sequence in a given series?

我想知道是否可以识别给定系列中的特定序列。

lex 产生三个不同的标记:STARTAMINOSTOP。我想通过 YACC 识别所有以 START 开头、具有一系列 AMINO 标记并以 STOP 结尾的序列。示例:START AMINO AMINO ... AMINO STOP

我从来没有用过YACC/bison,所以我尝试过:

%%
seq_2: START seq_1 STOP {printf("%s", );};
seq_1: seq_1 AMINO
%%

但是这些规则不起作用。

您可能会遇到错误,因为 'seq_1' 规则末尾没有分号。例如:

seq_1 : seq_1 AMINO ;

此外,正如您目前拥有的那样,seq_1 不可能永远终止。您可以通过给它一个额外的终端规则来解决这个问题。

如果 'seq_1' 为空是有效的,那么您可以按如下方式进行:

seq_1 : seq_1 AMINO ;
seq_1 : ;

或者,更典型的写法是:

seq_1 : seq_1 AMINO
      |
      ;

如果在 START 和 STOP 之间应该始终至少有一个 AMINO,那么这样做:

seq_1 : AMINO
      | seq_1 AMINO
      ;