我正在使用 Bison 2.4.1 和 Flex 2.5.35 创建语言解析器。但是我被 Bison 困住了,它给我同样的错误 3 个小时,我不明白为什么。
我有这个 Bison 语法文件mylang.y
:
%{
#include <stdio.h>
#include <stdlib.h>
#include <glib/gtree.h>
#include <glib/gnode.h>
#include "ast.h"
%}
%code requires {
struct my_value {
enum {
is_int,
is_str
} kind;
union {
int ival;
char *sval;
} u;
};
}
%define api.value.type {struct my_value}
%token KEYWORD
%token <u.sval> ID
%token <y.ival> NUM
...
%%
...
// Rules following, but still defining no action at all.
%%
// Nothing more
如您所见,我也在尝试定义语法和语法语义。这不像我自己编写所有代码,我遵循Bison Docs - %define directive中报告的示例。
在语义之前,一切正常:另外请注意,我的语法规则到目前为止还没有定义任何动作。所以它们只是一堆非常简单的规则。此外,在添加语义之前,我通过 Bison 解析器生成器处理了文件,一切都很顺利。
当我尝试通过 Bison 放置这个东西时:
bison -vd --report=state,itemset --graph mylang.y
我收到此错误:
mylang.y:20.24-40:语法错误,意外 {...}
错误中报告的行是%define
指令所在的行。我不明白如何度过这个难关。我究竟做错了什么?谢谢你。