我试图将YACC与xcode一起使用,这是本机支持的,为此我发现this样本效果很好。我的想法是建立自己的语法,所以我开始尝试项目,看它是否会支持我需要的东西。因此,我创建了以下界面:
·H
#import <Foundation/Foundation.h>
@interface HYPLangNodeNP : NSObject
@end
的.m
#import "HYPLangNodeNP.h"
@implementation HYPLangNodeNP
@end
是的,它只是一个空实现。然后我对语法做了两处修改:
1)添加HYPLangNodeNP导入
%{
#import "MessageBlocks.h"
#import "HYPLangNodeNP.h"
int yylex(void);
void yyerror(char *s);
%}
2)将HYPLangNodeNP添加到类型%union
%union {
float value;
NSString *identifier;
HYPLangNodeNP *node;
}
项目无法使用Unknown type name 'HYPLangNodeNP'
进行编译。有人知道怎么解决吗?
编辑:
我不知道YACC版本,但它随Xcode 6.3附带的版本一样。以下是我得到的日志:
CompileC /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.o Parser \ Test / ViewController.m正常i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd&#34; / Users / RafaelSoares / Google Drive / Hype / ParserTest-master&#34; export LANG = en_US.US-ASCII export PATH =&#34; /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/ usr / bin: / bin中:/ usr / sbin目录:/ sbin目录&#34; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch i386 -fmessage-length = 0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -Wno-trigraphs -fpascal-strings -O0 -Wno-missing -field-initializers -Wno-missing-prototypes -Wno-implicit-atomic-properties -Wno-receiver-is-weak -Wno-arc-repeated-use-of-weak -Wno-missing-braces -Wparentheses -Wswitch -Wno -unused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wno-empty-body -Wuninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno -selector -Wno-strict-selector-match -Wno-undeclared-selector -Wno-deprecated-implementation -DDEBUG = 1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8 .3.sdk -fexceptions -fasm-blocks -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -g -Wno-sign-conversion -fobjc-abi-version = 2 -fobjc-legacy-dispatch -mios-simulator-version-min = 8.3 -iquote /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Parser \ 测试生成,files.hmap -I /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Parser \ 测试自己的目标,headers.hmap -I /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Parser \ Test-all-target-headers.hmap -iquote /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Parser \ 测试项目headers.hmap -I /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/产品/调试-iphonesimulator /包括 -I /应用/ Xcode.app /内容/开发商/工具链/ XcodeDefault.xctoolchain / usr / include目录 -I /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/DerivedSources/i386 -I /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/DerivedSources -F /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/产品/调试,iphonesimulator -include / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / PrecompiledHeaders / Parser \ Test-Prefix-gydtbjgblnmtxcahwzhxkvmnznwf / Parser \ Test-Prefix.pch -MMD -MT依赖项-MF / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.d --serialize-diagnostics / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.dia -c / Users / RafaelSoares / Google \ Drive / Hype / ParserTest-master \ / Parser \ Test / ViewController.m -o /用户/ RafaelSoares /库/开发商/ Xcode中/ DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf /编译/中间体/分析器\ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.o
来自/ Users / RafaelSoares / Google的文件 Drive / Hype / ParserTest-master / Parser Test / ViewController.m:5: / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:14:5:错误:未知类型名称&#39; HYPLangNodeNP&#39; HYPLangNodeNP * nodeNP; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:15:5:错误:未知类型名称&#39; HYPLangNodeVP&#39; HYPLangNodeVP * nodeVP; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:16:5:错误:未知类型名称&#39; HYPLangNode&#39; HYPLangNode *节点; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:17:5:错误:未知类型名称&#39; HYPLangSentence&#39; HYPLangSentence *句子; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master / Parser Test / ViewController.m:404:34:警告:未使用的变量&#39; child&#39; [-Wunused可变] NSMutableArray * child = [childsVP [i] getChilds]; ^ 1警告和4个错误产生。
答案 0 :(得分:15)
我已经看了这个并得到了一些答案,但不幸的是,在可用的时间内并不是一个完整的工作示例。我对lex&amp; amp; yacc但之前没有使用过Objective-C。这是我担心的第一次Objective-C练习,而那部分让我失望的是我的弱点。也许您在该领域的更好知识将使您能够完成任务。
@Ewan Mellor暗示的问题的第一部分在野牛手册 * 中有解释,其中表明yacc为某些语言/编译器生成错误顺序的代码。这对于Objective-C来说是正确的,这是导致您收到的编译错误的原因。具体而言,这意味着yacc的%union
构造很难与Objective-C对象一起使用(如您所发现的那样)。
还有另一种解决此问题的方法,如this article所示(<3}}。
使用YYSTYPE
宏来替换yacc而不是%union
使用的类型。
我进行了以下更改以使用此方法:
在MessageBlocks.h中:
@interface HYPLangNodeNP : NSObject
@end
@interface YYresultType : NSObject
- (float) value;
- (NSString *) identifier;
- (HYPLangNodeNP *)node;
- (void) setvalue: (float)input;
- (void) setidentifier: (NSString *)input;
- (void) setnode: (HYPLangNodeNP *)input;
@end
在MessageBlocks.m中:
@implementation HYPLangNodeNP : NSObject
int dummy;
@end
@implementation YYresultType : NSObject
float value;
NSString *identifier;
HYPLangNodeNP *node;
- (float) value {
return value;
}
- (NSString *) identifier {
return identifier;
}
- (HYPLangNodeNP *) node {
return node;
}
- (void) setvalue: (float)input {
value = input;
}
- (void) setidentifier: (NSString *)input {
identifier = input;
}
- (void) setnode: (HYPLangNodeNP *)input {
node = input;
}
在tokenizer.lm中:
[0-9]+\.[0-9]* { [yylval setvalue: [float atof(yytext)]]; return FLOAT; }
[0-9]+ { [yylval setvalue: [float atof(yytext)]]; return INTEGER; }
[a-zA-Z]+ { [yylval setidentifier : [ [NSString stringWithFormat:@"%s", yytext] retain]; return IDENTIFIER; }
在Parser.ym中:
%{
#import "MessageBlocks.h"
int yylex(void);
void yyerror(char *s);
#define YYSTYPE YYresultType
%}
/*
%union {
float value;
NSString *identifier;
HYPLangNodeNP *node;
}*/
...
and so on.
我仍然遇到Objective-C编译错误,所以我没有比你更进一步,但我会继续努力......但可能它对你没用。
<小时/> * 查看this section的最后一段:
本节一直关注解释四种序言替代品优于原始Yacc序言的优势。
它解释了yacc代码排序的弱点以及bison如何克服%code
指令。它是yacc而不是内置于Xcode的野牛。有可能用系统中的野牛取代yacc来克服这种缺陷。