Parsekit私のEOLのシンボルに一致していません:私は何をしていますか?
-
12-12-2019 - |
質問
Parsekit冒険は続く...そして私の次のハードルは改行シンボルを認識しようとしています。
これは私の文法です:
@symbolState = '\n';
@start = textline*;
textline = Any* eol;
eol = '\n';
.
これが私のテストテキストです:
1
2
3
4
5
.
テキストは、UNIX形式(LF)行の終了を伴うUTF-8テキストファイルから読み込まれています。TextWranglerを使用して、Xcode(File Inspector - > Text Settings)と外部からの両方でフォーマットを確認しました。
そしてここに関連するコード:
#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
.
しかし、私は塗料が乾燥していないのを恐れています!上記のすべての種類のバリエーションを試してみました。私は私の人生が改行を認識するためにパーサーを得ることはできません。ファイル - バッファラインを行(とにかくもっとパフォーマンスが高いかもしれません)を読むことで、私はおそらくこれを回避することができますが、 '\ n'と一致するオプションを持つことはまだ良くなるでしょう。
解決
開発者 parsekit こちら。私が貢献できる2つのこと:
1
TextMateまたはTextWrangler(.txtファイルとして保存されている)で作成されたテキストファイルを使用して、それらの例を試してみましたが、すべてがうまく機能しているようです。私の-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
プロダクションが一致するものは何も残しませんでした。
しかし、私が言及したように、私があなたの例を走ったとき(トランクのParsekit責任者に対して)。
それでも、良い措置のために、私はおそらくtextline
プロダクションをこれに変更することを勧めます:
textline = ~eol* eol;
.
この制作の定義は次のように読みます。
ゼロ以上のトークンは、eol
によって一致しません、続いてeol
~
は、Parsekit文法構文のブール否定演算子です。
この変更をマイサンプルコードに変更した後、すべてが期待どおりに機能しました。
あなたがまだこれら2つのヒントの後にそれを働くことができないならば、私に知らせてください。