7

我需要使用 flex 和 bison 来解析一些代码。

YYSTYPE 的默认类型是int,尽管我从来没有这样声明过。这是野牛的默认设置吗?

将字符串传回对我有很大帮助。我读到这个:如何解决 Bison 警告“...没有声明的类型” 这看起来是个好方法。(我还不需要联合的全部功能,只需要 char* 部分,但我不妨使用联合,因为它以后可能会有所帮助。)

它不适合我。我收到这些错误:

y:111.37-38: $1 of `ConstExpression' has no declared type
y:113.34-35: $1 of `ConstFactor' has no declared type
y:114.35-36: $1 of `ConstFactor' has no declared type
y:119.34-35: $1 of `Type' has no declared type
y:109.23-48: warning: type clash on default action: <str> != <>
y:115.23-27: warning: type clash on default action: <str> != <>
[...more of the same snipped...]

以下是我的y语法文件中的声明:

%union {
     char *str;
 }

%type<str> ConstExpression ConstFactor Type

.l这是我文件中的一行:

[a-zA-Z]+[a-zA-Z0-9]*   { yylval.str = strdup(yytext); return yident;}

我还需要做什么来解决错误?

4

2 回答 2

6

实际上,我很确定我不看语法就知道出了什么问题。

也有必要声明终端符号的类型,因为它们可以并且经常确实返回语义值。ID想想像和这样的东西NUMBER,它们有yyval数据。但是 yacc 没有任何方法可以知道它只是一个'x'还是更多,并且规则中的默认操作是:$$ = $1

例如,以下语法通过 yacc 就可以了,但请尝试从%type下面再删除一个符号:

%union {
  char *s;
}

%type <s> r1 r2 'x'

%%

r1: r2;

r2: 'x'   { printf("%s\n", $1); };
于 2009-11-25T02:41:16.530 回答
3

you probably just need to define types for your tokens in the yacc file

%token<str> yident
于 2009-12-03T23:52:04.587 回答