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 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
中实现这组规则。