首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >野牛怎么写规则?

野牛怎么写规则?
EN

Stack Overflow用户
提问于 2013-10-11 05:56:15
回答 1查看 288关注 0票数 0

我有这样的规矩:

A --> a B C d,其中a, d是终端符号,B, C是非终端符号.

代码语言:javascript
复制
B -->   a1 | a2 | a3
C -->   a4 | a5 | a6

我用野牛写了这条规则:

代码语言:javascript
复制
  my_rule:
            a B C d   {   handler->handle_B_C(handle_B($2), handle_C($3)); }
  B :
      a1 { $$ = ONE; }
    | a2 { $$ = TWO; }
    | a3 { $$ = THREE; }
    ;
  C:
         a4 { $$ = FOUR; } 
      | a5  { $$ = FIVE; }
      | a6  { $$ = SIX  }

我希望这条规则是这样的:

代码语言:javascript
复制
   A --> a B
   A --> errorCase
   B --> a1 C | a2 C | a3 C
   B --> errorCase
   C --> a4 D | a5 D | a6D
   D --> d
   D -->errorCase

但我不知道怎么用野牛写。有人能帮我用野牛写吗?(我不知道如何得到B和D的值)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-16 03:16:26

以下语法被yacc(BSD)接受,没有任何问题。它也应该与bison(Linux)一起工作。

根据一般惯例,令牌通常是大写的,规则是小写的。

代码语言:javascript
复制
%token A A1 A2 A3 A4 A5 A6 A7 D

%%

a
    : A b {
        $$ = node($1, $2);
    }
    ;

b
    : A1 c {
        $$ = node($1, $2);
    }
    | A2 c {
         $$ = node($1, $2);
    }
    | A3 c {
         $$ = node($1, $2);
    }
    ;

c
    : A4 d {
         $$ = node($1, $2);
    }
    | A5 d {
         $$ = node($1, $2);
    }
    | A6 d {
         $$ = node($1, $2);
    }
    ;

d
    : D {
        $$ = node($1);
    }
    ;
%%

#include <stdio.h>

void yyerror(const char *s)
{
    fflush(stdout);
    fprintf(stderr, "*** %s\n", s);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19311187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档