2

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

@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 语法指南中找到它。

4

1 回答 1

4

OkudaKit/ParseKit 的开发者在这里。我已经修复了导致您遇到的问题的根本问题。

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

最后要记住的两件事/技巧(我自己忘记了):

  1. 您为其定义 CSS 规则的语法产品必须终端语法产品。

    以下是终端制作的一些示例(提示:它们不指向其他非终端制作):

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

    这些不是终端产品:

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

您第一次尝试修复失败的原因是您没有遵守上述两条规则。当您不遵循这两个规则时,输出会以奇怪的方式变得无聊/重新排序。

非常抱歉,我知道 OkudaKit 的任何地方都不包含此信息,所以你不可能知道。我会在未来尝试解决这个问题。

于 2011-11-04T22:42:06.223 回答