我正在学习如何使用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'!;
对我来说,这个简单的语法应该允许每行一个单词,并根据需要使用尽可能多的换行符。但它只允许一个带有可选换行符的单词。有人知道这里有什么问题吗?谢谢。
答案 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。