2015-05-19 10 views
18

Ich versuche, YACC mit Xcode zu verwenden, die nativ unterstützt wird, und für diesen Effekt habe ich this Beispiel gefunden, die gut funktioniert. Meine Idee ist es, meine eigene Grammatik zu erstellen, also begann ich mit dem Projekt zu experimentieren, um zu sehen, ob es das unterstützt, was ich brauche. Als solche habe ich die folgende Schnittstelle:"Unbekannter Typ" mit YACC mit xcode

.h

#import <Foundation/Foundation.h> 

@interface HYPLangNodeNP : NSObject 

@end 

.m

#import "HYPLangNodeNP.h" 

@implementation HYPLangNodeNP 

@end 

Ja, es ist nur eine leere Implementierung. Dann habe ich nur zwei Änderungen an der Grammatik:

1) In der HYPLangNodeNP

importieren
%{ 

#import "MessageBlocks.h" 
#import "HYPLangNodeNP.h" 

int yylex(void); 
void yyerror(char *s); 

%} 

2) In HYPLangNodeNP dem Typ% Vereinigung

%union { 
    float  value; 
    NSString *identifier; 
    HYPLangNodeNP *node; 
} 

Das Projekt mit Unknown type name 'HYPLangNodeNP' zu kompilieren schlägt fehl . Weiß jemand, wie man löst?

Edit:

Ich weiß nicht, die YACC Version, aber es ist was auch immer Version Schiffe mit Xcode 6.3. Hier finden Sie die Log-I erhalten:

CompileC /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Objects-normal/i386/ViewController.o Parser\ Test/ViewController.m normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler cd "/Users/RafaelSoares/Google Drive/Hype/ParserTest-master " export LANG=en_US.US-ASCII export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /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-implementations -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 /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Parser\ Test-generated-files.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Parser\ Test-own-target-headers.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Parser\ Test-all-target-headers.hmap -iquote /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Parser\ Test-project-headers.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Products/Debug-iphonesimulator/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/DerivedSources/i386 -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/DerivedSources -F/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Products/Debug-iphonesimulator -include /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/PrecompiledHeaders/Parser\ Test-Prefix-gydtbjgblnmtxcahwzhxkvmnznwf/Parser\ Test-Prefix.pch -MMD -MT dependencies -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 /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\ Test.build/Debug-iphonesimulator/Parser\ Test.build/Objects-normal/i386/ViewController.o

In file included from /Users/RafaelSoares/Google Drive/Hype/ParserTest-master /Parser Test/ViewController.m:5: /Users/RafaelSoares/Google Drive/Hype/ParserTest-master /parser.ym:14:5: error: unknown type name 'HYPLangNodeNP' HYPLangNodeNP * nodeNP; ^/Users/RafaelSoares/Google Drive/Hype/ParserTest-master /parser.ym:15:5: error: unknown type name 'HYPLangNodeVP' HYPLangNodeVP * nodeVP; ^/Users/RafaelSoares/Google Drive/Hype/ParserTest-master /parser.ym:16:5: error: unknown type name 'HYPLangNode' HYPLangNode * node; ^/Users/RafaelSoares/Google Drive/Hype/ParserTest-master /parser.ym:17:5: error: unknown type name 'HYPLangSentence' HYPLangSentence * sentence; ^/Users/RafaelSoares/Google Drive/Hype/ParserTest-master /Parser Test/ViewController.m:240:34: warning: unused variable 'child' [-Wunused-variable] NSMutableArray * child = [childsVP[i] getChilds]; ^1 warning and 4 errors generated.

+0

Sie müssen die vollständige Befehlszeile und Fehlerprotokoll anzeigen, damit wir sehen können, was vor sich geht. Suchen Sie in Xcode: Command-8 nach dem fehlgeschlagenen Befehl und bewegen Sie den Mauszeiger über das Hamburger-Symbol, um alle Details zu sehen (ich weiß, simples, oder?) –

+0

Ich vermute, dass "% code requires" helfen wird: http : //www.gnu.org/software/bison/manual/html_node/_0025code-Summary.html#g_t_0025code-Summary "... Mit anderen Worten, es ist der beste Ort, um Typen zu definieren, auf die in% union-Direktiven verwiesen wird." –

+0

Auch , sollten Sie sagen, welche yacc/bison-Implementierung und Version Sie verwenden. –

Antwort

15

Ich habe in diesem geschaut und einige Antworten haben, aber leider nicht ein komplettes Arbeitsbeispiel in der verfügbaren Zeit. Ich bin sehr vertraut mit Lex & yacc, aber habe nicht mit Objective-C zuvor gearbeitet. Das war meine erste Objective-C-Übung, fürchte ich, und es war meine Schwäche in diesem Teil, die mich im Stich ließ. Vielleicht ermöglichen Ihnen Ihre besseren Kenntnisse in diesem Bereich, die Aufgabe zu erledigen.

Der erste Teil des Problems, wie es bei durch @Ewan Mellor angedeutet, wird in der Hand Bison erläutert * wo es anzeigt, dass yacc Code in der falschen Reihenfolge für einige Sprachen/Compiler erzeugt. Dies gilt für Objective-C, was den Kompilierungsfehler verursacht, den Sie erhalten. Dies bedeutet speziell, dass das %union-Konstrukt von yacc in Verbindung mit Objective-C-Objekten (wie Sie herausgefunden haben) schwierig zu verwenden ist.

Es gibt eine andere Möglichkeit, dieses Problem zu lösen, wie gezeigt (am Ende von) this article.

Man verwendet das Makro YYSTYPE, um den Typ zu ersetzen, der von yacc anstelle von %union verwendet wird.

ich folgende Änderungen vorgenommen, diese Methode zu verwenden:

In 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 

In 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; 
} 

In 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; } 

In Parse r.ym:

%{ 

#import "MessageBlocks.h" 

int yylex(void); 
void yyerror(char *s); 
#define YYSTYPE YYresultType 
%} 

/* 
%union { 
    float  value; 
    NSString *identifier; 
    HYPLangNodeNP *node; 
}*/ 

... 

and so on. 

Ich bin immer noch Objective-C Kompilierungsfehlern bekommen, so bin ich nicht weiter nach vorn, als Sie waren, aber ich werde weiter daran zu arbeiten ... aber wahrscheinlich wird es nicht sinnvoll sein, für dich.


* Siehe allerletzten Absatz this section:

This section has been concerned with explaining the advantages of the four Prologue alternatives over the original Yacc Prologue.

Es die Schwäche der yacc Code Ordnung erklärt und wie Bison überwindet, dass mit der %code Richtlinie. Es ist yacc und kein Bison, der in Xcode eingebaut ist. Es wäre möglich, yacc durch Bison auf dem System zu ersetzen, um diesen Mangel zu überwinden.

Verwandte Themen