OkudaKit的XML语法

时间:2011-10-29 10:39:03

标签: bnf parsekit

我正在尝试为OkudaKit编写XML语法。我注意到捆绑的HTML语法适用于简单的XML,但是使用命名空间元素或属性失败,所以我想要做的第一件事是添加对这些的支持。我使用HTML语法作为模板,定义了ns,然后将其添加到tagNameattrName

@multiLineComments = '<!--' '-->';
@commentState = '<';
@commentState.fallbackState = delimitState;

@delimitedString = '<?' '?>' nil;
@delimitedString = '<!DOCTYPE' '>' nil;
@delimitState.fallbackState = symbolState;

@start          = any*;
any             = element | text | doctype | pi | comment;

pi              = DelimitedString('<?', '?>');

doctype         = DelimitedString('<!DOCTYPE', '>');
element         = emptyTag | startTag elementContent* endTag;
elementContent  = element | text | comment | pi;
text            = /[^<]+/;

emptyTag        = lt tagName attr* fwdSlash gt;
startTag        = lt junk? tagName attr* gt;
endTag          = lt fwdSlash tagName gt;

ns              = Word colon;

tagName         = ns? Word;

attr            = attrName eq attrValue;
attrName        = ns? Word;
attrValue       = QuotedString;

eq              = '=';
lt              = '<';
gt              = '>';
fwdSlash        = '/';
colon           = ':';

comment         = Comment;

似乎它应该工作(如果我理解“?”正确,我可能没有)但输出搞砸了。以下是我的测试文件:

<?xml version="1.0" encoding="utf-8"?>
<test cats:dogs="television">
    <peas vegetable="box" >
        <orange />
        <!-- the following makes no sense -->
        <blue lion:mouse="cold"/>
        <red car:desk="apple">
            < envelope></ envelope>
            <![CDATA[lorem ipsum]]>
            <dwarves>
                <dwarf>Sleepy</dwarf>
                <dwarf>Dopey</dwarf>
            </dwarves>
        </red>
    </peas>
</test>

这就是我破坏的语法破坏后的样子(忽略格式化,这是NSXMLDocument的漂亮打印):

<?xml version="1.0" encoding="utf-8"?>
< :cats=dogstest"television">
    < =vegetable"box"peas>
        <>orange</>orange
        <!-- the following makes no sense -->
        < :lion=mouseblue"cold"></>blue
        < :car=deskred"apple">&lt; envelope>&lt;/ envelope> lorem ipsum<>dwarves
                <>dwarfSleepy</>dwarf
                <>dwarfDopey</>dwarf
            </>dwarves
        </>red
    </>peas
</>test

我在解释“?”意思是“可选的”,但我认为这是错误的。我没有在ParseKit grammar guide中找到它。

1 个答案:

答案 0 :(得分:4)

OkudaKit / ParseKit的开发者。我已经修复了导致你遇到问题的根问题。

我的OkudaKit HTML语法不支持CDATA或QNames。我已经在OkudaKit SVN仓库(在主干中)增强了HTML语法。请更新您的工作副本,您将看到修复程序。 HTML语法现在应该满足您的需求(如果您遇到问题,请告诉我)。

要记住的两件最后的事情/伎俩(我忘记了自己):

  1. 您为其定义CSS规则 必须 的Grammar Productions为终端语法制作。

    以下是Teminal Productions的一些例子(暗示:他们没有指出其他非终端制作):

    colon = ':';
    prefix = Word;
    comment = Comment;
    

    这些终端制作:

    qName = qualifiedName | unqualifiedName;
    @start = any*;
    
  2. 所有语法中的终端制作必须在CSS文件中定义了CSS规则。

  3. 您首次尝试修复不起作用的原因是您不遵守上述两条规则。当你不遵循这两个规则时,输出会以奇怪的方式被borked /重新排序。

    非常抱歉,我知道这些信息不包含在OkudaKit的任何地方,所以你无法知道。我会在将来尝试解决这个问题。