C 我们如何定义规则来识别给定序列中的特定序列?

C 我们如何定义规则来识别给定序列中的特定序列?,c,parsing,bison,yacc,lex,C,Parsing,Bison,Yacc,Lex,我想知道是否有可能在给定的序列中确定某个序列 lex产生三种不同的令牌:START,AMINO,STOP。我想通过YACC,识别所有以start开头、有一系列AMINO标记、以STOP结尾的序列。示例:START氨基。。。氨基止动块 我以前从未使用过YACC/bison,因此我尝试过: %% seq_2: START seq_1 STOP {printf("%s", $2);}; seq_1: seq_1 AMINO %% 但这些规则不起作用 通过lex和YACC解决此问题是否可能(且方便)

我想知道是否有可能在给定的序列中确定某个序列

lex
产生三种不同的令牌:
START
AMINO
STOP
。我想通过
YACC
,识别所有以
start
开头、有一系列
AMINO
标记、以
STOP
结尾的序列。示例:
START氨基。。。氨基止动块

我以前从未使用过
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
      |
      ;
如果在开始和停止之间始终至少有一个氨基,则按如下方式进行:

seq_1 : AMINO
      | seq_1 AMINO
      ;

您可能会遇到错误,因为“seq_1”规则末尾没有分号。例如:

seq_1 : seq_1 AMINO ;
此外,正如您目前所拥有的,seq_1不可能终止。你可以通过给它一个额外的规则来解决这个问题,这个规则是终端

如果'seq_1'为空是有效的,那么您可以按如下操作:

seq_1 : seq_1 AMINO ;
seq_1 : ;
或者,更典型地说,是这样写的:

seq_1 : seq_1 AMINO
      |
      ;
如果在开始和停止之间始终至少有一个氨基,则按如下方式进行:

seq_1 : AMINO
      | seq_1 AMINO
      ;

你说的“不工作”是什么意思?你能详细说明一下吗?
seq_1
的语义规则应该是什么?您知道
seq_1
是一个无限递归规则,没有什么可以阻止它(我想这是您的问题)?也许你应该去找一些关于YACC的好教程(到处都有成千上万的)?《野牛手册》本身就有一个非常好的教程。规则说:要构建一个
seq_2
,首先需要一个
seq_1
。要构建一个
seq_1
,您还需要一个
seq_1
。没有什么可以让你开始;语法不可能满足。@某个程序员的问题是如何编写规则,指定如何查找由
START
STOP
分隔的序列。我读过一些教程和手册,但我还不清楚如何在
YACC
中实现这组规则。你说的“不工作”是什么意思?你能详细说明一下吗?
seq_1
的语义规则应该是什么?您知道
seq_1
是一个无限递归规则,没有什么可以阻止它(我想这是您的问题)?也许你应该去找一些关于YACC的好教程(到处都有成千上万的)?《野牛手册》本身就有一个非常好的教程。规则说:要构建一个
seq_2
,首先需要一个
seq_1
。要构建一个
seq_1
,您还需要一个
seq_1
。没有什么可以让你开始;语法不可能满足。@某个程序员的问题是如何编写规则,指定如何查找由
START
STOP
分隔的序列。我已经阅读了一些教程和手册,但我还不清楚如何在
YACC
中实现这组规则。