识别PEGKit中的多个new_lines

时间:2014-08-06 10:53:34

标签: parsekit pegkit

我正在学习如何使用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'!;

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

1 个答案:

答案 0 :(得分:2)

PEGKit的创作者。

请尝试使用以下语法(确保使用的是主人的HEAD):

@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'!;

请注意,在这里,我正在调整tokenizer以将新行和回车识别为Symbol而不是空格。这样可以更容易地匹配和丢弃它们(它们被!运算符丢弃)。

another approach to the same problem using the builtin S whitespace rule, see here