【问题标题】:How can we define rules for identifying a certain sequence in a given series?我们如何定义规则来识别给定系列中的某个序列?
【发布时间】:2017-12-30 13:26:31
【问题描述】:

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

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 尝试解决此问题?
  • 如果可能的话,哪一种是解决问题的好方法?

【问题讨论】:

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

标签: c parsing bison yacc lex


【解决方案1】:

您可能会遇到错误,因为您的“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
      ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2015-01-17
    • 2023-04-06
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多