在哪里可以阅读有关为ParseKit定义语法的详细文档?

时间:2012-03-06 18:35:27

标签: parsing bnf parsekit

我刚刚掌握了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的作者所引用的书可能会对我有所帮助,但如果有人能够帮助我开始使用我自己的小例子,那么在我深入研究这个主题之前,这本书会很好。我只是在调查一个想法,只是概念证明。

1 个答案:

答案 0 :(得分:1)

ParseKit的开发人员。

不幸的是,没有关于ParseKit语法语法的进一步(好)文档。目前最好的资源是:

  1. Steven Metsker's Book Building Parsers in Java。好消息:这将教你ParseKit的设计/内部。坏消息:ParseKit的“语法语法”功能是在ParseKit之上分层的附加功能,我自己设计并添加了它。因此,Metsker的书中没有描述它,因为他的Java库没有这个功能。

  2. ParseKit Xcode项目的测试目标中的.grammar个文件。这里有很多真实的示例语法。你可以通过实例学到很多东西。

  3. StackOverflow上的ParseKit标记。我已经回答了很多可能对你有所帮助的问题。

  4. <小时/>

    至于你的具体例子,这里是我可能在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中解析是一个两阶段过程:

    1. 标记(由PKTokenizer完成并由语法中的 Tokenizer Directives 更改)
    2. 解析(由语法中声明构建的解析器完成)
    3. 因此,您的语法创建的Parser适用于已经由Tokenizer进行了标记化的标记对单个字符或由多个标记组成的长字符串起作用。