3

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

4

1 回答 1

1

ParseKit的开发者在这里。

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

  1. Steven Metsker 的书籍 Building Parsers in Java。好消息:这将教你 ParseKit 的设计/内部结构。坏消息:ParseKit 的“语法”功能是我自己设计和添加的 ParseKit 之上的附加功能。因此,Metsker 的书中没有描述它,因为他的 Java 库没有这个特性。

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

  3. 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 中的解析是一个两阶段的过程:

  1. 标记化(由语法中的Tokenizer DirectivesPKTokenizer完成和更改)
  2. 解析(由语法中的声明构造的解析器完成)

因此,由您的语法创建的解析器适用于已经被 Tokenizer 标记的 Token 不适用于单个字符或由多个标记组成的长字符串。

于 2012-03-07T01:49:07.307 回答