我们如何定义用于识别给定系列中特定序列的规则?
How can we define rules for identifying a certain sequence in a given series?
我想知道是否可以识别给定系列中的特定序列。
lex
产生三个不同的标记:START
、AMINO
、STOP
。我想通过 YACC
识别所有以 START
开头、具有一系列 AMINO
标记并以 STOP
结尾的序列。示例:START AMINO AMINO ... AMINO STOP
我从来没有用过YACC/bison
,所以我尝试过:
%%
seq_2: START seq_1 STOP {printf("%s", );};
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
;
我想知道是否可以识别给定系列中的特定序列。
lex
产生三个不同的标记:START
、AMINO
、STOP
。我想通过 YACC
识别所有以 START
开头、具有一系列 AMINO
标记并以 STOP
结尾的序列。示例:START AMINO AMINO ... AMINO STOP
我从来没有用过YACC/bison
,所以我尝试过:
%%
seq_2: START seq_1 STOP {printf("%s", );};
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
;