我想知道是否有可能在给定系列内部识别某个序列。
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
|
;
如果在START和STOP之间总是应该至少有一个AMINO,那么就这样做:
seq_1 : AMINO
| seq_1 AMINO
;