Подтвердить что ты не робот

"Неизвестное имя типа" с использованием YACC с xcode

Я пытаюсь использовать YACC с xcode, который поддерживается изначально, и для этого я нашел этот образец, который хорошо работает. Моя идея состоит в том, чтобы создать собственную грамматику, поэтому я начал экспериментировать с проектом, чтобы убедиться, что он будет поддерживать то, что мне нужно. Таким образом, я создал следующий интерфейс:

.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'. Кто-нибудь знает, как решить?

Edit:

Я не знаю версию YACC, но она независимо от версии поставляется с Xcode 6.3. Ниже приводится журнал, который я получаю:

CompileC /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser _Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.o Parser \ Test/ViewController.m normal i386 objective-ccom.apple.compilers.llvm.clang.1_0.compiler     cd "/Пользователи/RafaelSoares/Google Диск /Hype/ParserTest -master"     экспорт LANG = ru_US.US-ASCII     экспорт PATH = "/Applications/Xcode.app/Содержание/Разработчик/Платформы/iPhoneSimulator.platform/Разработчик/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-repeat-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/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser\Test.build/Parser \ Тест-порожденных-files.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser\Test.build/Parser \ Тест-собственный целевой headers.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser\Test.build/Parser \ Test-all-target-headers.hmap -количество /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser _Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser\Test.build/Parser \ Тест-проект-headers.hmap -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Products/Debug-iphonesimulator/включить -I/Применения/Xcode.app/Содержание/Разработчик/компилированные инструменты/XcodeDefault.xctoolchain/USR/включать -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/DerivedSources/i386 -I/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Test.build/Debug-iphonesimulator/Parser\Test.build/DerivedSources -F/Пользователи/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Products/Debug-iphonesimulator -ключить/Пользователи/RafaelSoares/Library/Разработчик/Xcode/DerivedData/Parser_Test-ahryrrrjjqtbhenhxphagqdgppf/Build/Intermediates/PrecompiledHeaders/Parser \ Test-Prefix-gydtbjgblnmtxcahwzhxkvmnznwf/Parser\Test-Prefix.pch -MMD -MT -MF/Пользователи/RafaelSoares/Library/Разработчик/Xcode/DerivedData/Parser_Test-ahryrrrjjqtbhenhxphagqdgppf/Build/Intermediates/Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.d --serialize-diagnostics/Пользователи/RafaelSoares/Library/Разработчик/Xcode/DerivedData/Parser_Test-ahryrrrjjqtbhenhxphagqdgppf/Build/Intermediates/Parser \ Test.build/Debug-iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.dia -c /Пользователи/RafaelSoares/Google\Drive/Hype/ParserTest-master \/Parser \ Тест /ViewController.m -o /Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser _Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/полупродукты/Parser \ Контрольная работа.строить /Debug -iphonesimulator/Parser \ Test.build/Objects-normal/i386/ViewController.o

В файл включен из/Пользователи/RafaelSoares/Google Drive/Hype/ParserTest-master/Parser Test/ViewController.m: 5: /Пользователи/RafaelSoares/Google Диск /Hype/ParserTest -master /parser.ym:14:5: ошибка: неизвестное имя типа 'HYPLangNodeNP'     HYPLangNodeNP * nodeNP;     ^/Пользователи/RafaelSoares/Google Диск /Hype/ParserTest -master/parser.ym:15:5: ошибка: неизвестное имя типа 'HYPLangNodeVP'     HYPLangNodeVP * nodeVP;     ^/Пользователи/RafaelSoares/Google Диск /Hype/ParserTest -master/parser.ym:16:5: ошибка: неизвестное имя типа 'HYPLangNode'     HYPLangNode * node;     ^/Пользователи/RafaelSoares/Google Диск /Hype/ParserTest -master/parser.ym:17:5: ошибка: неизвестное имя типа 'HYPLangSentence'     Предложение HYPLangSentence *;     ^/Пользователи/RafaelSoares/Google Drive/Hype/ParserTest-master/Parser Test/ViewController.m: 240: 34: предупреждение: неиспользуемая переменная 'child' [-Wunused-переменная]                 NSMutableArray * child = [childsVP [i] getChilds];                                  ^ 1 предупреждение и 4 возникших ошибки.

4b9b3361

Ответ 1

Я посмотрел на это и получил некоторые ответы, но, к сожалению, не полный рабочий пример за доступное время. Я очень хорошо знаком с lex и yacc, но раньше не работал с Objective-C. Это было мое первое упражнение Objective-C, которое я боюсь, и это была моя слабость в той части, которая подвела меня. Возможно, ваши лучшие знания в этой области позволят вам выполнить задачу.

Первая часть проблемы, на которую указывает @Ewan Mellor, объясняется в руководстве bison * где указано, что yacc генерирует код в неправильном порядке для некоторых языков/компиляторов. Это верно для Objective-C, из-за чего вы получаете ошибку компиляции. Это означает, в частности, что конструкцию %union yacc трудно использовать в сочетании с объектами Objective-C (как вы обнаружили).

Существует еще один способ решить эту проблему, как показано (в конце) в этой статье.

Один использует макрос 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, поэтому я не продвигаюсь дальше, чем вы, но я буду продолжать работать над этим... но, вероятно, вам это не поможет.


* См. последний абзац этот раздел:

Этот раздел посвящен разъяснению преимуществ четырех альтернатив Prologue по сравнению с исходным прообразом Yacc.

Это объясняет слабость упорядочения кода yacc и того, как бизон преодолевает это с помощью директивы %code. Это yacc, а не бизон, встроенный в Xcode. Можно было бы заменить yacc бизоном на систему, чтобы преодолеть этот недостаток.