Bison 野牛:尝试使用字符*

Bison 野牛:尝试使用字符*,bison,flex-lexer,Bison,Flex Lexer,我需要使用flex和bison来解析一些代码 YYSTYPE的默认类型是int,尽管我从未这样声明过。这是野牛的违约吗 把弦传回去对我有很大帮助。我读到:这看起来是一个很好的方法。(我还不需要工会的全部权力,只需要char*部分,但我也可以使用工会,因为它以后可能会有所帮助。) 这对我不起作用。我发现以下错误: y:111.37-38: $1 of `ConstExpression' has no declared type y:113.34-35: $1 of `ConstFactor' ha

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

YYSTYPE的默认类型是
int
,尽管我从未这样声明过。这是野牛的违约吗

把弦传回去对我有很大帮助。我读到:这看起来是一个很好的方法。(我还不需要工会的全部权力,只需要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...]
下面是我的
.l
文件中的一行:

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

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

事实上,我很确定我不看语法就知道哪里出了问题

还必须声明终端符号的类型,因为它们可以而且经常返回语义值。想想像
ID
NUMBER
这样的东西,它们有
yyval
数据。但是yacc无法知道它是否只是一个
'x'
或其他东西,规则中的默认操作是:
$$=$1

例如,下面的语法可以通过yacc正常运行,但请尝试从下面的
%type
中再删除一个符号:

%union {
  char *s;
}

%type <s> r1 r2 'x'

%%

r1: r2;

r2: 'x'   { printf("%s\n", $1); };
%union{
char*s;
}
%r1型r2'x'
%%
r1:r2;
r2:'x'{printf(“%s\n”,$1);};

您可能只需要在yacc文件中定义令牌的类型

%token<str> yident
%token-yident

你真的认为人们可以在没有看到的情况下调试你的语法文件吗?@Kinopiko,你真的投了反对票,因为他没有把整个作业都贴进去,然后说“给我看一下codez”?如果你只是说“我需要更多的信息;请发布整个语法文件”或诸如此类的话,你会死吗?@Kinopiko,当他发布你要求的信息时,你会撤消你的否决票吗?“这似乎太残酷了。”基诺皮科在这里透露:这是我的一个朋友,我鼓励他来这里寻求帮助解决这个问题。所以,我碰巧知道,他为了礼貌而试图编辑发布的信息量,而不仅仅是把他的作业目录的全部内容都扔到这里,说“为我做作业”。好吧,信息还不够,所以他需要再发一些。我还是觉得你太苛刻了。如果你真的想谈谈meta,我想我们可以。我在那里没有帐户,但如果你愿意,我会创建一个帐户。一个不夸大问题而引用完整源代码的好方法是将整个文件单击到。或者其他类似的服务,然后包括你得到的URL。我认为这是正确的-如果你在lex文件中返回一个char*,你就不会使用%type,它是用于bison类型的。。。
%token<str> yident