0

我尝试解决这个问题,答案是选项 c。但在少数教科书中给出的答案是选项b。我很困惑正确的答案是什么?请帮帮我在此处输入图像描述

4

1 回答 1

2

GAAAAT是正确答案;它是由解析器产生的输出,它尊重翻译规则中的动作顺序(其中一些发生在规则中间)。

Yacc/bison 就是这样一种解析器,它可以很容易地验证:

%{
#include <ctype.h>
#include <stdio.h>
void yyerror(const char* msg) {
  fprintf(stderr, "%s\n", msg);
}
int yylex(void) {
  int ch;
  while ((ch = getchar()) != EOF) {
    if (isalnum(ch)) return ch;
  }
  return 0;
}
%}
%%
S: 'p'    { putchar('G'); } P 
P: 'q'    { putchar('A'); } Q
P: 'r'    { putchar('T'); } 
P: %empty { putchar('E'); } 
Q: 's'    { putchar('A'); } P
Q: %empty { putchar('O'); }
%%
int main(void) {
  yyparse();
  putchar('\n');
}
$ bison -o gate.c gate.y
$ gcc -std=c99 -Wall -o gate gate.c
$ ./gate<<<pqsqsr
GAAAAT

如果我们修改语法以将所有动作放在各自规则的末尾,我们得到答案 (b)。(除了语法,其他都和前面的例子一样,所以我只展示新的翻译规则。)

S: 'p'    P { putchar('G'); } 
P: 'q'    Q { putchar('A'); }
P: 'r'    { putchar('T'); } 
P: %empty { putchar('E'); } 
Q: 's'    P { putchar('A'); } 
Q: %empty { putchar('O'); }
$ bison -o gate_no_mra.c gate_no_mra.y
$ gcc -std=c99 -Wall -o gate_no_mra gate_no_mra.c
$ ./gate_no_mra<<<pqsqsr
TAAAAG
于 2020-09-20T15:47:15.817 回答