Bison 野牛如何写规则?
我有这样一条规则:Bison 野牛如何写规则?,bison,bisonc++,Bison,Bisonc++,我有这样一条规则: A --> a B A --> errorCase B --> a1 C | a2 C | a3 C B --> errorCase C --> a4 D | a5 D | a6D D --> d D -->errorCase A-->A B C d,其中A、d是终端符号 和B、C是非终端符号 B --> a1 | a2 | a3 C --> a4 | a5 | a6
A --> a B
A --> errorCase
B --> a1 C | a2 C | a3 C
B --> errorCase
C --> a4 D | a5 D | a6D
D --> d
D -->errorCase
A-->A B C d
,其中A、d
是终端符号
和B、C
是非终端符号
B --> a1 | a2 | a3
C --> a4 | a5 | a6
我在《野牛》中写下了这条规则:
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 }
我想把这条规则写成这样:
A --> a B
A --> errorCase
B --> a1 C | a2 C | a3 C
B --> errorCase
C --> a4 D | a5 D | a6D
D --> d
D -->errorCase
但我不知道如何用野牛来写。有人能帮我用bison写吗?
(我不知道如何获得B和D的值)以下语法被yacc(BSD)接受,没有任何问题。它也应该与bison(Linux)一起工作 按照一般惯例,代币通常大写,规则为小写
%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);
}
%A标记A1 A2 A3 A5 A6 A7 D
%%
A.
:A b{
$$=节点($1,$2);
}
;
B
:A1 c{
$$=节点($1,$2);
}
|A2 c{
$$=节点($1,$2);
}
|A3 c{
$$=节点($1,$2);
}
;
C
:A4 d{
$$=节点($1,$2);
}
|A5 d{
$$=节点($1,$2);
}
|A6 d{
$$=节点($1,$2);
}
;
D
:D{
$$=节点($1);
}
;
%%
#包括
无效错误(常量字符*s)
{
fflush(stdout);
fprintf(标准字符,***%s\n”,s);
}
小心标记;flex lexer用于词法分析器;flex适用于Adobe/Apache UI框架。不要修改你的语法。只需插入错误恢复规则。当错误发生时,我不想继续,我只想报告正确的错误消息。您不必从错误恢复规则中恢复:)另请参阅Russ Cox的这篇文章: