从语法规则,解析对象生成类

时间:2014-04-09 18:33:32

标签: objective-c parsing parsekit pegkit

是否可以为任何语法/规则生成.m和.h'以便在解析期间创建表示该规则的对象。

所以有些语法

coolObjName = Word;

可以生成一个名为coolObjName(或某些变体)的类,并且具有该单词的字段,并生成操作:

coolObjName = Word{
    CoolObjName* newName = [[CoolObjName alloc] initWithWord:POP_STR()];
    PUSH(newName);
};

然后是更高级别的规则,例如:

myhigherlevel = coolObjName Number;

会创建一个myHigherLevel类,它有一个coolObjName成员和一个数字,然后添加动作:

myhigherlevel = coolObjName Number{
   double num = POP_DOUBLE();
   coolObjName* name = POP(); 
   MyHigherLevel* higherLevel = [[MyHigherLevel alloc] init];
   higherLevel.number = num;
   higherLevel.name = name;
   PUSH(higherLevel);
};

空标记变为空对象,*+导致数组。

是否有可以执行此操作的工具或我将在何处创建此类工具。 (看起来超级有用且棒极了)

1 个答案:

答案 0 :(得分:0)

PEGKit的创作者。

目前PEGKit中没有任何内容可以检查您的规则并自动生成可能与您的意图相符的ObjC AST或模型类。目前,PEGKit只能为解析器生成源代码,但不能生成相关的AST或模型类。

很可能您将在Actions或Parser Delegate Callbacks中构建抽象语法树(或中间表示)。 ANLTR有一些很棒的高级树重写功能,允许您在语法中指定如何构建AST。虽然看the docs,但是自从ANTLR 3以来,这似乎有可能发生重大变化?不确定。它曾经看起来像这样(也许它仍然存在,我不是ANTLR专家):

addExpr : lhs=NUM op='+' rhs=NUM -> ^(op lhs rhs);

->表示重写为树,如...

^(op …)表示树由一个包含子项的加号运算符生成...

我很乐意将这样的树重写功能添加到PEGKit中,用于构建AST的明确目的(但不是其他模型对象)。但老实说,这是一项艰巨的任务,不太可能很快出现。