ParseKitの冒険は続きます...そして私の次のハードルは改行記号を認識させようとしています。
これが私の文法です:
@symbolState = '\n';
@start = textline*;
textline = Any* eol;
eol = '\n';
これが私のテストテキストです:
1
2
3
4
5
テキストは、Unix形式(LF)の行末を持つUTF-8テキストファイルから読み取られています。Xcode(ファイルインスペクター->テキスト設定)と外部の両方で、TextWranglerを使用してその形式を確認しました。
そして、ここに関連するコードがあります:
#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行ずつ読み取ることで(とにかくパフォーマンスが向上する可能性がありますか?)、おそらくこれを回避できますが、「\n」に一致するオプションがあると便利です。