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

Parsing 在哪里可以阅读有关为ParseKit定义语法的详细文档?,parsing,bnf,parsekit,Parsing,Bnf,Parsekit,我刚刚开始学习ParseKit,阅读“基本语法”,但这只是一个非常基本的介绍。现在我想开始定义自己的语法,我很快就不知所措了。我该怎么办 例如,我想以非常自定义的格式解析日志文件。将其分解为页眉、正文和页脚,这将是我的页眉第一行的BNF: <header-line-1> ::= <log-format> <log-id> "," <category> <EOL> <log-format> ::= "Type A Logfi

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

这里的开发者

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

  • 。好消息是:这将教会您ParseKit的设计/内部结构。坏消息是:ParseKit的“语法语法”特性是我自己设计和添加的ParseKit之上的一个附加特性。因此,Metsker的书中没有描述它,因为他的Java库没有这个特性

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

  • StackOverflow上的标签。我回答了很多可能对你有帮助的问题


  • 对于您的特定示例,下面是我可能如何用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
    完成,并通过标记器指令进行更改)
  • 解析(由语法中的声明构建的解析器完成)

  • 因此,由语法创建的解析器处理已由标记器标记的标记。它对单个字符或由多个标记组成的长字符串都不起作用。

    嘿,托德,首先,你亲自回答了我的问题,非常好,谢谢你-我一直希望你能这么做;)是的,我昨晚花了一段时间玩了演示应用程序,看了一下示例,我自己的示例也开始工作了;几乎完全如您所引用,但使用
    category=Word+
    。事实上,我不知道(或忽略了)
    Any
    关键字。再次感谢您的帮助,这证明我似乎走上了正确的道路:)
    @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';