2015-05-19 10 views
18

Próbuję użyć YACC z kodem xcode, który jest natywnie obsługiwany, i dla tego efektu znalazłem próbkę, która działa ładnie. Moim zamysłem jest zbudowanie własnej gramatyki, więc zacząłem eksperymentować z projektem, aby sprawdzić, czy będzie on wspierać to, czego potrzebuję. Jako takie, stworzyłem następujący interfejs:"Nieznana nazwa typu" przy użyciu YACC z kodem Xcode

.h

#import <Foundation/Foundation.h> 

@interface HYPLangNodeNP : NSObject 

@end 

.m

#import "HYPLangNodeNP.h" 

@implementation HYPLangNodeNP 

@end 

Tak, to tylko pusta realizacja. Potem tworzył dwie zmiany w gramatyce:

1) Dodać HYPLangNodeNP importować

%{ 

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

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

%} 

2) Dodaj HYPLangNodeNP do typu% unii

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

Projekt nie skompilować z Unknown type name 'HYPLangNodeNP' . Czy ktoś wie, jak rozwiązać?

Edit:

nie wiem wersję YACC, ale niezależnie od wersji statki z Xcode 6.3. Poniżej znajduje się dziennik uzyskać:

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

Musisz pokazać pełny wiersz poleceń i dziennik błędów, abyśmy mogli zobaczyć, co się dzieje. W Xcode: Command-8 znajdź polecenie, które się nie udaje, po czym zatrzymaj wskaźnik myszy i kliknij ikonę hamburgera, aby zobaczyć pełne szczegóły (wiem, simples, prawda?) –

+0

Domyślam się, że "% code requires" pomoże: http : //www.gnu.org/software/bison/manual/html_node/_0025code-Summary.html#g_t_0025code-Summary "... Innymi słowy, jest to najlepsze miejsce do zdefiniowania typów wymienionych w dyrektywach% unii." –

+0

, powinieneś powiedzieć, która implementacja yacc/bison i wersja, której używasz. –

Odpowiedz

15

Patrzyłem na to i mam kilka odpowiedzi, ale niestety, nie jest kompletny przykład pracy w dostępnym czasie. Jestem bardzo obeznany z lexem & yacc, ale wcześniej nie pracowałem z Objective-C. To było moje pierwsze ćwiczenie w Celu C, obawiam się, i to moja słabość w tej części mnie zawiodła. Być może twoja lepsza wiedza w tym obszarze pozwoli ci wykonać to zadanie.

Pierwsza część problemu, o której wspomniał @Ewan Mellor, została wyjaśniona w podręczniku żubrów * gdzie wskazuje, że yacc generuje kod w niewłaściwej kolejności dla niektórych języków/kompilatorów. Dotyczy to Objective-C, co powoduje błąd kompilacji, który otrzymujesz. Oznacza to w szczególności, że konstrukcja yacc %union jest trudna w użyciu w połączeniu z obiektami Objective-C (jak odkryłeś).

Istnieje inny sposób rozwiązania tego problemu, jak pokazano (na końcu) this article.

W celu zastąpienia typu używanego przez yacc zamiast %union używa się makra YYSTYPE.

że wykonane z następujących zmian w użyciu tej metody jest

W 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 

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

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

W analizie 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. 

ja wciąż otrzymuję błędy kompilacji Objective-C, więc nie jestem bardziej z przodu niż było, ale będę nad nim pracuje ... ale prawdopodobnie nie będzie przydatna do Ciebie.


* Zobacz bardzo ostatni akapit this section:

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

Wyjaśnia słabość KOD yacc i jak żubr pokonuje że z dyrektywą %code. To jest Yacc, a nie Bison, który jest wbudowany w Xcode. Byłoby możliwe zastąpienie Yacca żubrami w systemie w celu przezwyciężenia tego niedoboru.

Powiązane problemy