我想知道是否有可能在给定系列中识别某个序列。
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
是否可以(并且方便)尝试解决此问题?答案 0 :(得分:2)
您可能会收到错误,因为您的' seq_1'结尾处没有分号。规则。 E.g:
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
;