ios objective-c yacc

ios - swift alert controller



"Nombre de tipo desconocido" usando YACC con xcode (1)

Estoy tratando de usar YACC con xcode, que es compatible de forma nativa, y para ese efecto encontré this muestra que está funcionando muy bien. Mi idea es construir mi propia gramática, así que comencé a experimentar con el proyecto para ver si apoyaría lo que necesito. Como tal, he creado la siguiente interfaz:

.h

#import <Foundation/Foundation.h> @interface HYPLangNodeNP : NSObject @end

.metro

#import "HYPLangNodeNP.h" @implementation HYPLangNodeNP @end

Sí, es solo una implementación vacía. Entonces hice solo dos cambios a la gramática:

1) Añadir la importación HYPLangNodeNP

%{ #import "MessageBlocks.h" #import "HYPLangNodeNP.h" int yylex(void); void yyerror(char *s); %}

2) Agregue HYPLangNodeNP al tipo% union

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

El proyecto no se compila con el Unknown type name ''HYPLangNodeNP'' . ¿Alguien sabe como resolver?

Editar:

No sé la versión de YACC, pero es la versión que viene con Xcode 6.3. El siguiente es el registro que obtengo:

CompileC / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser / Par.as.as.as.as. /ViewController.m normal i386 object-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/binbin : / sbin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x object-c -arch i386 -fmessage-length = 0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -Wno-trigraphs -fpascal-strings -O0 -No inicializadores de campo faltantes -No-faltantes-prototipos -No-implícito-propiedades-atómicas -Wno-receiver-is -weak -Wno-arco-repetido-uso-de-débil -Wno-missi ng-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameters -Wunused-variable -Wunused-value -Wno-empty-body -Wuninitialized -Wno-unknown-pragmas -Wno- sombra -Wno-cuatro-constantes -Wno-conversión -Wno-constante-conversión -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64 a 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-declaations -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/ Analizador / Prueba-generado-fil es.hmap -I / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser / Test.build/Debug-iphonesimulator/Parser / Test.build/Parser / Test headers.hmap -I / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser / Test.build/Debug-iphonesimulator/Parser / Test.build/es/ headers.hmap -iquote / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser / Test.build/Debug-iphonesimulator/Parser / Test.build/es/ hmap -I / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Products / Debug-iphonesimulator / include -I / Applications / Xcode.app / Contents / Developer / Toolchains / XcodeDefax / 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 / Parques / Parser_Test-ahryrrrggqqtbhenhxphgqqgff/es/Pas/Tas/Pare / Parser_Test-ahryrrrggqqtbhenhxphgqq / Dep. / Debug-iphonesimulator / Parser / Test.build/DerivedSources -F / Users / RafaelSoares / Library / Developer / Xcode / DerivedData / Parser_Test-ahryrrrgjyqtbl / / / / / / / phhonesimulator-/ / / / / phhonesimulator-/ / / / phhonesimulator-/ / / / phhonesimulator-/ / / / phhonesimulator-/ / / / phhonesimulator-/ / / / phhonesimulator-/ / DerivedData / Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / PrecompiledHeaders / Parser / Test-Prefix ahryrrrgjyqtbhenhxphagqdgppf / Build / Intermediates / Parser / Test.build/Debug-iphonesimulator/Parser / Test.build/Objects-normal/Archivo/Park/parques/Park/P./Controller.d --serialize-diagnostics / Users / RafaelSoares / Library / Dep / Cons / Cons / Cons / Cons / Part / Dep / Part / Dep / cons / Chips / Cons / Chips -ahryrrrgjyqtbhenhxphagqdg ppf / 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. /ViewController.o

En el archivo incluido de / Users / RafaelSoares / Google Drive / Hype / ParserTest-master / Parser Test / ViewController.m: 5: / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:14:5: error : nombre de tipo desconocido ''HYPLangNodeNP'' HYPLangNodeNP * nodeNP; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:15:5: error: nombre de tipo desconocido ''HYPLangNodeVP'' HYPLangNodeVP * nodeVP; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:16:5: error: nombre de tipo desconocido ''HYPLangNode'' HYPLangNode * node; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master /parser.ym:17:5: error: nombre de tipo desconocido ''HYPLangSentence'' oración HYPLangSentence *; ^ / Users / RafaelSoares / Google Drive / Hype / ParserTest-master / Parser Test / ViewController.m: 240: 34: advertencia: variable ''child'' no utilizada [-Wunused-variable] NSMutableArray * child = [childsVP [i] getChilds] ; ^ 1 advertencia y 4 errores generados.


He mirado esto y tengo algunas respuestas, pero desafortunadamente, no es un ejemplo completo de trabajo en el tiempo disponible. Estoy muy familiarizado con lex & yacc pero no he trabajado antes con Objective-C. Este fue mi primer ejercicio de Objective-C, me temo, y fue mi debilidad en esa parte la que me decepcionó. Quizás su mejor conocimiento en esa área le permitirá completar la tarea.

La primera parte del problema, según lo insinuado por @Ewan Mellor, se explica en el manual de bison * donde indica que yacc genera código en el orden incorrecto para algunos idiomas / compiladores. Esto es cierto para Objective-C, que es lo que causa el error de compilación que está recibiendo. Esto significa, específicamente, que la construcción %union de yacc es difícil de usar junto con los objetos Objective-C (como ha descubierto).

Hay otra forma de resolver este problema como se muestra (al final de) este artículo .

Uno usa la macro YYSTYPE para reemplazar el tipo usado por yacc en lugar de la %union .

Hice los siguientes cambios para usar este método:

En 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

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

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

En 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.

Sigo recibiendo errores de compilación de Objective-C, así que no estoy más adelantado que tú, pero seguiré trabajando en ello ... pero probablemente no te sea útil.

* Ver el último párrafo de esta sección :

Esta sección se ha preocupado por explicar las ventajas de las cuatro alternativas de Prologue sobre el Prólogo original de Yacc.

Explica la debilidad del orden del código yacc y cómo el bisonte supera eso con la directiva %code . Es yacc y no bisonte que está integrado en Xcode. Sería posible reemplazar yacc con bison en el sistema para superar esta deficiencia.