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

时间:2017-12-30 13:26:31

标签: c parsing bison yacc lex

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

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是否可以(并且方便)尝试解决此问题?
  • 如果有可能,这可能是解决问题的好方法吗?

1 个答案:

答案 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
      ;