我刚刚掌握了ParseKit,阅读了“基本语法语法”,但这只是一个非常基本的介绍。我现在想要开始定义我自己的语法,我很快就离开了。我从哪里开始?
例如,我想以非常自定义的格式解析日志文件。将它分解为标题,正文和页脚,这将是标题第一行的BNF:
<header-line-1> ::= <log-format> <log-id> "," <category> <EOL>
<log-format> ::= "Type A Logfile" | "Logfile II" | "Some Other Format"
<log-id> ::= "#" <long-int>
<category> ::= <some unknown string>
如何定义,让ParseKit理解?我到目前为止;
@start = header-line-1;
header-line-1 = log-format log-id "," category EOL;
log-format = 'Type A Logfile';
log-id = '#' ; // and then how to specify a long-int?!?
category = char+;
char = 'A' | 'a' | 'B' | 'b' | 'C'; //..etc... Surely not?!?
我怀疑至少有一种方法可以定义一系列字符串吗?
可以肯定的是,parsek的作者所引用的书可能会对我有所帮助,但如果有人能够帮助我开始使用我自己的小例子,那么在我深入研究这个主题之前,这本书会很好。我只是在调查一个想法,只是概念证明。
答案 0 :(得分:1)
ParseKit的开发人员。
不幸的是,没有关于ParseKit语法语法的进一步(好)文档。目前最好的资源是:
Steven Metsker's Book Building Parsers in Java。好消息:这将教你ParseKit的设计/内部。坏消息:ParseKit的“语法语法”功能是在ParseKit之上分层的附加功能,我自己设计并添加了它。因此,Metsker的书中没有描述它,因为他的Java库没有这个功能。
ParseKit Xcode项目的测试目标中的.grammar
个文件。这里有很多真实的示例语法。你可以通过实例学到很多东西。
StackOverflow上的ParseKit标记。我已经回答了很多可能对你有所帮助的问题。
<小时/>
至于你的具体例子,这里是我可能在ParseKit语法中定义它的方式。
@symbolState = '\n'; // Tokenizer Directive
// tells tokenizer to treat new line chars as
// individual Symbol tokens rather than whitespace
@start = headerLine*;
headerLine = logFormat logId comma category eol;
logFormat = ('Type' 'A' 'Logfile') | ('Logfile' 'II') | ('Some' 'Other' 'Format');
logId = hash Number;
category = Any+;
comma = ',';
hash = '#';
eol = '\n';
要记住的一件重要事情是在ParseKit中解析是一个两阶段过程:
PKTokenizer
完成并由语法中的 Tokenizer Directives 更改)因此,您的语法创建的Parser适用于已经由Tokenizer进行了标记化的标记。 不对单个字符或由多个标记组成的长字符串起作用。