我刚接触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?!?

我怀疑至少必须有一种方法来定义一系列角色?

可以肯定的是,parsekit的作者所引用的书可能会对我有所帮助,但是如果有人可以在我更深入地研究该主题之前帮助我着手做一个小例子,那将是很好的。我只是研究一个想法,只是概念的证明。

最佳答案

这里是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完成,并由标记程序指令在语法中更改)
  • 解析(由语法中的声明构造的解析器完成)

  • 因此,由您的语法创建的解析器可用于Tokentizer已标记化的 token 不适用于单个字符或由多个 token 组成的长字符串。

    07-26 03:14