Objective c 目标C和野牛警告:流浪`@';

Objective c 目标C和野牛警告:流浪`@';,objective-c,bison,yacc,Objective C,Bison,Yacc,当我使用bison生成解析器时,我得到以下警告: warning: stray `@' 但这是因为我有一些法律目标-C代码包含@,例如,这是一条有警告的规则: file : axiom production_rule_list { NSLog(@"file"); } ; 在代码中使用@是否存在任何风险?如果不是,如何告诉bison它是合法使用@ 提前感谢。根据中的文档,大括号之间的代码应该是C代码。因此,我怀疑您是否可以在那里使用objective-c结构 但是,您可以创建一

当我使用bison生成解析器时,我得到以下警告:

warning: stray `@'
但这是因为我有一些法律目标-C代码包含
@
,例如,这是一条有警告的规则:

file : axiom production_rule_list    { NSLog(@"file"); }
     ;
在代码中使用
@
是否存在任何风险?如果不是,如何告诉bison它是合法使用
@


提前感谢。

根据中的文档,大括号之间的代码应该是C代码。因此,我怀疑您是否可以在那里使用objective-c结构

但是,您可以创建一个外部C函数来完成以下工作:

Logit(char* message)
{
  NSLog(@"%s",message);
}
在野牛行动中使用它

file : axiom production_rule_list    { Logit("file"); }
     ;

根据中的文档,大括号之间的代码似乎应该是C代码。因此,我怀疑您是否可以在那里使用objective-c结构

但是,您可以创建一个外部C函数来完成以下工作:

Logit(char* message)
{
  NSLog(@"%s",message);
}
在野牛行动中使用它

file : axiom production_rule_list    { Logit("file"); }
     ;

这个信息只是一个警告。你可以忽略它。如果您使用的是Xcode,它甚至不会在其问题导航器中显示警告


将Bison输入文件重命名为具有
.ym
扩展名,而不是
.y
扩展名。这告诉Xcode这是一个带有Objective-C操作的语法。

该消息只是一个警告。你可以忽略它。如果您使用的是Xcode,它甚至不会在其问题导航器中显示警告


将Bison输入文件重命名为具有
.ym
扩展名,而不是
.y
扩展名。这会告诉Xcode它是一个带有Objective-C动作的语法。

如果要抑制警告,可以使用
\define AT@


大括号中的代码只是复制的,除了用代码替换$…序列以提供相关标记之外。这似乎对Objective-C很有效,不过如果使用ARC,可能需要进行一些挖掘(或者只添加额外的块(在C意义上)),以确保尽快释放对象。

如果要抑制警告,可以使用
#define AT@



大括号中的代码只是复制的,除了用代码替换$…序列以提供相关标记之外。这在Objective-C中似乎可以正常工作,不过如果使用ARC,可能需要进行一些挖掘(或者只是添加额外的块(在C意义上)),以确保尽快释放对象。

查看此线程:谢谢,但问题不在gcc编译期间,但是,当我用bison生成解析器时,@robmayoff的可能重复项我的问题只是bison警告,而不是将Flex和bison集成到Xcode中。@Zaphod,但是bison警告用链接文章中的信息解决了。您只需重命名yacc文件即可使用扩展名
.ym
。查看此线程:谢谢,但问题不在gcc编译期间,但当我使用bison生成解析器时,@robmayoff的可能副本我的问题只是bison警告,不是Flex和Bison集成到Xcode中。@Zaphod,而是Bison警告通过链接文章中的信息得到解决。您只需重命名yacc文件即可使用扩展名
.ym
。好的,谢谢您提供此信息。我将在花括号中使用C。但这太糟糕了,因为将Objectve-C放在生成的解析器中工作……但是
NSLog
仍然需要
NSString
作为格式,所以它应该是
NSLog(@“%s”,message)
。这个答案是错误的——可以在大括号内使用objective-C。这个消息只是一个警告。好的,谢谢你提供这个信息。我将在花括号中使用C。但这太糟糕了,因为将Objectve-C放在生成的解析器中工作……但是
NSLog
仍然需要
NSString
作为格式,所以它应该是
NSLog(@“%s”,message)
。这个答案是错误的——可以在大括号内使用objective-C。这条消息只是一个警告。如果trueMy文件名为
.ym
,肯定是最好的答案,但我启动bison时使用了一个脚本:
bison--defines=system.define.h-o system.yacc.m system.ym
不使用Xcode.Ok。好。但是Xcode是如何告诉bison它是Ocjective-C的呢?我知道没有bison命令行,是吗?或者Xcode使用自己的野牛?没有特别的野牛标志。它只是对
@
发出警告,但无论如何都会传递它。Xcode没有做任何特殊的事情;扩展名
.ym
只是告诉它将Bison的输出编译为Objective-C而不是C。如果我的文件名为
.ym
肯定是最好的答案,但是我通过一个脚本启动Bison:
Bison--defines=system.define.h-o system.yacc.m system.ym
而不是使用Xcode.Ok。好。但是Xcode是如何告诉bison它是Ocjective-C的呢?我知道没有bison命令行,是吗?或者Xcode使用自己的野牛?没有特别的野牛标志。它只是对
@
发出警告,但无论如何都会传递它。Xcode没有做任何特殊的事情;扩展名
.ym
只是告诉它将Bison的输出编译为Objective-C而不是C。