我正在为 PEGKit 编写语法来解析 Twine 导出的 Twee 文件。这是我第一次使用 PEGKit,我正在尝试了解它的工作原理。
我有我正在解析的这个 twee 源文件
:: Passage One
P1 Line One
P1 Line Two
:: Passage Two
P2 Line One
P2 Line Two
目前我已经研究出如何使用以下语法解析上述内容
@before {
PKTokenizer *t = self.tokenizer;
[t.symbolState add:@"::"];
[t.commentState addSingleLineStartMarker:@"::"];
// New lines as symbols
[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'];
}
start = passage+;
passage = passageTitle contentLine*;
passageTitle = passageStart Word+ eol+;
contentLine = singleLine eol+;
singleLine = Word+;
passageStart = '::'!;
eol = '\n'! | '\r'!;
我得到的结果是
[Passage, One, P1, Line, One, P1, Line, Two, Passage, Two, P2, Line, One, P2, Line, Two]::/Passage/One/
/P1/Line/One/
/P1/Line/Two/
/
/::/Passage/Two/
/P2/Line/One/
/P2/Line/Two/
^
理想情况下,我希望解析器将匹配的单词组合passageTitle
成一个字符串,类似于内置 PEGKitQuotedString
语法的工作方式。我还希望将与 a 匹配的单词也contentLine
组合起来。
所以,最终,我会把它放在堆栈上
[Passage One, P1 Line One, P1 Line Two, Passage Two, P2 Line One, P2 Line Two]
任何关于如何实现这一目标的想法将不胜感激。