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

问题描述 投票:0回答:1

我想知道是否有可能在给定系列内部识别某个序列。

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试图解决这个问题是否可能(而且方便)?
  • 如果有可能,这可能是解决它的好方法吗?
c parsing bison yacc lex
1个回答
2
投票

您可能会收到错误,因为“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
      ;
© www.soinside.com 2019 - 2024. All rights reserved.