بارسيكيت لا يطابق رموز موسوعة الحياة الخاصة بي:ماذا أفعل خطأ?

StackOverflow https://stackoverflow.com//questions/9672893

سؤال

تستمر مغامرة بارسيكيت...والعقبة التالية هي محاولة التعرف على رموز السطر الجديد.

ها هي قواعدي:

@symbolState = '\n';
@start = textline*;
textline = Any* eol;
eol = '\n';

إليك نص الاختبار الخاص بي:

1
2
3
4
5

يتم قراءة النص من ملف نصي أوتف-8 مع شكل يونكس (لف) نهايات الخط.لقد تحققت من هذا الشكل على حد سواء في كسكودي (ملف المفتش -> إعدادات النص) وكذلك خارجيا ، مع تكسترانجلر.

وهنا رمز ذات الصلة:

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

@interface FileImporterThing ()
@property (nonatomic, retain)PKParser* parser;
- (void)parser:(PKParser *)p didMatchTextline:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchEol:(PKAssembly *)a;
@end


@implementation FileImporterThing

@synthesize parser = _parser;

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

    // Have also tried "textline = Any* '\n';"
    NSString *g = @"@symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n';";
    self.parser = [[PKParserFactory factory] parserFromGrammar:g assembler:self];

    return self;
}

- (void)testParse
{
    // read string from UTF-8 file Unix (LF) line endings 
    // (this verified in project->file inspector->Text Settings and externally with TextWrangler)
    NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"LF-test" ofType:@"parsetext"];
/* file contains text:
1
2
3
4
5

*/
    NSString *s = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    [self.parser parse:s];
}

- (void)parser:(PKParser *)p didMatchEol:(PKAssembly *)a
{
    NSLog(@"eol found");// stack = %@", [a stack]);
}

- (void)parser:(PKParser *)p didMatchTextline:(PKAssembly *)a
{
    NSLog(@"textline matched");
}

@end

لكن أخشى أن الطلاء لا يجف!لقد جربت جميع أنواع الاختلافات في ما سبق.لا يمكنني طوال حياتي الحصول على المحلل اللغوي للتعرف على سطر جديد.ربما يمكنني التغلب على هذا ، من خلال قراءة سطر المخزن المؤقت للملفات بسطر (والذي قد يكون أكثر أداء على أي حال?) ولكن سيكون من الجيد أن يكون لديك خيار مطابقة '\ ن'.

هل كانت مفيدة؟

المحلول

مطور بارسيكيت هنا.شيئان يمكنني المساهمة بهما:


1.

حاولت المثال الخاص بك باستخدام ملف نصي تم إنشاؤه في أي تكستمات أو تكسترانجلر (حفظ كملف .ملف النص) ، ويبدو أن كل شيء يعمل بشكل جيد.بلدي -parser:didMatchEol: و -parser:didMatchTexline: تم استدعاء عمليات الاسترجاعات كما هو متوقع.

إذا كان هذا لا يعمل من أجلك ، فربما حاول البدء بإدخال سلسلة في الذاكرة لمعرفة ما إذا كان ذلك سيعمل على الأقل:

NSString *s = @"foo bar\nbaz bat\n";
[parser parse:s];

على أي حال ، وهنا رمز بلدي من DebugAppDelegate.m الذي يعمل بالنسبة لي إما مع الإدخال في الذاكرة أو الإدخال على القرص:

- (void)doTestGrammar {
    NSString *g = @"@symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n';";
    PKParser *p = [[PKParserFactory factory] parserFromGrammar:g assembler:self];
    //NSString *s = @"foo bar\nbaz bat\n";
    NSString *path = [@"~/Desktop/text.txt" stringByExpandingTildeInPath];
    NSString *s = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [p parse:s];
}

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

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

2.

كنت في الواقع فوجئت قليلا أن المثال الخاص بك عملت ولكن ، كما اعتقدت استخدامك لل Any* سوف يستهلك الإنتاج بشراهة \n الرموز في نهاية السطر ، وبالتالي ترك أي شيء لل eol الإنتاج لمطابقة.

ومع ذلك ، كما ذكرت ، لم تكن هذه مشكلة عندما ركضت المثال الخاص بك (ضد بارسيكيت رئيس الجذع).

ومع ذلك ، لحسن التدبير ، وربما أوصي تغيير الخاص بك textline الإنتاج لهذا:

textline = ~eol* eol;

يجب قراءة تعريف هذا الإنتاج على النحو التالي:

صفر أو أكثر من الرموز غير المتطابقة eol, ، متبوعا برمز مميز واحد يقابله eol

~ هو عامل النفي المنطقي في بناء جملة قواعد اللغة البارسيكيت.

بعد إجراء هذا التغيير على رمز المثال الخاص بي ، لا يزال كل شيء يعمل كما هو متوقع.


إذا كنت لا تزال غير قادر على العمل بعد هاتين النصيحتين ، فأخبرني بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top