2

我正在学习如何使用 PEGKit,但是在为解析行的脚本创建语法时遇到了问题,即使它们被多个换行符分隔也是如此。我已将问题简化为以下语法:

expr
@before {
    PKTokenizer *t = self.tokenizer;
    self.silentlyConsumesWhitespace = NO;
    t.whitespaceState.reportsWhitespaceTokens = YES;
    self.assembly.preservesWhitespaceTokens = YES;
}
= Word nl*;
nl = nl_char nl_char*;
nl_char = '\n'! | '\r'!;

对我来说,这个简单的语法应该允许每行一个单词,必要时有尽可能多的换行符。但它只允许一个带有可选换行符的单词。有人知道这里有什么问题吗?谢谢你。

4

1 回答 1

2

PEGKit的创建者在这里。

请尝试以下语法(确保您使用的是 HEAD of master):

@before {
    PKTokenizer *t = self.tokenizer;

    [t.whitespaceState setWhitespaceChars:NO from:'\\n' to:'\\n'];
    [t.whitespaceState setWhitespaceChars:NO from:'\\r' to:'\\r'];
    [t setTokenizerState:t.symbolState from:'\\n' to:'\\n'];
    [t setTokenizerState:t.symbolState from:'\\r' to:'\\r'];
}

lines = line+;
line  = ~eol* eol+; // note the `~` Not unary operator. this means "zero or more NON eol tokens, followed by one or more eol token"
eol   = '\n'! | '\r'!;

请注意,在这里,我正在调整标记器以将换行符和回车识别为Symbols 而不是空格。这使得匹配和丢弃它们更容易(它们被!操作员丢弃)。

有关使用内置空格规则解决同一问题的另一种方法S,请参见此处。

于 2014-08-06T15:58:50.320 回答