"未知的类型名称"使用YACC和xcode

时间:2015-05-19 13:49:03

标签: ios objective-c yacc

我试图将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个错误产生。

1 个答案:

答案 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来克服这种缺陷。