Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ParseKit与我的EOL符号不匹配:我做错了什么?_Objective C_Regex_Parsing_Parsekit - Fatal编程技术网

Objective c ParseKit与我的EOL符号不匹配:我做错了什么?

Objective c ParseKit与我的EOL符号不匹配:我做错了什么?,objective-c,regex,parsing,parsekit,Objective C,Regex,Parsing,Parsekit,ParseKit的冒险在继续。。。我的下一个障碍是努力让新行符号被识别 这是我的语法: @symbolState = '\n'; @start = textline*; textline = Any* eol; eol = '\n'; 以下是我的测试文本: 1 2 3 4 5 正在从具有Unix格式(LF)行结尾的UTF-8文本文件中读取文本。我已经在Xcode(文件检查器->文本设置)和外部使用TextWrangler验证了该格式 以下是相关代码: #import "FileImporte

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
#导入“FileImporterThing.h”
#进口
@接口文件导入()
@属性(非原子,保留)PKParser*parser;
-(void)parser:(PKParser*)p didMatchTextline:(PKAssembly*)a;
-(void)parser:(PKParser*)p didMatchEol:(PKAssembly*)a;
@结束
@实现文件导入
@合成解析器=_解析器;
-(id)init
{
如果(!(self=[super init]),则返回nil;
//也尝试过“textline=Any*”\n“;”
NSString*g=@“@symbolState='\n';@start=textline*;textline=Any*eol;eol='\n';”;
self.parser=[[PKParserFactory]parserFromGrammar:g assembler:self];
回归自我;
}
-(void)testParse
{
//从UTF-8文件Unix(LF)行结尾读取字符串
//(在project->file inspector->Text Settings中以及外部使用TextWrangler进行验证)
NSString*path=[[NSBundle bundleForClass:[self class]]pathForResource:@“LF test”类型:@“parsetext”];
/*文件包含文本:
1.
2.
3.
4.
5.
*/
NSString*s=[NSString stringWithContentsOfFile:路径编码:NSUTF8StringEncoding错误:nil];
[self.parser解析:s];
}
-(void)解析器:(PKParser*)p didMatchEol:(PKAssembly*)a
{
NSLog(@“eol found”);//堆栈=%@,[a堆栈];
}
-(void)解析器:(PKParser*)p didMatchTextline:(PKAssembly*)a
{
NSLog(@“文本行匹配”);
}
@结束
但我担心油漆还没干!我已经尝试了上面的各种变化。我一辈子都无法让解析器识别换行符。我可能可以通过逐行读取文件缓冲区来解决这个问题(哪种性能可能更好?)但是,如果能选择匹配“\n”,那就太好了。

这里的开发者。我可以贡献两件事:


一,

我使用在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);
}

二,

实际上,我有点惊讶于您的示例能够奏效,因为我认为您使用
Any*
产品会贪婪地消耗该行末尾的
\n
代币,从而使
eol
产品无法匹配

然而,正如我所提到的,当我运行您的示例(针对ParseKit主干的头部)时,这并不是一个问题

不过,为了更好地衡量,我可能会建议将您的
文本行
产品更改为:

textline = ~eol* eol;
该产品的定义应理解为:

零个或多个令牌未与
eol
匹配,后跟一个令牌与
eol

~
是ParseKit语法中的布尔否定运算符

在对我的示例代码进行了这一更改之后,一切仍按预期进行



如果在这两个提示之后,您仍然无法让它工作,请告诉我。

谢谢您的即时回答Todd!当然,您是对的,我的错误,对不起-原来是一个愚蠢的区分大小写的问题,导致我的测试文件找不到。但后来我被难住了,为什么我真正的代码无法工作。结果是,硬编码语法是可行的ks,但从文件中读取它并没有:“\n”似乎被解释为不同的文字?即使将我的确切问题转化为文字也很困难,可以说,如果我从文件中读取,然后将字符串传递给NSLog,我会看到每个“/n”都完整打印出来。但是硬编码字符串会向控制台发送真正的换行符。有什么提示吗?如果不是很清楚,则n试着改编上面的小例子,从文件中读取语法。这对你有用吗?啊,我明白了。嗯,是的,这很棘手。也许可以尝试在基于文件的语法版本中使用“\\n”?今天晚些时候我会试着找些时间来研究这个问题。可能是ParseKit中的一个错误,但我不确定。我也考虑过“\\n”但不起作用:(有效的是单引号内的物理换行符。不太优雅,但至少让我保持滚动:)@Todd有没有一个地方可以找到ParseKit语法列表?我似乎正在通过阅读web上的每个ParseKit论坛帖子收集ParseKit语法。谢谢。