Pregunta

Después de familiarizarme un poco con la sintaxis gramatical de ParseKit (jugando en la aplicación de demostración), ahora estoy intentando hacer funcionar mi propia mini demostración, pero hasta ahora sin mucho éxito.No se llaman las devoluciones de llamada del ensamblador.

A continuación se muestra una versión condensada del importante código.Cuando testParse ejecuta el analizador parece hacer todo bien y hacer coincidir correctamente mi cadena con mi anything producción (que también funciona en la demostración) pero didMatchAnything:simplemente no lo llaman.

#import <Foundation/Foundation.h>

@class PKParser;

@interface FileParserThing : NSObject {
    PKParser* _parser;
}
- (void)testParse;
@end


#import <ParseKit/ParseKit.h>
#import "FileParserThing.h"

@interface FileParserThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)didMatchAnything:(PKAssembly *)a;
@end

@implementation FileParserThing

@synthesize parser = _parser;

-(id)init
{
    if (!(self = [super init])) return nil;

    NSString *g = @"@start = anything; anything = Any+;";
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];

    return self;
}

- (void)testParse
{
    NSString *s = @"Foo Bar";
    NSLog(@"test parse with: %@", s);
    [self.parser parse:s];
}

- (void)didMatchAnything:(PKAssembly *)a
{
    NSLog(@"Hooray!");
}

@end

Buscando en el código de ParseKit puedo ver la línea 129 de PKParser

[assembler performSelector:assemblerSelector withObject:self withObject:a];

No se está ejecutando, porque assembler es nulo.Lo que, a su vez, me lleva a la fábrica de analizadores;donde mi comprensión de lo que está pasando comienza a fallar.

Descargo de responsabilidad;Lo sé, probablemente necesito leer El libro, pero una cosa a la vez.Quiero que funcione una pequeña prueba de concepto, antes de desembolsar 30 ratones por un libro que tal vez nunca vuelva a leer si mi proyecto no funciona :)

¿Fue útil?

Solución

Desarrollador de ParseKit aquí.

Hace un tiempo cambié la firma de las devoluciones de llamada del ensamblador para aceptar dos argumentos:

  1. El analizador que coincidía con el token actual.
  2. El Asamblea que contiene el estado actual del análisis de entrada.

Anteriormente sólo había uno argumento:La Asamblea.

No estoy seguro de que los documentos estén completamente actualizados para reflejar esto.

Entonces sospecho que si simplemente cambias tu método de devolución de llamada de Assembler a esto, funcionará:

- (void)parser:(PKParser *)p didMatchAnything:(PKAssembly *)a {
    NSLog(@"%s %@", __PRETTY_FUNCTION__, a);
}

Si no, hágamelo saber y lo ayudaré a depurar más.


Para antecedentes:Hice este cambio porque me encontré con una situación en la que mi devolución de llamada del ensamblador realmente necesitaba inspeccionar el analizador que acababa de realizar la coincidencia actual.

También alineó más estrechamente la fuerte convención del Cacao de Delegar devoluciones de llamada que siempre tienen el delegador objeto como primer argumento.En retrospectiva, desearía haber cambiado el nombre de todo el concepto de ensambladores en ParseKit para Delegados.Ya que en el lenguaje de Cocoa, eso es básicamente lo que son los ensambladores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top