Parsekit私のEOLのシンボルに一致していません:私は何をしていますか?

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

質問

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

で一致する1つのトークン

~は、Parsekit文法構文のブール否定演算子です。

この変更をマイサンプルコードに変更した後、すべてが期待どおりに機能しました。


あなたがまだこれら2つのヒントの後にそれを働くことができないならば、私に知らせてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top